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

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

References #1590: Documentation cleanup

User documentation chapter 10 to 15. Added new chapter about "Item subtypes". Removed sections about protocol types, hardware types and software types. Merged "Hardware" and "Software" into a single chapter.

Added some menu separators in the New annotation type menu.

As usual, screen shots have not yet been updated.

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