source: trunk/www/admin/itemsubtypes/edit_subtype.jsp @ 5908

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

References #1655: GUI improvements

  • File manager dialogs
  • File server edit dialog
  • Changed zoom.gif to png
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.7 KB
Line 
1<%-- $Id: edit_subtype.jsp 5908 2011-12-13 13:48:46Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2011 Nicklas Nordborg
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 3
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 BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22  @author Nicklas
23  @since 2.0
24--%>
25<%@ page pageEncoding="UTF-8" session="false"
26  import="net.sf.basedb.core.SessionControl"
27  import="net.sf.basedb.core.DbControl"
28  import="net.sf.basedb.core.Item"
29  import="net.sf.basedb.core.ItemContext"
30  import="net.sf.basedb.core.Permission"
31  import="net.sf.basedb.core.ItemSubtype"
32  import="net.sf.basedb.core.ItemSubtypeFileType"
33  import="net.sf.basedb.core.PermissionDeniedException"
34  import="net.sf.basedb.core.Metadata"
35  import="net.sf.basedb.core.FileStoreEnabled"
36  import="net.sf.basedb.core.DataFileType"
37  import="net.sf.basedb.core.ItemQuery"
38  import="net.sf.basedb.core.Include"
39  import="net.sf.basedb.core.query.Hql"
40  import="net.sf.basedb.core.query.Orders"
41  import="net.sf.basedb.clients.web.Base"
42  import="net.sf.basedb.clients.web.util.HTML"
43  import="net.sf.basedb.util.Values"
44  import="net.sf.basedb.core.plugin.GuiContext"
45  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
46  import="net.sf.basedb.clients.web.extensions.JspContext"
47  import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
48  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
49  import="java.util.Set"
50  import="java.util.List"
51%>
52<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
53<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
54<%
55final Item itemType = Item.ITEMSUBTYPE;
56final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
57final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
58final int itemId = cc.getId();
59final String ID = sc.getId();
60final float scale = Base.getScale(sc);
61final DbControl dc = sc.newDbControl();
62try
63{
64  String title = null;
65  ItemSubtype subtype = null;
66  ItemQuery<ItemSubtypeFileType> fileTypesQuery = null;
67 
68  if (itemId == 0)
69  {
70    title="Create item subtype";
71    cc.removeObject("item");
72  }
73  else
74  {
75    subtype = ItemSubtype.getById(dc, itemId);
76    cc.setObject("item", subtype);
77    title = "Edit item subtype -- " + HTML.encodeTags(subtype.getName());
78    subtype.checkPermission(Permission.WRITE);
79    fileTypesQuery = subtype.getDataFileTypes();
80  }
81 
82  Set<Item> subtypableItems = Metadata.getSubtypableItems();
83  final String clazz = "class=\"text\"";
84  final String requiredClazz = "class=\"text required\"";
85  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), subtype);
86  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
87  %>
88  <base:page type="popup" title="<%=title%>">
89  <base:head scripts="tabcontrol.js,linkitems.js" styles="tabcontrol.css">
90    <ext:scripts context="<%=jspContext%>" />
91    <ext:stylesheets context="<%=jspContext%>" />
92    <script language="JavaScript">
93    // Validate the "Item subtype" tab
94    function validateItemSubtype()
95    {
96      var frm = document.forms['subtype'];
97      if (Main.trimString(frm.name.value) == '')
98      {
99        alert("You must enter a name");
100        frm.name.focus();
101        return false;
102      }
103      return true;
104    }
105
106    // Submit the form
107    function saveSettings()
108    {
109      var frm = document.forms['subtype'];
110      if (TabControl.validateActiveTab('settings'))
111      {
112        frm.modifiedFileTypes.value = Link.exportModified(frm, 'F', true).join(',');
113        frm.removedFileTypes.value = Link.getActionIds(-1, 'F').join(',');
114        frm.submit();
115      }
116    }
117   
118    function init()
119    {
120      <%
121      if (subtype == null)
122      {
123        %>
124        var frm = document.forms['subtype'];
125        frm.name.focus();
126        frm.name.select();
127        <%
128      }
129      %>
130      initFileTypes();
131      mainItemOnChange();
132    }
133   
134    function initFileTypes()
135    {
136      var frm = document.forms['subtype'];
137      var fileTypes = frm.fileTypes;
138      <%
139      if (fileTypesQuery != null)
140      {
141        fileTypesQuery.include(Include.ALL);
142        fileTypesQuery.order(Orders.asc(Hql.property("itemSubtype.name")));
143        for (ItemSubtypeFileType ft : fileTypesQuery.list(dc))
144        {
145          DataFileType dft = ft.getDataFileType();
146          boolean required = ft.isRequired();
147          boolean multiple = ft.getAllowMultiple();
148          int value = 0;
149          if (required) value += 1;
150          if (multiple) value += 2;
151          %>
152          Link.addNewItem(fileTypes, new Item('F', <%=dft.getId()%>, '<%=HTML.javaScriptEncode(dft.getName())%> <%=required ? "[×]" : "[-]"%>', <%=value%>));
153          <%
154        }
155      }
156      %>
157    }
158   
159    var itemInfo = new Array();
160    <%
161    for (Item item : subtypableItems)
162    {
163      String tmp = "";
164      for (Item related : ItemSubtype.getRelatedItems(item))
165      {
166        tmp += related.name() + ":";
167      }
168      %>
169      var info = new Object();
170      info.value = <%=item.getValue()%>;
171      info.related = '<%=tmp%>';
172      info.fileStoreEnabled = <%=FileStoreEnabled.class.isAssignableFrom(item.getItemClass()) ? "true" : "false"%>;
173      itemInfo['<%=item.name()%>'] = info;
174      <%
175    }
176    %>
177   
178    function getCurrentMainItemType()
179    {
180      var frm = document.forms['subtype'];
181      <%
182      if (subtype != null)
183      {
184        %>
185        var mainType = '<%=subtype.getMainItemType().name()%>';
186        <%
187      }
188      else
189      {
190        %>
191        var mainType = frm.itemType[frm.itemType.selectedIndex].value;
192        <%
193      }
194      %>
195      return mainType;
196    }
197   
198    function mainItemOnChange()
199    {
200      var mainType = getCurrentMainItemType();
201      <%
202      for (Item item : subtypableItems)
203      {
204        %>
205        Main.showHide('section.<%=item.name()%>', itemInfo[mainType].related.indexOf('<%=item.name()%>') >= 0)
206        <%
207      }
208      %>
209      Main.showHide('section.none', itemInfo[mainType].related == '')
210      if (itemInfo[mainType].fileStoreEnabled)
211      {
212        Main.show('filetypes.enabled');
213        Main.hide('filetypes.disabled');
214      }
215      else
216      {
217        Main.show('filetypes.disabled');
218        Main.hide('filetypes.enabled');
219        document.getElementById('filetypes.disabled').innerHTML = 'The selected main item type (' + mainType + ') has not support for attaching data files.';
220      }
221    }
222   
223    var lastList;
224    function relatedItemOnSelect(itemType)
225    {
226      var frm = document.forms['subtype'];
227      lastList = frm['related.'+itemType];
228      var url = 'index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&title=Select+related+subtype&callback=setRelatedCallback';
229      url += '&resetTemporary=1&tmpfilter:INT:itemType=' + itemInfo[itemType].value;
230      if (lastList.length > 1)
231      {
232        var id = Math.abs(parseInt(lastList[1].value));       
233        url += '&item_id='+id;
234      }
235      url += '&exclude=<%=itemId%>';
236      Main.openPopup(url, 'SelectReleatedSubtype', 1000, 700);
237    }
238    function setRelatedCallback(id, name)
239    {
240      var frm = document.forms['subtype'];
241      var list = lastList;
242      if (list.length < 2 || list[1].value == '0') // >
243      {
244        Forms.addListOption(list, 1, new Option());
245      }
246      list[1].value = id;
247      list[1].text = name;
248      list.selectedIndex = 1;
249    }
250    function addFileTypesOnClick()
251    {
252      var frm = document.forms['subtype'];
253      var itemType = getCurrentMainItemType();
254      var ids = Link.getListIds(frm.fileTypes, 'F');
255      var excludes = ids.join(',');
256      var url = '../../admin/datafiletypes/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addFileTypeCallback';
257      url += '&resetTemporary=1&tmpfilter:INT:itemType=' + itemInfo[itemType].value;
258      url += "&exclude="+excludes;
259      Main.openPopup(url, 'AddFileTypes', 1000, 700);
260    }
261    function addFileTypeCallback(fileTypeId, name)
262    {
263      var item = Link.getItem('F', fileTypeId);
264      var frm = document.forms['subtype'];
265      var required = frm.required.checked;
266      var multiple = frm.multiple.checked;
267      var newValue = 0;
268      if (required) newValue += 1;
269      if (multiple) newValue += 2;
270      if (!item) item = new Item('F', fileTypeId, name+(required ? '[×]' : '[-]'), newValue, '');
271      Link.addItem(frm.fileTypes, item);
272    }
273
274    function removeFileTypesOnClick()
275    {
276      Link.removeSelected(document.forms['subtype'].fileTypes);
277    }
278    function fileTypesOnChange()
279    {
280      var frm = document.forms['subtype'];
281      var item = frm.fileTypes[frm.fileTypes.selectedIndex].item;
282      if (item && item.id)
283      {
284        frm.required.checked = (item.value & 1) > 0;
285        frm.multiple.checked = (item.value & 2) > 0;
286      }
287      else
288      {
289        frm.required.checked = false;
290        frm.multiple.checked = false;
291      }
292    }
293
294    function requiredOnClick()
295    {
296      var frm = document.forms['subtype'];
297      var required = frm.required.checked;
298      var multiple = frm.multiple.checked;
299      var newValue = 0;
300      if (required) newValue += 1;
301      if (multiple) newValue += 2;
302      for (var i = 0; i < frm.fileTypes.length; i++)  // >
303      {
304        var option = frm.fileTypes[i];
305        if (option.selected && option.item.id)
306        {
307          option.item.value = newValue;
308          var text = option.text.replace(/\[.*\]/, '['+(required ? '×' : '-') +']');
309          option.text = text;
310        }
311      }
312    }
313    function multipleOnClick()
314    {
315      requiredOnClick();
316    }
317
318    </script>
319  </base:head>
320  <base:body onload="init()">
321    <p>
322    <form action="index.jsp?ID=<%=ID%>" method="post" name="subtype" onsubmit="return false;">
323    <input type="hidden" name="cmd" value="UpdateItem">
324
325    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
326    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*320)+"px;"%>" 
327      position="bottom" remember="<%=subtype != null%>"
328      extensions="<%=invoker%>">
329    <t:tab id="info" title="Item subtype" validate="validateItemSubtype()" helpid="itemsubtype.edit">
330      <table class="form" cellspacing=0>
331      <tr>
332        <td class="prompt">Name</td>
333        <td><input <%=requiredClazz%> type="text" name="name" 
334          value="<%=HTML.encodeTags(subtype == null ? Values.getString(cc.getPropertyValue("name"), "New item subtype") : subtype.getName())%>" 
335          size="40" maxlength="<%=ItemSubtype.MAX_NAME_LENGTH%>"></td>
336      </tr>
337      <tr>
338        <td class="prompt">Main item type</td>
339        <td>
340          <%
341          if (subtype == null)
342          {
343            %>
344            <select name="itemType" class="required unchangeable selectionlist" onchange="mainItemOnChange()">
345            <%
346            int itemCode = Values.getInt(cc.getPropertyValue("itemType"), -1);
347            for (Item item : subtypableItems)
348            {
349              String selected = itemCode == item.getValue() ? "selected" : "";
350              %>
351              <option value="<%=item.name()%>" <%=selected%>><%=item.toString() %>
352              <%
353            }
354            %>
355            </select>
356            <%
357          }
358          else
359          {
360            %>
361            <%=subtype.getMainItemType() %>
362            <%
363          }
364          %>
365        </td>
366      </tr>
367      <tr >
368        <td class="prompt">Description</td>
369        <td nowrap>
370          <textarea <%=clazz%> rows="4" cols="40" name="description" 
371            ><%=HTML.encodeTags(subtype == null ? cc.getPropertyValue("description") : subtype.getDescription())%></textarea>
372          <a href="javascript:Main.zoom('Description', 'subtype', 'description')"
373            title="Edit in larger window"><base:icon image="zoom.png" /></a>
374        </td>
375      </tr>
376      <tr>
377        <td class="prompt">Related subtypes</td>
378        <td><div id="section.none" style="display: none;"><i>- none -</i></div></td>
379      </tr>
380      <%
381      for (Item item : subtypableItems)
382      {
383        %>
384        <tr id="section.<%=item.name()%>" style="display: none;">
385          <td class="subprompt"><%=item%></td>
386          <td>
387            <base:select 
388              id="<%="related."+item.name()%>" 
389              current="<%=subtype == null ? null : subtype.getRelatedSubtype(item) %>"
390              onselect="<%="relatedItemOnSelect('" + item.name() + "')"%>"
391              newitem="<%=subtype == null%>"
392              clazz="selectionlist"
393            />
394          </td>
395        </tr>
396        <%
397      }
398      %>
399      </table>
400      <div align=right>&nbsp;<i><base:icon image="required.gif" /> = required information</i></div>
401    </t:tab>
402    <t:tab
403      id="filetypes"
404      title="File types"
405      helpid="itemsubtype.filetypes">
406      <div id="filetypes.enabled">
407      <table class="form" cellspacing=0>
408      <tr >
409        <td class="prompt">File types</td>
410        <td>
411          <table border="0" cellspacing="0" cellpadding="0">
412          <tr >
413          <td>
414            <select name="fileTypes" size="10" multiple style="width: 20em;" 
415              onchange="fileTypesOnChange()">
416            </select>
417            <input type="hidden" name="modifiedFileTypes" value="">
418            <input type="hidden" name="removedFileTypes" value="">
419          </td>
420          <td>
421            <table border="0">
422            <tr><td width="150"><base:button 
423              clazz="leftaligned buttonclass"
424              onclick="addFileTypesOnClick()" 
425              title="Add file types&hellip;" 
426              tooltip="Add file types"
427              /></td></tr>
428            <tr><td width="150"><base:button 
429              clazz="leftaligned buttonclass"
430              onclick="removeFileTypesOnClick()" 
431              title="Remove" 
432              tooltip="Remove the selected file types"
433            /></td></tr>
434            </table>
435          <input type="checkbox" id="required" name="required" value="1" onchange="requiredOnClick()">
436            <label for="required">Required</label><br>
437          <input type="checkbox" id="multiple" name="multiple" value="1" onchange="multipleOnClick()">
438            <label for="multiple">Allow multiple files</label>
439          </td>
440          </tr>
441          </table>
442        </td>
443      </tr>
444      </table>
445      </div>
446      <div id="filetypes.disabled" style="display: none;">
447     
448      </div>
449    </t:tab>
450    </t:tabcontrol>
451
452    <table align="center">
453    <tr>
454      <td width="50%"><base:button onclick="saveSettings()" title="Save" /></td>
455      <td width="50%"><base:button onclick="window.close()" title="Cancel" /></td>
456    </tr>
457    </table>
458    </form>
459  </base:body>
460  </base:page>
461  <%
462}
463finally
464{
465  if (dc != null) dc.close();
466}
467%>
Note: See TracBrowser for help on using the repository browser.