source: trunk/www/common/plugin/configure.jsp @ 5960

Last change on this file since 5960 was 5960, checked in by Nicklas Nordborg, 10 years ago

References #1655: GUI improvements

  • Icon sizes to 16x16
  • Catch 'missing image' event and display an error image instead for menu item and buttons.
  • Incorrectly wrapped <form> in plug-installation wizard (caused it to not display in IE).
  • Minor adjustments for displaying tables in different base font sizes.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 40.8 KB
Line 
1<%-- $Id: configure.jsp 5960 2012-02-15 10:00:03Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Johan Enell, Jari Häkkinen, Nicklas Nordborg, Gregory Vincic
5  Copyright (C) 2007 Johan Enell, Nicklas Nordborg
6
7  This file is part of BASE - BioArray Software Environment.
8  Available at http://base.thep.lu.se/
9
10  BASE is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License
12  as published by the Free Software Foundation; either version 3
13  of the License, or (at your option) any later version.
14
15  BASE is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with BASE. If not, see <http://www.gnu.org/licenses/>.
22  ------------------------------------------------------------------
23
24  @author Nicklas
25  @version 2.0
26--%>
27<%@page import="net.sf.basedb.util.error.ThrowableUtil"%>
28<%@ page pageEncoding="UTF-8" session="false"
29  import="net.sf.basedb.core.SessionControl"
30  import="net.sf.basedb.core.DbControl"
31  import="net.sf.basedb.core.BasicItem"
32  import="net.sf.basedb.core.Permission"
33  import="net.sf.basedb.core.Item"
34  import="net.sf.basedb.core.File"
35  import="net.sf.basedb.core.Nameable"
36  import="net.sf.basedb.core.Job"
37  import="net.sf.basedb.core.PluginDefinition"
38  import="net.sf.basedb.core.PluginConfiguration"
39  import="net.sf.basedb.core.PluginConfigurationRequest"
40  import="net.sf.basedb.core.RequestInformation"
41  import="net.sf.basedb.core.PluginParameter"
42  import="net.sf.basedb.core.Type"
43  import="net.sf.basedb.core.ParameterType"
44  import="net.sf.basedb.core.StringParameterType"
45  import="net.sf.basedb.core.IntegerParameterType"
46  import="net.sf.basedb.core.LongParameterType"
47  import="net.sf.basedb.core.FloatParameterType"
48  import="net.sf.basedb.core.DoubleParameterType"
49  import="net.sf.basedb.core.ItemParameterType"
50  import="net.sf.basedb.core.DateParameterType"
51  import="net.sf.basedb.core.TimestampParameterType"
52  import="net.sf.basedb.core.BooleanParameterType"
53  import="net.sf.basedb.core.FileParameterType"
54  import="net.sf.basedb.core.PathParameterType"
55  import="net.sf.basedb.core.ItemContext"
56  import="net.sf.basedb.core.Path"
57  import="net.sf.basedb.util.Enumeration"
58  import="net.sf.basedb.plugins.util.Parameters"
59  import="net.sf.basedb.clients.web.Base"
60  import="net.sf.basedb.clients.web.WebException"
61  import="net.sf.basedb.clients.web.util.HTML"
62  import="net.sf.basedb.util.formatter.Formatter"
63  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
64  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
65  import="net.sf.basedb.util.Values"
66  import="java.util.Date"
67  import="java.util.List"
68  import="java.util.Arrays"
69  import="java.util.Collections"
70%>
71<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
72<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
73<%
74final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
75final String ID = sc.getId();
76final float scale = Base.getScale(sc);
77final String clazz = "class=\"text\"";
78final String requiredClazz = "class=\"text required\"";
79
80final Item itemType = request.getParameter("item_type") == null ? null : Item.valueOf(request.getParameter("item_type"));
81final String subContext = Values.getString(request.getParameter("subcontext"), "");
82final ItemContext currentContext = itemType == null ? null : sc.getCurrentContext(itemType, subContext);
83DbControl dc = null;
84try
85{
86  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
87  String dateFormat = FormatterSettings.getDateFormat(sc);
88  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
89  String htmlDateFormat = HTML.encodeTags(dateFormat);
90  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
91  String dateTimeFormat = FormatterSettings.getDateTimeFormat(sc);
92  String jsDateTimeFormat = HTML.javaScriptEncode(dateTimeFormat);
93  String htmlDateTimeFormat = HTML.encodeTags(dateTimeFormat);
94
95  dc = sc.newDbControl();
96  PluginConfigurationRequest pcRequest = (PluginConfigurationRequest)sc.getSessionSetting("plugin.configure.request");
97  if (pcRequest == null) throw new WebException("popup", "No request information found", "No request information found");
98 
99  PluginDefinition plugin = (PluginDefinition)sc.getSessionSetting("plugin.configure.plugin");
100  Job job = (Job)sc.getSessionSetting("plugin.configure.job");
101  dc.reattachItem(plugin, false);
102  boolean configureByExample = false;
103  PluginConfiguration pluginConfig = (PluginConfiguration)sc.getSessionSetting("plugin.configure.config");
104  String errorMessage = (String)sc.getSessionSetting("plugin.configure.errors.message");
105  List<Throwable> errors = (List<Throwable>)sc.getSessionSetting("plugin.configure.errors.list");
106 
107  RequestInformation ri = pcRequest.getRequestInformation();
108  List<PluginParameter<?>> parameters =  ri.getParameters();
109  String title = HTML.encodeTags(ri.getTitle());
110  String jobName = Values.getString(request.getParameter("job_name"), title);
111  StringBuilder sb = new StringBuilder();
112  String helpText = ri.getDescription();
113  if (helpText == null && pluginConfig != null) helpText = pluginConfig.getDescription();
114  if (helpText == null) helpText = plugin.getDescription();
115  List<File> recentFiles = null;
116  %>
117  <base:page type="popup" title="<%=title%>">
118  <base:head scripts="plugin.js,parameters.js,ajax.js,json2.js" styles="parameters.css">
119    <script language="JavaScript">
120    function init()
121    {
122      <%
123      if (parameters != null && parameters.size() > 0)
124      {
125        for (PluginParameter<?> param : parameters)
126        {
127          ParameterType pType = param.getParameterType();
128          String name = param.getName();
129          if ("parserSection".equals(name)) 
130          {
131            configureByExample = plugin.supports("net.sf.basedb.util.parser.ConfigureByExample");
132          }
133          String label = HTML.encodeTags(Values.trimString(param.getLabel(), 30));
134          String fullLabel = HTML.encodeTags(param.getLabel());
135          if (pType != null)
136          {
137            // Get the current values... First we look in the http request object...
138            String[] requestValues = request.getParameterValues("parameter:"+param.getName());
139            // ...or in the current values from the job / plugin configuration
140            List values = requestValues != null ? Arrays.asList(requestValues) : pcRequest.getCurrentParameterValues(param.getName());
141            // File parameters should also check the auto-detected-file (if not enumeration)
142            if ((values == null || values.size() == 0) && !pType.isEnumeration() && 
143              pType instanceof FileParameterType)
144            {
145              if (currentContext != null && currentContext.getObject("auto-detected-file") != null)
146              {
147                values =  Collections.singletonList(currentContext.getObject("auto-detected-file"));
148                currentContext.setObject("auto-detected-file", null);
149              }
150            }
151            // Then, we check the parameters default value
152            if ((values == null || values.size() == 0) && param.getDefaultValue() != null)
153            {
154              values = Collections.singletonList(param.getDefaultValue());
155            }
156            // Item and File parameters will also look in the current context unless they are enumerated
157            if ((values == null || values.size() == 0) && 
158              !pType.isEnumeration() &&
159              (pType instanceof ItemParameterType || pType instanceof FileParameterType))
160            {
161              Item parameterItemType = Item.fromClass(pType.getParameterClass());
162              ItemContext cc = sc.getCurrentContext(parameterItemType, parameterItemType == itemType ? subContext : "");
163              if (cc.getId() != 0 && pType.getMultiplicity() == 1)
164              {
165                values = new java.util.ArrayList();
166                if (pType instanceof FileParameterType)
167                {
168                  try
169                  {
170                    values.add(File.getById(dc, cc.getId()).getPath().toString());
171                  }
172                  catch (Throwable t)
173                  {}
174                  if (currentContext != null && recentFiles == null)
175                  {
176                    recentFiles = (List<File>)currentContext.getRecent(dc, Item.FILE);
177                  }
178                }
179                else
180                {
181                  values.add(cc.getId());
182                }
183              }
184              else if (cc.getSelected().size() > 0 && pType.getMultiplicity() != 1)
185              {
186                values = new java.util.ArrayList(cc.getSelected());
187              }
188            }
189            // Finally, if the parameter has multiplicity=1, is requried and has a list of enumeration values
190            if ((values == null || values.size() == 0) && pType.getNotNull() && 
191              pType.getMultiplicity() == 1 && pType.getItems() != null && pType.getItems().size() > 0)
192            {
193              values = Collections.singletonList(pType.getItems().get(0)); 
194            }
195            %>
196            var values = new Array();
197            <%
198            int numNotNullValues = 0;
199            if (values != null && values.size() > 0)
200            {
201              for (Object value : values)
202              {
203                if (value instanceof Date) 
204                {
205                  if (pType.isEnumeration())
206                  {
207                    value = ((Date)value).getTime();
208                  }
209                  else
210                  {
211                    if (pType.getValueType() == Type.TIMESTAMP)
212                    {
213                      value = dateTimeFormatter.format((Date)value);
214                    }
215                    else
216                    {
217                      value = dateFormatter.format((Date)value);
218                    }
219                  }
220                }
221                else if (value instanceof File && pType instanceof FileParameterType)
222                {
223                  File file = File.getById(dc, ((File)value).getId());
224                  value = file.getPath().toString();
225                }
226                else if (value instanceof BasicItem)
227                {
228                  value = ((BasicItem)value).getId();
229                }
230                if (value != null)
231                {
232                  numNotNullValues++;
233                  %>
234                  values[values.length] = '<%=HTML.javaScriptEncode(value.toString())%>';
235                  <%
236                }
237              }
238            }
239            %>
240            new Parameter('<%=name%>', '<%=HTML.javaScriptEncode(param.getLabel())%>', <%=pType.getMultiplicity()%>, <%=pType.isEnumeration()%>, <%=pType.getNotNull()%>, values);
241            <%
242            String icon = "";
243            if (numNotNullValues > 0)
244            {
245              icon = pType.getNotNull() ? "required_values.gif" : "notrequired_values.gif";
246            }
247            else
248            {
249              icon = pType.getNotNull() ? "required_novalues.gif" : "notrequired_novalues.gif";
250            }
251            if (!param.isHidden())
252            {
253              icon = "<span class=\"icon\"><img id=\"icon_"+name+"\" src=\"../../images/"+icon+"\"></span>";
254              sb.append("<div class=\"param\" id=\"prompt_"+name+"\" onclick=\"parametersOnClick('"+name+"')\">");
255              sb.append(icon+"<span class=\"label\">"+fullLabel+"</span></div>\n");
256            }
257          }
258          else
259          {
260            sb.append("<div class=\"section\" id=\"prompt_"+name+"\" onclick=\"parametersOnClick('"+name+"')\">"+fullLabel+"</div>");
261            %>
262            new Parameter('<%=name%>', '[<%=HTML.javaScriptEncode(param.getLabel())%>]', 1, 0, 0, {});
263            <%
264          }
265        }
266      }
267      %>
268    }
269   
270    var oldValueDiv;
271    function parametersOnClick(parameterId)
272    {
273      var frm = document.forms['configure'];
274      if (oldValueDiv) Main.hide(oldValueDiv);
275     
276      var pp = Parameters.allParameters['ID'+parameterId];
277      setSelectedParameter(pp, parameterId);
278      oldValueDiv = 'value_'+pp.name+'_div'
279      Main.show(oldValueDiv);
280      var valueElement = frm['value_'+pp.name];
281      if (valueElement.focus && !valueElement.disabled) valueElement.focus();
282      if (pp.enumeration)
283      {
284        Main.hide('valuecontainer');
285        var numSelected;
286        if (valueElement.type && valueElement.type.search('select') != -1)
287        {
288          numSelected = Forms.selectListOptions(valueElement, pp.values);
289        }
290        else if (pp.multiplicity == 1)
291        {
292          // radio buttons
293          numSelected = Forms.checkRadio(valueElement, pp.values[0]) == -1 ? 0 : 1;
294        }
295        else
296        {
297          // check boxes
298          numSelected = Forms.checkCheckBoxes(valueElement, pp.values);
299        }
300        if (numSelected == 0)
301        {
302          pp.values.length = 0;
303          updateSelectedStyle();
304        }
305      }
306      else if (pp.multiplicity == 1)
307      {
308        Main.hide('valuecontainer');
309        var currentValue = pp.values.length > 0 ? pp.values[0] : '';
310        if (valueElement.length) // ie. radio buttons for boolean parameter
311        {
312          Forms.checkRadio(valueElement, currentValue);
313        }
314        else if (!valueElement.disabled)
315        {
316          valueElement.value = currentValue;
317        }
318      }
319      else
320      {
321        var values = frm.values;
322        values.length = 0;
323        for (var i = 0; i < pp.values.length; i++) // >
324        {
325          var value = Main.cutString(pp.values[i].replace(/\n/g, ' '), 40);
326          values[values.length] = new Option(value);
327        }
328        var mult = document.getElementById('multiplicity');
329        mult.innerHTML = pp.multiplicity == 0 ? '' : '(Max '+pp.multiplicity+' values)';
330        Main.show('valuecontainer');
331      }
332    }
333   
334    var selectedPluginParameter = null;
335    var selectedPluginParameterId = null;
336    function getSelectedParameter()
337    {
338      return selectedPluginParameter;
339    }
340   
341    function setSelectedParameter(pluginParameter, parameterId)
342    {
343      if (selectedPluginParameter != null)
344      {
345        Main.removeClass(document.getElementById('prompt_'+selectedPluginParameter.name), 'selected');
346      }
347      selectedPluginParameter = pluginParameter;
348      selectedPluginParameterId = parameterId;
349      if (selectedPluginParameter != null)
350      {
351        Main.addClass(document.getElementById('prompt_'+selectedPluginParameter.name), 'selected');
352      }
353    }
354
355    function updateStyle(pp)
356    {
357      var icon = document.getElementById('icon_'+pp.name);
358      var gif = getRoot()+'images/';
359      if (pp.values.length == 0)
360      {
361        gif += pp.required ? 'required_novalues.gif' : 'notrequired_novalues.gif';
362      }
363      else
364      {
365        gif += pp.required ? 'required_values.gif' : 'notrequired_values.gif';
366      }
367      icon.src = gif;
368    }
369
370    function updateSelectedStyle()
371    {
372      updateStyle(getSelectedParameter());
373    }
374   
375    function setCurrentValue(value)
376    {
377      var pp = getSelectedParameter();
378      if (value == null || value == '')
379      {
380        pp.removeValue(0);
381      }
382      else
383      {
384        pp.updateValue(0, value);
385      }
386      updateSelectedStyle();
387    }
388   
389    function setEnumValues(inputName)
390    {
391      var pp = getSelectedParameter();
392      if (!pp) return;
393   
394      var frm = document.forms['configure'];
395      var valueElement = frm[inputName];
396      var values = new Array();
397      for (var i = 0; i < valueElement.length; i++) // >
398      {
399        if (valueElement[i].checked || valueElement[i].selected)
400        {
401          values[values.length] = valueElement[i].value;
402        }
403      }
404      pp.setValues(values);
405      updateSelectedStyle();
406    }
407
408    var lastValueIndex = -1;
409    function valuesOnClick()
410    {
411      var frm = document.forms['configure'];
412      var pp = getSelectedParameter();
413      lastValueIndex = frm.values.selectedIndex;
414      if (lastValueIndex >= 0)
415      {
416        frm['value_'+pp.name].value = pp.values[lastValueIndex];
417      }
418    }
419
420    function valueOnBlur(value)
421    {
422      var pp = getSelectedParameter();
423      if (!pp) return;
424      if (pp.multiplicity == 1)
425      {
426        setCurrentValue(value);
427      }
428      else
429      {
430        if (lastValueIndex < 0) return; // >
431        var frm = document.forms['configure'];
432        if (value == '' || value == null)
433        {
434          pp.removeValue(lastValueIndex);
435          frm.values[lastValueIndex] = null;
436        }
437        else
438        {
439          pp.updateValue(lastValueIndex, value);
440          frm.values[lastValueIndex].text = value;
441        }
442      }
443    }
444    function addOnClick()
445    {
446      var pp = getSelectedParameter();
447      if (!pp) return;
448      var frm = document.forms['configure'];
449      var valueElement = frm['value_'+pp.name];
450      if (frm.values.selectedIndex < 0 && valueElement.value != '') // >
451      {
452        if (pp.addValue(valueElement.value))
453        {
454          lastValueIndex = frm.values.length;
455          frm.values[lastValueIndex] = new Option(valueElement.value, '', false, false);
456          valueElement.value = '';
457          lastValueIndex = -1;
458        }
459      }
460      else
461      {
462        if (pp.addValue(''))
463        {
464          lastValueIndex = frm.values.length;
465          frm.values[lastValueIndex] = new Option('<new>', '', false, true);
466          valueElement.value = '';
467        }
468      }
469      valueElement.focus();
470      updateSelectedStyle();
471    }
472    function removeOnClick()
473    {
474      var pp = getSelectedParameter();
475      if (!pp) return;
476     
477      var frm = document.forms['configure'];
478      var values = frm.values;
479      for (var i = 0; i < values.length; i++) // >
480      {
481        if (values[i].selected)
482        {
483          pp.removeValue(i);
484          values[i] = null;
485          i--;
486        }
487      }
488      updateSelectedStyle();
489    }
490   
491    function selectAll(inputName)
492    {
493      var frm = document.forms['configure'];
494      var list = frm[inputName];
495      if (list.length == 0) return;
496      var select = !list[0].selected;;
497      for (var i = 0; i < list.length; i++)
498      {
499        list[i].selected = select;
500      }
501      setEnumValues(inputName);
502    }
503   
504    function setDateCallback(frmName, inputName, theDate)
505    {
506      var frm = document.forms[frmName];
507      frm[inputName].value = theDate;
508      valueOnBlur(theDate);
509    }
510    var lastFileInputName;
511    function browseOnClick(inputName)
512    {
513      var frm = document.forms['configure'];
514      var url = '../../filemanager/index.jsp?ID=<%=ID%>&cmd=SelectOne&callback=setFileCallback';
515      lastFileInputName = inputName;
516      Main.openPopup(url, 'SelectFile', 1050, 700);
517    }
518    function setFileCallback(fileId, path, inputName)
519    {
520      var frm = document.forms['configure'];
521      if (!inputName) inputName = lastFileInputName;
522      frm[inputName].value = path;
523      valueOnBlur(path);
524      if (Parameters.allParameters['ID<%=Parameters.CHARSET_PARAMETER%>']) updateCharset(fileId);
525    }
526    function updateCharset(fileId)
527    {
528      var request = Ajax.getXmlHttpRequest();
529      if (request != null)
530      {
531        var url = '../../filemanager/files/ajax.jsp?ID=<%=ID%>&cmd=GetFileInfo&item_id=' + fileId;
532        request.open("GET", url, true);
533        Ajax.setReadyStateHandler(request, updateCharsetCallback);
534        request.send(null);
535      }
536      return request != null;
537    }
538    function updateCharsetCallback(request)
539    {
540      var response = Ajax.parseJsonResponse(request.responseText);
541      var charset = response.characterSet;
542      if (charset)
543      {
544        setParameterValue('<%=Parameters.CHARSET_PARAMETER%>', charset);
545      }
546    }
547    function recentOnChange(inputName)
548    {
549      var frm = document.forms['configure'];
550      var recentList = frm['recent.'+inputName];
551      var path = recentList[recentList.selectedIndex].text;
552      var fileId = recentList[recentList.selectedIndex].value;
553      setFileCallback(fileId, path, inputName);
554      recentList.selectedIndex = 0;
555    }
556   
557    var lastItemInputName;
558    function selectItemOnClick(inputName, itemType)
559    {
560      lastItemInputName = inputName;
561      Main.selectItem('<%=ID%>', itemType, 'selectone', 'selectItemCallback');
562    }
563    function selectItemCallback(itemId, name)
564    {
565      var frm = document.forms['configure'];
566      frm[lastItemInputName].value = name;
567      setCurrentValue(itemId);
568    }
569    function clearItemOnClick(inputName, itemType)
570    {
571      var frm = document.forms['configure'];
572      frm[inputName].value = '';
573      setCurrentValue();
574    }
575   
576    function saveAsOnClick(inputName)
577    {
578      var frm = document.forms['configure'];
579      var url = '../../filemanager/index.jsp?ID=<%=ID%>&cmd=SaveAs&callback=saveAsCallback';
580      lastFileInputName = inputName;
581      var i = frm[inputName].value.lastIndexOf('/');
582      if (i >= 0)
583      {
584        url += '&fileName=' + encodeURIComponent(frm[inputName].value.substring(i+1));
585      }
586      Main.openPopup(url, 'SaveAs', 1050, 700);
587    }
588    function saveAsCallback(path)
589    {
590      var frm = document.forms['configure'];
591      frm[lastFileInputName].value = path;
592      valueOnBlur(path);
593    }
594    function selectDirectoryOnClick(inputName)
595    {
596      var frm = document.forms['configure'];
597      var url = '../../filemanager/directories/index.jsp?ID=<%=ID%>&mode=selectonedirectory&callback=setFileCallback';
598      lastFileInputName = inputName;
599      Main.openPopup(url, 'SelectDirectory', 350, 500);
600    }
601   
602    function hideErrorList()
603    {
604      Main.hide('errorlist');
605      Main.show('showerrorlist');
606    }
607    function showErrorList()
608    {
609      Main.show('errorlist');
610      Main.hide('showerrorlist');
611    }
612    function toggleStacktrace(index)
613    {
614      Main.showHide('stacktrace.' + index);
615      var img = document.getElementById('stacktracelink.'+index).firstChild;
616      if (img.src.indexOf('gonext') > 0)
617      {
618        img.src = getRoot() + '/images/move_down.png';
619      }
620      else
621      {
622        img.src = getRoot() + '/images/gonext.png';
623      }
624    }
625    function saveSettings()
626    {
627      var frm = document.forms['configure'];
628      for (var i = 0; i < Parameters.allParameters.length; i++) // > 
629      {
630        var pp = Parameters.allParameters[i];
631        if (pp.required && pp.values.length == 0)
632        {
633          alert('No value entered for parameter '+pp.label);
634          return;
635        }
636      }
637      Parameters.addParameterValuesToForm(frm);
638      //Main.openPopup('', 'SubmitPluginParameters', 100, 100);
639      //frm.target = 'SubmitPluginParameters';
640      frm.submit();
641    }
642   
643    function doCancel()
644    {
645      location = 'index.jsp?ID=<%=ID%>&cmd=CancelWizard';
646    }
647   
648    function testWithFile()
649    {
650      Main.openPopup('test_with_file.jsp?ID=<%=ID%>', 'TestWithFile', 1050, 700);
651    }
652   
653    function getParameterValue(ID)
654    {
655      var param = Parameters.allParameters['ID'+ID];
656      if (param)
657      {
658        return param.values;
659      }
660      else
661      {
662        return '';
663      }
664    }
665   
666    function setParameterValue(ID, value)
667    {
668      var param = Parameters.allParameters['ID'+ID];
669      if (param)
670      {
671        if (value == null || Main.trimString(value) == '')
672        {
673          param.clearValues();
674        }
675        else
676        {
677          var values = new Array();
678          values[values.length] = value;
679          param.setValues(values);
680        }
681        var selected = getSelectedParameter();
682        if (selected && selected.name == param.name)
683        {
684          parametersOnClick(param.name);
685        }
686        updateStyle(param);
687      }
688    }
689    </script>
690  </base:head>
691  <base:body onload="init()">
692    <h1><%=title%> <base:help 
693      helpid="<%="runplugin.configure"+(job != null ? "." + plugin.getMainType().name().toLowerCase() : "") %>" /></h1>
694
695    <form action="index.jsp?ID=<%=ID%>" method="post" name="configure" onsubmit="return false;">
696    <input type="hidden" name="cmd" value="SetParameters">
697    <input type="hidden" name="title" value="<%=title%>">
698    <input type="hidden" name="requestId" value="<%=request.getParameter("requestId")%>">
699    <%
700    if (itemType != null)
701    {
702      %>
703      <input type="hidden" name="item_type" value="<%=itemType.name()%>">
704      <%
705    }
706    %>
707    <input type="hidden" name="subcontext" value="<%=subContext%>">
708   
709    <div class="content bottomborder">
710
711      <div class="absolutefull filled" style="height: 4.5em;">
712        <table style="height: 100%; margin:auto;"><tr><td style="padding: 3px;">
713        <b>
714          <%=plugin == null ? "" : HTML.encodeTags(plugin.getName())%>
715          <%=pluginConfig == null ? "" : "(" + HTML.encodeTags(pluginConfig.getName()) + ")"%>
716        </b><br>
717        <%=HTML.niceFormat(helpText)%>
718        </td></tr></table>
719      </div>
720     
721      <div class="absolutefull topborder" style="top: 4.5em;">
722        <div class="absolutefull filled rightborder" style="width: 18em;">
723          <div class="absolutefull parameterlist" style="bottom: 2em;">
724          <%=sb.toString()%>
725          </div>
726       
727          <div class="absolutefull topborder" style="top: auto; bottom: 0px; height: 2em;">
728            <table style="height: 100%; margin:auto;"><tr><td>
729            <base:icon image="hasvalues.gif" />= has value(s), <base:icon image="required.png" />= required
730            </td></tr></table>
731          </div>
732        </div>
733       
734        <div class="absolutefull input100" style="left: 18em; padding: 8px;">
735          <%
736          if (errorMessage != null || (errors != null && errors.size() > 0))
737          {
738            %>
739            <div id="errors" style="margin-bottom: 12px;">
740              <div class="messagecontainer error" style="margin: 0px;">
741              <%=errorMessage %>
742             
743              <%
744              if (errors != null && errors.size() > 0)
745              {
746                %>
747                <div id="showerrorlist">
748                  <base:icon image="gonext.png" 
749                    onclick="showErrorList()" 
750                    style="color: #FFFFFF;"
751                    tooltip="Show more information about each error"
752                  />
753                </div>
754                <div id="errorlist" style="display: none; margin: 0px;">
755                  <base:icon image="move_down.png" 
756                    onclick="hideErrorList()" 
757                    style="color: #FFFFFF;" 
758                    tooltip="Show less information"
759                  />
760                <ol>
761                <%
762                int i = 0;
763                for (Throwable t : errors)
764                {
765                  ++i;
766                  %>
767                  <li><%=t.getMessage()%>
768                    <base:icon 
769                      image="gonext.png" 
770                      onclick="<%="toggleStacktrace(" + i + ")"%>" 
771                      tooltip="Toggle display of detailed stacktrace"
772                      id="<%="stacktracelink." + i %>"
773                    />
774                    <div id="stacktrace.<%=i%>" class="stacktrace" 
775                      style="display:none; height: 15em;"><%=ThrowableUtil.stackTraceToString(t)%></div>
776                    <%
777                  }
778                  %>
779                </ol>
780                </div>
781                <%
782              }
783              %>
784            </div>
785            </div>
786            <%
787          }
788          %>
789       
790          <div id="valuecontainer" style="display: none;">
791          <table cellspacing="2" border="0" cellpadding="0" cellspacing="0">
792            <tr >
793            <td>
794              <b>Values</b> <span id="multiplicity"></span><br>
795              <select name="values" size="5" style="width: 20em;"
796                onchange="valuesOnClick()" multiple>
797              </select>
798            </td>
799            <td>&nbsp;</td>
800            <td>
801            <td>
802              <br>
803              <base:button onclick="addOnClick()" title="Add" />
804              <base:button onclick="removeOnClick()" title="Remove" />
805            </td>
806          </table>
807          </div>
808
809          <%
810          if (parameters != null && parameters.size() > 0)
811          {
812            for (PluginParameter<?> param : parameters)
813            {
814              if (!param.isHidden())
815              {
816                ParameterType pType = param.getParameterType();
817                String inputName = "value_"+param.getName();
818                if (pType != null)
819                {
820                  int multiplicity = pType.getMultiplicity();
821                  String select = null;
822                  if (multiplicity == 0)
823                  {
824                    if (pType.getNotNull())
825                    {
826                      select = "Select one or more";
827                    }
828                    else
829                    {
830                      select = "Select zero or more";
831                    }
832                  }
833                  else if (multiplicity == 1)
834                  {
835                    select = "Select one";
836                  }
837                  else
838                  {
839                    if (pType.getNotNull())
840                    {
841                      select = "Select 1 -- " + multiplicity;
842                    }
843                    else
844                    {
845                      select = "Select 0 -- " + multiplicity;
846                    }
847                  }
848                  %>
849                  <div id="<%=inputName%>_div" style="display: none;">
850                  <%
851                  if (pType.isEnumeration())
852                  {
853                    Enumeration<?, String> enumeration = pType.getEnumeration();
854                    List<?> values = pType.getItems();
855                    %>
856                    <b><%=HTML.encodeTags(param.getLabel())%></b> (<%=select%>)
857                    <%
858                    if (multiplicity != 1)
859                    {
860                      %>
861                      <base:icon image="check_uncheck.png" 
862                        tooltip="Select/deselect all" onclick="<%="selectAll('" + inputName + "')"%>"/>
863                      <%
864                    }
865                    %>
866                    <br>
867                    <%
868                    if (multiplicity == 1)
869                    {
870                      %>
871                      <select name="<%=inputName%>"
872                        onchange="setCurrentValue(this[this.selectedIndex].value)">
873                      <%
874                      if (!pType.getNotNull())
875                      {
876                        %>
877                        <option value="" style="font-style: italic;">- not specified -
878                        <%
879                      }
880                    }
881                    else
882                    {
883                      %>
884                      <select name="<%=inputName%>" multiple size="10" style="width: 30em;"
885                        onchange="setEnumValues('<%=inputName%>')">
886                      <%
887                    }
888                    for (int i = 0; i < values.size(); ++i)
889                    {
890                      Object value;
891                      String listValue = "";
892                      String listText = "";
893                      String listTitle = "";
894                      if (enumeration != null)
895                      {
896                        value = enumeration.getKey(i);
897                        listText = HTML.encodeTags(enumeration.getValue(i));
898                      }
899                      else
900                      {
901                        value = values.get(i);
902                      }
903                      if (value instanceof Date) 
904                      {
905                        listValue = Long.toString(((Date)value).getTime());
906                        if (enumeration == null) 
907                        {
908                          if (pType.getValueType() == Type.TIMESTAMP)
909                          {
910                            listText = dateTimeFormatter.format((Date)value);
911                          }
912                          else
913                          {
914                            listText = dateFormatter.format((Date)value);
915                          }
916                        }
917                      }
918                      else if (value instanceof BasicItem)
919                      {
920                        BasicItem item = (BasicItem)value;
921                        listValue = Integer.toString(item.getId());
922                        if (item instanceof Nameable)
923                        {
924                          Nameable nameable = (Nameable)item;
925                          if (enumeration == null) listText = HTML.encodeTags(nameable.getName());
926                          listTitle = HTML.encodeTags(nameable.getDescription());
927                        }
928                        else
929                        {
930                          if (enumeration == null) listText = HTML.encodeTags(item.toString());
931                        }
932                      }
933                      else
934                      {
935                        listValue = HTML.encodeTags(value == null ? "" : value.toString());
936                        if (enumeration == null) listText = listValue;
937                      }
938                      %>
939                      <option value="<%=listValue%>" title="<%=listTitle%>"><%=listText%>
940                      <%
941                    }
942                    %>
943                    </select>
944                    <%
945                  }
946                  else if (pType instanceof StringParameterType)
947                  {
948                    Integer maxLength = ((StringParameterType)pType).getMaxLength();
949                    int height = pType.getHeight() <= 0 ? 6 : pType.getHeight();
950                    if (height > 20) height = 20;
951                    if (maxLength == null || maxLength > 255)
952                    {
953                      %>
954                      <b><%=HTML.encodeTags(param.getLabel())%></b> (Text)<br>
955                      <table style="width: 100%;">
956                      <tr>
957                        <td>
958                        <textarea <%=pType.getNotNull() ? requiredClazz : clazz%> 
959                          name="<%=inputName%>" rows="<%=height%>" 
960                          onblur="valueOnBlur(this.value)"></textarea>
961                        </td>
962                        <td style="width: 20px;">
963                          <base:icon image="zoom.png" 
964                            onclick="<%="Main.zoom('" + HTML.javaScriptEncode(param.getLabel()) +"', 'configure', '" + inputName + "')"%>"
965                            tooltip="Edit in larger window"
966                          />
967                        </td>
968                      </tr>
969                      </table>
970                      <%
971                    }
972                    else
973                    {
974                      %>
975                      <b><%=HTML.encodeTags(param.getLabel())%></b> (String)<br>
976                      <input <%=pType.getNotNull() ? requiredClazz : clazz%> type="text" 
977                        name="<%=inputName%>" value=""
978                        maxlength="<%=maxLength%>"
979                        onblur="valueOnBlur(this.value)">
980                      <%
981                    }
982                  }
983                  else if (pType instanceof IntegerParameterType)
984                  {
985                    IntegerParameterType ipType = (IntegerParameterType)pType;
986                    Integer minValue = ipType.getLowerLimit();
987                    Integer maxValue = ipType.getUpperLimit();
988                    String minMax = "";
989                    if (minValue != null && maxValue != null)
990                    {
991                      minMax = ": " + minValue + " -- " +maxValue;
992                    }
993                    else if (minValue != null)
994                    {
995                      minMax = " >= "+minValue;
996                    }
997                    else if (maxValue != null)
998                    {
999                      minMax = " <= "+maxValue;
1000                    }
1001                    %>
1002                    <b><%=HTML.encodeTags(param.getLabel())%></b> (Integer<%=minMax%>)<br>
1003                    <input <%=pType.getNotNull() ? requiredClazz : clazz%>
1004                      type="text" name="<%=inputName%>" value=""
1005                      maxlength="20" onkeypress="return Numbers.integerOnly(event)"
1006                      onblur="valueOnBlur(this.value)">
1007                    <%
1008                  }
1009                  else if (pType instanceof LongParameterType)
1010                  {
1011                    LongParameterType ipType = (LongParameterType)pType;
1012                    Long minValue = ipType.getLowerLimit();
1013                    Long maxValue = ipType.getUpperLimit();
1014                    String minMax = "";
1015                    if (minValue != null && maxValue != null)
1016                    {
1017                      minMax = ": " + minValue + " -- " +maxValue;
1018                    }
1019                    else if (minValue != null)
1020                    {
1021                      minMax = " >= "+minValue;
1022                    }
1023                    else if (maxValue != null)
1024                    {
1025                      minMax = " <= "+maxValue;
1026                    }
1027                    %>
1028                    <b><%=HTML.encodeTags(param.getLabel())%></b> (Long<%=minMax%>)<br>
1029                    <input <%=pType.getNotNull() ? requiredClazz : clazz%>
1030                      type="text" name="<%=inputName%>" value=""
1031                      maxlength="20" onkeypress="return Numbers.integerOnly(event)"
1032                      onblur="valueOnBlur(this.value)">
1033                    <%
1034                  }
1035                  else if (pType instanceof FloatParameterType)
1036                  {
1037                    FloatParameterType ipType = (FloatParameterType)pType;
1038                    Float minValue = ipType.getLowerLimit();
1039                    Float maxValue = ipType.getUpperLimit();
1040                    String minMax = "";
1041                    if (minValue != null && maxValue != null)
1042                    {
1043                      minMax = ": " + minValue + " -- " +maxValue;
1044                    }
1045                    else if (minValue != null)
1046                    {
1047                      minMax = " >= "+minValue;
1048                    }
1049                    else if (maxValue != null)
1050                    {
1051                      minMax = " <= "+maxValue;
1052                    }
1053                    %>
1054                    <b><%=HTML.encodeTags(param.getLabel())%></b> (Float<%=minMax%>)<br>
1055                    <input <%=pType.getNotNull() ? requiredClazz : clazz%>
1056                      type="text" name="<%=inputName%>" value=""
1057                      maxlength="20" onkeypress="return Numbers.numberOnly(event)"
1058                      onblur="valueOnBlur(this.value)">
1059                    <%
1060                  }
1061                  else if (pType instanceof DoubleParameterType)
1062                  {
1063                    DoubleParameterType ipType = (DoubleParameterType)pType;
1064                    Double minValue = ipType.getLowerLimit();
1065                    Double maxValue = ipType.getUpperLimit();
1066                    String minMax = "";
1067                    if (minValue != null && maxValue != null)
1068                    {
1069                      minMax = ": " + minValue + " -- " +maxValue;
1070                    }
1071                    else if (minValue != null)
1072                    {
1073                      minMax = " >= "+minValue;
1074                    }
1075                    else if (maxValue != null)
1076                    {
1077                      minMax = " <= "+maxValue;
1078                    }
1079                    %>
1080                    <b><%=HTML.encodeTags(param.getLabel())%></b> (Double<%=minMax%>)<br>
1081                    <input <%=pType.getNotNull() ? requiredClazz : clazz%>
1082                      type="text" name="<%=inputName%>" value=""
1083                      maxlength="20" onkeypress="return Numbers.numberOnly(event)"
1084                      onblur="valueOnBlur(this.value)">
1085                    <%
1086                  }
1087                  else if (pType instanceof DateParameterType)
1088                  {
1089                    %>
1090                    <table>
1091                    <tr>
1092                    <td>
1093                      <b><%=HTML.encodeTags(param.getLabel())%></b> (Date)<br>
1094                      <input <%=pType.getNotNull() ? requiredClazz : clazz%>
1095                        type="text" name="<%=inputName%>" value=""
1096                        size="20" maxlength="20" title="Enter date in format: <%=htmlDateFormat%>"
1097                        onblur="valueOnBlur(this.value)">
1098                    </td>
1099                    <td>
1100                      <br>
1101                      <base:button 
1102                        onclick="<%="Dates.selectDate('Value', 'configure', '"+inputName+"', 'setDateCallback', '"+jsDateFormat+"')"%>" 
1103                        image="calendar.png"
1104                        title="Calendar&hellip;" 
1105                        tooltip="Select a date from a calendar" 
1106                      />
1107                    </td>
1108                    </tr>
1109                    </table>
1110                    <%
1111                  }
1112                  else if (pType instanceof TimestampParameterType)
1113                  {
1114                    %>
1115                    <table>
1116                    <tr>
1117                    <td>
1118                      <b><%=HTML.encodeTags(param.getLabel())%></b> (Timestamp)<br>
1119                      <input <%=pType.getNotNull() ? requiredClazz : clazz%>
1120                        type="text" name="<%=inputName%>" value=""
1121                        size="20" maxlength="20" title="Enter timestamp in format: <%=htmlDateTimeFormat%>"
1122                        onblur="valueOnBlur(this.value)">
1123                    </td>
1124                    <td>
1125                      <br>
1126                      <base:button 
1127                        onclick="<%="Dates.selectDateTime('Value', 'configure', '"+inputName+"', 'setDateCallback', '"+jsDateTimeFormat+"')"%>" 
1128                        image="calendar.png"
1129                        title="Calendar&hellip;" 
1130                        tooltip="Select a timestamp from a calendar" 
1131                      />
1132                    </td>
1133                    </tr>
1134                    </table>
1135                    <%
1136                  }
1137                  else if (pType instanceof BooleanParameterType)
1138                  {
1139                    %>
1140                    <b><%=HTML.encodeTags(param.getLabel())%></b><br>
1141                    <input type="radio" name="<%=inputName%>" id="<%=inputName%>.null" value="" checked
1142                      onclick="setCurrentValue(null)"><label for="<%=inputName%>.null"><i>- not specified -</i></label><br>
1143                    <input type="radio" name="<%=inputName%>" id="<%=inputName%>.true" value="true" 
1144                      onclick="setCurrentValue('true')"><label for="<%=inputName%>.true">true</label><br>
1145                    <input type="radio" name="<%=inputName%>" id="<%=inputName%>.false" value="false" 
1146                      onclick="setCurrentValue('false')"><label for="<%=inputName%>.false">false</label>
1147                    <%
1148                  }
1149                  else if (pType instanceof FileParameterType)
1150                  {
1151                    %>
1152                    <b><%=HTML.encodeTags(param.getLabel())%></b><br>
1153                    <table style="width: 100%;">
1154                    <tr>
1155                    <td style="width: 98%;"><input <%=pType.getNotNull() ? requiredClazz : clazz%> type="text" 
1156                      name="<%=inputName%>" value=""
1157                      onblur="valueOnBlur(this.value)">&nbsp;</td>
1158                    <td><base:button 
1159                        title="Browse&hellip;"
1160                        onclick="<%="browseOnClick('"+inputName+"')"%>"
1161                        />
1162                    </td>
1163                    </tr>
1164                    </table>
1165                    <%
1166                    if (recentFiles != null && recentFiles.size() > 0)
1167                    {
1168                      %>
1169                      <b>Recently used</b><br>
1170                      <select name="recent.<%=inputName%>" onchange="recentOnChange('<%=inputName%>')">
1171                      <option value="">
1172                      <%
1173                      for (File recent : recentFiles)
1174                      {
1175                        %>
1176                        <option value="<%=recent.getId()%>"><%=HTML.encodeTags(recent.getPath().toString())%>
1177                        <%
1178                      }
1179                      %>
1180                      </select>
1181                      <%
1182                    }
1183                  }
1184                  else if (pType instanceof ItemParameterType)
1185                  {
1186                    Item parameterItemType = Item.fromClass(pType.getParameterClass());
1187                    BasicItem item = (BasicItem)pcRequest.getCurrentParameterValue(param.getName());
1188                    if (item == null)
1189                    {
1190                      ItemContext cc = sc.getCurrentContext(parameterItemType, parameterItemType == itemType ? subContext : "");
1191                      if (cc.getId() != 0)
1192                      {
1193                        try
1194                        {
1195                          item = parameterItemType.getById(dc, cc.getId());
1196                        }
1197                        catch (Throwable t)
1198                        {}
1199                      }
1200                    }
1201                    if (item != null)
1202                    {
1203                      String display = "";
1204                      if (item instanceof Nameable)
1205                      {
1206                        Nameable nameable = (Nameable)item;
1207                        display = nameable.getName();
1208                      }
1209                      else 
1210                      {
1211                        display = item.toString();
1212                      }
1213                      %>
1214                      <b><%=HTML.encodeTags(param.getLabel())%></b><br>
1215                      <table border="0" cellspacing="2" cellpadding="0">
1216                      <tr>
1217                      <td><input class="text disabled" size="50" 
1218                        name="<%=inputName%>" type="text" disabled
1219                        value="<%=HTML.encodeTags(display)%>"></td>
1220                      <td><base:button title="Select&hellip;"
1221                          onclick="<%="selectItemOnClick('"+inputName+"', '" + parameterItemType.name() + "')"%>"
1222                          visible="false" /></td>
1223                      <td><base:button title="Clear"
1224                          onclick="<%="clearItemOnClick('"+inputName+"', '" + parameterItemType.name() + "')"%>"
1225                          visible="false" /></td>
1226                      </tr>
1227                      </table>
1228                      <%
1229                    }
1230                  }
1231                  else if (pType instanceof PathParameterType)
1232                  {
1233                    PathParameterType ppType = (PathParameterType)pType;
1234                    String browse = "";
1235                    if (ppType.getPathType() == Path.Type.FILE)
1236                    {
1237                      browse = "saveAsOnClick('" + inputName + "')";
1238                    }
1239                    else
1240                    {
1241                      browse = "selectDirectoryOnClick('" + inputName + "')";
1242                    }
1243                    %>
1244                    <b><%=HTML.encodeTags(param.getLabel())%></b><br>
1245                    <table style="width: 100%;">
1246                    <tr>
1247                    <td style="width: 98%;">
1248                      <input type="text" class="text" name="<%=inputName%>" value=""
1249                        onblur="valueOnBlur(this.value)">&nbsp;</td>
1250                    <td><base:button 
1251                        title="Browse&hellip;"
1252                        onclick="<%=browse%>"
1253                        />
1254                    </td>
1255                    </tr>
1256                    </table>
1257                    <%
1258                  }
1259                  else
1260                  {
1261                    %>
1262                    <b><%=HTML.encodeTags(param.getLabel())%></b><br>
1263                    <%
1264                  }
1265                  %>
1266                  <div class="messagecontainer help" style="margin-left: 0px; margin-right: 0px;">
1267                  <%=HTML.niceFormat(param.getDescription())%>
1268                  </div>
1269                  </div>
1270                  <%
1271                }
1272                else
1273                {
1274                  %>
1275                  <div id="<%=inputName%>_div" style="display: none;" class="messagecontainer help">
1276                  <%=HTML.niceFormat(param.getDescription())%>
1277                  </div>
1278                  <%
1279                }
1280              }
1281            }
1282          }
1283          %>
1284       
1285        </div>
1286       
1287      </div>
1288
1289    </div>
1290
1291    </form>
1292
1293    <base:buttongroup subclass="dialogbuttons">
1294      <base:button onclick="testWithFile()" title="Test with file&hellip;" image="file.png"
1295        tooltip="Use an uploaded file to create the regular expressions and column mappings"
1296        visible="<%=configureByExample%>" />
1297      <base:button onclick="saveSettings()" title="Next" />
1298      <base:button onclick="doCancel()" title="Cancel" />
1299    </base:buttongroup>
1300  </base:body>
1301  </base:page>
1302  <%
1303}
1304finally
1305{
1306  if (dc != null) dc.close();
1307}
1308%>
Note: See TracBrowser for help on using the repository browser.