source: trunk/www/filemanager/upload/select.jsp @ 3206

Last change on this file since 3206 was 3206, checked in by Martin Svensson, 15 years ago

Fixes #529 Add link to helptext in 'upload new file' pop-up

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 15.6 KB
Line 
1<%-- $Id: select.jsp 3206 2007-03-23 10:36:24Z martin $
2  ------------------------------------------------------------------
3  Copyright (C) Authors contributing to this file.
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 2
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330,
21  Boston, MA  02111-1307, USA.
22  ------------------------------------------------------------------
23
24
25  @author Nicklas
26  @version 2.0
27--%>
28<%@ page session="false"
29  import="net.sf.basedb.core.SessionControl"
30  import="net.sf.basedb.core.DbControl"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.SystemItems"
33  import="net.sf.basedb.core.ItemContext"
34  import="net.sf.basedb.core.Permission"
35  import="net.sf.basedb.core.Directory"
36  import="net.sf.basedb.core.File"
37  import="net.sf.basedb.core.FileType"
38  import="net.sf.basedb.core.PluginDefinition"
39  import="net.sf.basedb.core.Include"
40  import="net.sf.basedb.core.ItemQuery"
41  import="net.sf.basedb.core.ItemResultList"
42  import="net.sf.basedb.core.PermissionDeniedException"
43  import="net.sf.basedb.core.BaseException"
44  import="net.sf.basedb.core.query.Orders"
45  import="net.sf.basedb.core.query.Hql"
46  import="net.sf.basedb.util.zip.FileUnpacker"
47  import="net.sf.basedb.clients.web.Base"
48  import="net.sf.basedb.clients.web.util.HTML"
49  import="net.sf.basedb.util.Values"
50  import="java.util.List"
51  import="java.util.Set"
52  import="java.util.HashSet"
53%>
54<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
55<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
56<%
57final Item itemType = Item.FILE;
58final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
59final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
60final int itemId = cc.getId();
61final String ID = sc.getId();
62final float scale = Base.getScale(sc);
63final DbControl dc = sc.newDbControl();
64try
65{
66  String title = null;
67  File file = null;
68  Directory directory = null;
69  boolean readCurrentFileType = true;
70  int currentFileTypeId = 0;
71
72  if (itemId == 0)
73  {
74    title = "Upload new file";
75    currentFileTypeId = Values.getInt(cc.getPropertyValue("fileType"), 0);
76    if (currentFileTypeId == 0)
77    {
78      currentFileTypeId = Values.getInt(cc.getRecent(Item.FILETYPE.name(), 0), 0);
79    }
80    directory = Directory.getById(dc, Values.getInt(request.getParameter("directory_id"), SystemItems.getId(Directory.ROOT)));
81    cc.removeObject("item");
82  }
83  else
84  {
85    file = File.getById(dc, itemId);
86    directory = file.getDirectory();
87    cc.setObject("item", file);
88    title = "Upload again -- " + HTML.encodeTags(file.getName());
89    try
90    {
91      FileType ft = file.getFileType();
92      if (ft != null) currentFileTypeId = ft.getId();
93    }
94    catch (PermissionDeniedException ex)
95    {
96      readCurrentFileType = false;
97    }
98  }
99  if (file != null && !file.hasPermission(Permission.WRITE))
100  {
101    throw new PermissionDeniedException(Permission.WRITE, itemType.toString());
102  }
103 
104  // Query to retrieve file types
105  final ItemQuery<FileType> fileTypeQuery = FileType.getQuery();
106  fileTypeQuery.order(Orders.asc(Hql.property("name")));
107  fileTypeQuery.setCacheResult(true);
108 
109  // Query to retreive FileUnpacker plugins
110  final ItemQuery<PluginDefinition> pluginQuery = PluginDefinition.getQuery(null, "net.sf.basedb.util.zip.FileUnpacker");
111  pluginQuery.order(Orders.asc(Hql.property("name")));
112  pluginQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
113  List<PluginDefinition> plugins = pluginQuery.list(dc);
114
115  final String clazz = "class=\"text\"";
116  final String requiredClazz = "class=\"text required\"";
117  %>
118  <base:page type="popup" title="<%=title%>">
119  <base:head scripts="tabcontrol.js,ajax.js" styles="tabcontrol.css,progressbar.css">
120    <script language="JavaScript">
121    // Validate the "File" tab
122    function validateFile()
123    {
124      var frm = document.forms['file'];
125      if (Main.trimString(frm.the_file.value) == '')
126      {
127        alert("You must select a file to upload");
128        frm.the_file.focus();
129        return false;
130      }
131      return true;
132    }
133
134    // Submit the form
135    function doUpload()
136    {
137      var frm = document.forms['file'];
138      if (TabControl.validateActiveTab('settings'))
139      {
140        // Copy form values so they are sent BEFORE the file
141        frm.check_md5.value = frm.temp_check_md5 && frm.temp_check_md5.checked ? "1" : "0";
142        if (frm.temp_zip_format)
143        {
144          frm.zip_format.value = frm.temp_zip_format[frm.temp_zip_format.selectedIndex].value;
145          frm.zip_unpack.value = frm.temp_zip_unpack.checked ? "1" : "0";
146          frm.zip_overwrite.value = frm.temp_zip_overwrite.checked ? "1" : "0";
147          frm.zip_keep.value = frm.temp_zip_keep.checked ? "1" : "0";
148        }
149        frm.filetype_id.value = frm.temp_filetype_id[frm.temp_filetype_id.selectedIndex].value;
150        frm.description.value = frm.temp_description.value;
151        frm.submit();
152        Main.hide('selectForm');
153        Main.show('progressForm');
154        if (!sendProgressUpdateWithAjax())
155        {
156          window.top.frames['progress'].location.href = 'progress.jsp?ID=<%=ID%>';
157        }
158      }
159    }
160   
161    function sendProgressUpdateWithAjax()
162    {
163      var request = Ajax.getXmlHttpRequest();
164      if (request != null)
165      {
166        var url = 'progress.jsp?ID=<%=ID%>&ajax=1&'+Math.random();
167        request.open("GET", url, true);
168        Ajax.setReadyStateHandler(request, updateProgressWithAjax);
169        request.send(null);
170      }
171      return request != null;
172    }
173   
174    function updateProgressWithAjax(request)
175    {
176      var response = request.responseText.split(':');
177      //alert(response[0]+':'+response[1]+':'+response[2]+':'+response[3]+':'+response[4]+':'+response[5]);
178      displayProgress(response[0],response[1],response[2],response[3],response[4],response.slice(5).join(':'));
179      setTimeout('sendProgressUpdateWithAjax()', 1500);
180    }
181   
182    function abortUpload()
183    {
184      if (confirm('Are you sure you want to abort the upload? It cannot be resumed.'))
185      {
186        window.top.frames['progress'].location.href = 'progress.jsp?ID=<%=ID%>&abort=1';
187      }
188    }
189   
190    function fileOnChange()
191    {
192      var frm = document.forms['file'];
193      var filename = frm.the_file.value;
194      var isZip = false;
195      var zipIndex = 0;
196      var dotIndex = filename.lastIndexOf('.');
197      if (dotIndex != -1)
198      {
199        var ext = filename.substr(dotIndex+1);
200        var zf = allExtensions[ext];
201        if (zf)
202        {
203          isZip = true;
204          zipIndex = zf.index;
205        }
206      }
207      if (frm.temp_zip_format)
208      {
209        frm['temp_zip_format'].disabled = !isZip;
210        frm['temp_zip_format'].selectedIndex = zipIndex;
211        frm['temp_zip_unpack'].disabled = !isZip;
212        frm['temp_zip_overwrite'].disabled = !isZip || !frm['temp_zip_unpack'].checked;
213        frm['temp_zip_keep'].disabled = !isZip || !frm['temp_zip_unpack'].checked;
214      }
215    }
216    function unpackZipOnClick()
217    {
218      var frm = document.forms['file'];
219      var checked = frm['temp_zip_unpack'].checked;
220      if (!checked) frm['temp_zip_keep'].checked = true;
221      frm['temp_zip_overwrite'].disabled = !checked;
222      frm['temp_zip_keep'].disabled = !checked;
223    }
224   
225    function initZipFormats()
226    {
227      var frm = document.forms['file'];
228      var zipFormat = frm.temp_zip_format;
229      if (zipFormat)
230      {
231      <%
232      for (PluginDefinition plugin : plugins)
233      {
234        FileUnpacker unpacker = plugin.newInstance(FileUnpacker.class, null, sc, null, null);
235        %>
236          var extensions = [ '<%=Values.getString(unpacker.getExtensions(), "','", true)%>' ];
237          var zf = new ZipFormat(zipFormat.length, <%=plugin.getId()%>, '<%=HTML.javaScriptEncode(unpacker.getFormatName())%>', extensions);
238          zipFormat[zipFormat.length] = new Option(zf.toString(), zf.id);
239        <%
240      }
241      %>
242      }
243    }
244   
245    function displayProgress(fileName, transferredBytes, totalBytes, transferTime, remainTime, unpackMessage)
246    {
247      // File name
248      document.getElementById('fileName').innerHTML = 'Uploading ' + fileName + '...';
249       
250      // Percent done
251      var percentDone = totalBytes == 0 ? 0 : Math.round(100 * transferredBytes / totalBytes);
252      document.getElementById('percent').innerHTML = '&nbsp;' + percentDone+'%';
253      var doneElement = document.getElementById('percentDone');
254      doneElement.style.width = percentDone+'%';
255      var remainElement = document.getElementById('percentRemain');
256      remainElement.style.width = (100-percentDone)+'%';
257      if (percentDone == 100) Main.hide('percentRemain');
258     
259      // Bytes
260      document.getElementById('transferredBytes').innerHTML = Numbers.formatBytes(transferredBytes);
261      document.getElementById('totalBytes').innerHTML = Numbers.formatBytes(totalBytes);
262
263      // Times and rate
264      var transferRate = transferTime == 0 ? 0 : transferredBytes / transferTime;
265      document.getElementById('transferTime').innerHTML = Numbers.formatSeconds(transferTime);
266      document.getElementById('transferRate').innerHTML = '(' + Numbers.formatBytes(transferRate) + '/s)';
267      document.getElementById('remainTime').innerHTML = Numbers.formatSeconds(remainTime) + ' (estimated)';
268     
269      // Message
270      if (unpackMessage)
271      {
272        document.getElementById('unpackMessage').innerHTML = unpackMessage.replace(/(.*):(.*)/, '<b>$1:</b> $2');
273      }
274    }
275   
276    var allZipFormats = new Array();
277    var allExtensions = new Array();
278    function ZipFormat(index, id, name, extensions)
279    {
280      this.index = index;
281      this.id = id;
282      this.name = name;
283      this.extensions = extensions;
284     
285      allZipFormats[allZipFormats] = this;
286      // Map extension to ZipFormat object
287      if (extensions && extensions.length)
288      {
289        for (var i = 0; i < extensions.length; i++)
290        {
291          var ext = extensions[i];
292          if (!allExtensions[ext]) allExtensions[ext] = this;
293        }
294      }
295     
296      this.matchesExtension = function(filename)
297      {
298        var dotIndex = filename.lastIndexOf('.');
299        if (dotIndex != -1)
300        {
301          var ext = filename.substr(dotIndex+1);
302          for (var i = 0; i < this.extensions.length; i++)
303          {
304            if (ext == this.extensions[i]) return true;
305          }
306        }
307        return false;
308      }
309     
310      this.toString = function()
311      {
312        var s = this.name + " [";
313        for (var i = 0; i < this.extensions.length; i++)
314        {
315          if (i > 0) s += ', ';
316          s += '*.' + this.extensions[i];
317        }
318        s += ']';
319        return s;
320      }
321    }
322   
323    </script>
324  </base:head>
325  <base:body onload="initZipFormats()">
326  <p>
327  <div id="selectForm">
328    <form action="upload.jsp?ID=<%=ID%>&directory_id=<%=directory.getId()%>" 
329      method="post" name="file" enctype="multipart/form-data" onsubmit="return false;" target="upload">
330
331    <input type="hidden" name="check_md5" value="0">
332    <input type="hidden" name="zip_format" value="">
333    <input type="hidden" name="zip_unpack" value="0">
334    <input type="hidden" name="zip_overwrite" value="0">
335    <input type="hidden" name="zip_keep" value="1">
336    <input type="hidden" name="filetype_id" value="">
337    <input type="hidden" name="description" value="">
338
339    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
340    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*340)+"px;"%>" 
341      position="bottom" remember="false">
342    <t:tab id="info" title="File" validate="validateFile()" helpid="file.upload">
343      <table class="form" cellspacing=0>
344      <tr>
345        <td class="prompt">Directory</td>
346        <td><%=HTML.encodeTags(directory.getPath().toString())%></td>
347      </tr>
348      <tr>
349        <td class="prompt">File</td>
350        <td>
351          <input <%=requiredClazz%> type="file" name="the_file" size="50"
352            onchange="fileOnChange()">
353        </td>
354      </tr>
355      <%
356      if (file != null)
357      {
358        %>
359        <tr>
360          <td class="prompt">Validate MD5</td>
361          <td><input type="checkbox" name="temp_check_md5"></td>
362        </tr>
363        <%
364      }
365      %>
366      <tr valign="top">
367        <td class="prompt">Type</td>
368        <td colspan="2">
369          <select name="temp_filetype_id" <%=!readCurrentFileType ? "disabled readonly class=\"disabled\"" : ""%>>
370          <%
371          if (!readCurrentFileType)
372          {
373            %>
374            <option value="-1">- denied -
375            <%
376          }
377          else
378          {
379            %>
380            <option value="0">- none -
381            <%
382            ItemResultList<FileType> fileTypes = fileTypeQuery.list(dc);
383            for (FileType fileType : fileTypes)
384            {
385              int id = fileType.getId();
386              boolean current = id == currentFileTypeId;
387              %>
388              <option 
389                value="<%=current && file != null ? -id : id%>" 
390                <%=current ? "selected" : ""%>
391                ><%=HTML.encodeTags(fileType.getName())%>
392              <%
393            }
394          }
395          %>
396          </select>
397        </td>
398      </tr>
399
400      <tr valign=top>
401        <td class="prompt">Description</td>
402        <td nowrap>
403          <textarea <%=clazz%> rows="4" cols="50" name="temp_description" wrap="virtual"
404            ><%=HTML.encodeTags(file == null ? cc.getPropertyValue("description") : file.getDescription())%></textarea>
405          <a href="javascript:Main.zoom('Description', 'file', 'temp_description')"
406            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
407        </td>
408      </tr>
409     
410      <tr valign=top>
411        <td class="prompt">Max trans-<br>fer rate</td>
412        <td nowrap>
413          <%
414          long maxTransferRate = Values.getInt(sc.getClientDefaultSetting("server.transferRate"), 0);
415          %>
416          <%=maxTransferRate == 0 ? "unlimited" : Values.formatBytes(maxTransferRate)+"/s (approx.)"%>
417        </td>
418      </tr>
419     
420      <%
421      if (file == null)
422      {
423        %>
424        <tr valign=top>
425          <td class="prompt">Compressed file</td>
426          <td>
427            <select name="temp_zip_format" disabled>
428              <option>
429            </select><br>
430         
431            <input type="checkbox" name="temp_zip_unpack" disabled
432              onclick="unpackZipOnClick()"><a 
433              href="javascript:document.forms['file'].temp_zip_unpack.click()">Unpack file</a><br>
434            <input type="checkbox" name="temp_zip_overwrite" disabled
435              ><a 
436              href="javascript:document.forms['file'].temp_zip_overwrite.click()">Overwrite existing files</a><br>
437            <input type="checkbox" name="temp_zip_keep" disabled checked
438              ><a 
439              href="javascript:document.forms['file'].temp_zip_keep.click()">Keep the compressed file</a><br>
440          </td>
441        </tr>
442        <%
443      }
444      %>
445     
446      </table>
447      <div align=right>&nbsp;<i><base:icon image="required.gif" /> = required information</i></div>
448    </t:tab>
449
450    </t:tabcontrol>
451
452    <table align="center">
453    <tr>
454      <td width="50%"><base:button image="upload.gif" onclick="doUpload()" title="Upload" /></td>
455      <td width="50%"><base:button onclick="top.window.close()" title="Cancel" /></td>
456    </tr>
457    </table>
458    </form>
459  </div>
460 
461  <div id="progressForm" style="display:none;">
462    <h3 class="docked" id="fileName">Preparing file upload...</h3>
463    <div class="boxed" style="background: #E0E0E0">
464      <br>
465      <table width="90%" border=0 cellspacing=0 cellpadding=0 align="center">
466      <tr>
467      <td width="90%" >
468        <table width="100%" class="progressbar" border=0 cellspacing=0 cellpadding=0>
469        <tr>
470          <td width="0%" class="done" id="percentDone">&nbsp;</td>
471          <td width="100%" class="remain" id="percentRemain">&nbsp;</td>
472        </tr>
473        </table>
474      </td>
475        <td width="10%" id="percent">&nbsp;0%</td>
476      </tr>
477      <tr>
478        <td colspan="2">
479          <b>Transferred:</b> <span id="transferredBytes">0 bytes</span> of <span id="totalBytes">unknown</span><br>
480          <b>Time:</b> <span id="transferTime">0s</span> <span id="transferRate"></span><br>
481          <b>Remain:</b> <span id="remainTime">unknown</span><br>
482          <span id="unpackMessage"></span>
483        </td>
484      </tr>
485      </table>
486      <br>
487    </div>
488    <br>
489    <table align="center">
490    <tr>
491      <td><base:button image="cancel.gif" onclick="abortUpload()" title="Abort..." /></td>
492    </tr>
493    </table>
494 
495  </div>
496  </base:body>
497  </base:page>
498  <%
499}
500finally
501{
502  if (dc != null) dc.close();
503}
504%>
Note: See TracBrowser for help on using the repository browser.