www/admin/itemsubtypes/edit_subtype.jsp

Code
Comments
Other
Rev Date Author Line
5630 13 May 11 nicklas 1 <%-- $Id$
5630 13 May 11 nicklas 2   ------------------------------------------------------------------
5630 13 May 11 nicklas 3   Copyright (C) 2011 Nicklas Nordborg
5630 13 May 11 nicklas 4
5630 13 May 11 nicklas 5   This file is part of BASE - BioArray Software Environment.
5630 13 May 11 nicklas 6   Available at http://base.thep.lu.se/
5630 13 May 11 nicklas 7
5630 13 May 11 nicklas 8   BASE is free software; you can redistribute it and/or
5630 13 May 11 nicklas 9   modify it under the terms of the GNU General Public License
5630 13 May 11 nicklas 10   as published by the Free Software Foundation; either version 3
5630 13 May 11 nicklas 11   of the License, or (at your option) any later version.
5630 13 May 11 nicklas 12
5630 13 May 11 nicklas 13   BASE is distributed in the hope that it will be useful,
5630 13 May 11 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
5630 13 May 11 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5630 13 May 11 nicklas 16   GNU General Public License for more details.
5630 13 May 11 nicklas 17
5630 13 May 11 nicklas 18   You should have received a copy of the GNU General Public License
5630 13 May 11 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5630 13 May 11 nicklas 20   ------------------------------------------------------------------
5630 13 May 11 nicklas 21
5630 13 May 11 nicklas 22   @author Nicklas
5630 13 May 11 nicklas 23   @since 2.0
5630 13 May 11 nicklas 24 --%>
5630 13 May 11 nicklas 25 <%@ page pageEncoding="UTF-8" session="false"
5630 13 May 11 nicklas 26   import="net.sf.basedb.core.SessionControl"
5630 13 May 11 nicklas 27   import="net.sf.basedb.core.DbControl"
5630 13 May 11 nicklas 28   import="net.sf.basedb.core.Item"
5630 13 May 11 nicklas 29   import="net.sf.basedb.core.ItemContext"
5630 13 May 11 nicklas 30   import="net.sf.basedb.core.Permission"
5630 13 May 11 nicklas 31   import="net.sf.basedb.core.ItemSubtype"
5713 02 Sep 11 nicklas 32   import="net.sf.basedb.core.ItemSubtypeFileType"
5630 13 May 11 nicklas 33   import="net.sf.basedb.core.PermissionDeniedException"
5630 13 May 11 nicklas 34   import="net.sf.basedb.core.Metadata"
5698 15 Aug 11 nicklas 35   import="net.sf.basedb.core.FileStoreEnabled"
5698 15 Aug 11 nicklas 36   import="net.sf.basedb.core.DataFileType"
5698 15 Aug 11 nicklas 37   import="net.sf.basedb.core.ItemQuery"
5698 15 Aug 11 nicklas 38   import="net.sf.basedb.core.Include"
5698 15 Aug 11 nicklas 39   import="net.sf.basedb.core.query.Hql"
5698 15 Aug 11 nicklas 40   import="net.sf.basedb.core.query.Orders"
5630 13 May 11 nicklas 41   import="net.sf.basedb.clients.web.Base"
5630 13 May 11 nicklas 42   import="net.sf.basedb.clients.web.util.HTML"
5630 13 May 11 nicklas 43   import="net.sf.basedb.util.Values"
6300 19 Jun 13 nicklas 44   import="net.sf.basedb.util.json.JsonConverter"
6300 19 Jun 13 nicklas 45   import="net.sf.basedb.util.json.JsonUtil"
5630 13 May 11 nicklas 46   import="net.sf.basedb.core.plugin.GuiContext"
5630 13 May 11 nicklas 47   import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
5630 13 May 11 nicklas 48   import="net.sf.basedb.clients.web.extensions.JspContext"
5630 13 May 11 nicklas 49   import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
7604 25 Feb 19 nicklas 50   import="net.sf.basedb.clients.web.extensions.tabcontrol.TabAction"
5630 13 May 11 nicklas 51   import="net.sf.basedb.util.extensions.ExtensionsInvoker"
5630 13 May 11 nicklas 52   import="java.util.Set"
5630 13 May 11 nicklas 53   import="java.util.List"
6300 19 Jun 13 nicklas 54   import="org.json.simple.JSONArray"
6300 19 Jun 13 nicklas 55   import="org.json.simple.JSONObject"
5630 13 May 11 nicklas 56 %>
5630 13 May 11 nicklas 57 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
5630 13 May 11 nicklas 58 <%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
6149 25 Sep 12 nicklas 59 <%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
5630 13 May 11 nicklas 60 <%
5630 13 May 11 nicklas 61 final Item itemType = Item.ITEMSUBTYPE;
5630 13 May 11 nicklas 62 final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
5630 13 May 11 nicklas 63 final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
5630 13 May 11 nicklas 64 final int itemId = cc.getId();
5630 13 May 11 nicklas 65 final String ID = sc.getId();
5630 13 May 11 nicklas 66 final float scale = Base.getScale(sc);
7954 12 May 21 nicklas 67 final DbControl dc = sc.newDbControl(":Edit "+itemType);
5630 13 May 11 nicklas 68 try
5630 13 May 11 nicklas 69 {
5630 13 May 11 nicklas 70   String title = null;
5630 13 May 11 nicklas 71   ItemSubtype subtype = null;
5713 02 Sep 11 nicklas 72   ItemQuery<ItemSubtypeFileType> fileTypesQuery = null;
5698 15 Aug 11 nicklas 73   
5630 13 May 11 nicklas 74   if (itemId == 0)
5630 13 May 11 nicklas 75   {
5630 13 May 11 nicklas 76     title="Create item subtype";
5630 13 May 11 nicklas 77     cc.removeObject("item");
5630 13 May 11 nicklas 78   }
5630 13 May 11 nicklas 79   else
5630 13 May 11 nicklas 80   {
5630 13 May 11 nicklas 81     subtype = ItemSubtype.getById(dc, itemId);
5630 13 May 11 nicklas 82     cc.setObject("item", subtype);
5630 13 May 11 nicklas 83     title = "Edit item subtype -- " + HTML.encodeTags(subtype.getName());
5630 13 May 11 nicklas 84     subtype.checkPermission(Permission.WRITE);
5698 15 Aug 11 nicklas 85     fileTypesQuery = subtype.getDataFileTypes();
5630 13 May 11 nicklas 86   }
5630 13 May 11 nicklas 87   
6300 19 Jun 13 nicklas 88   JSONObject jsonFileTypes = new JSONObject();
6300 19 Jun 13 nicklas 89   jsonFileTypes.put("itemType", "DATAFILETYPE");
6217 14 Dec 12 nicklas 90   
6300 19 Jun 13 nicklas 91   if (fileTypesQuery != null)
6300 19 Jun 13 nicklas 92   {
6300 19 Jun 13 nicklas 93     fileTypesQuery.include(Include.ALL);
6300 19 Jun 13 nicklas 94     fileTypesQuery.order(Orders.asc(Hql.property("itemSubtype.name")));
6300 19 Jun 13 nicklas 95     jsonFileTypes.put("items", JsonUtil.toArray(fileTypesQuery.iterate(dc), new JsonConverter<ItemSubtypeFileType>() 
5630 13 May 11 nicklas 96     {
6300 19 Jun 13 nicklas 97       public Object convert(ItemSubtypeFileType ft)
5630 13 May 11 nicklas 98       {
6300 19 Jun 13 nicklas 99         JSONObject json = new JSONObject();
6300 19 Jun 13 nicklas 100         DataFileType dft = ft.getDataFileType();
6300 19 Jun 13 nicklas 101         boolean required = ft.isRequired();
6300 19 Jun 13 nicklas 102         boolean multiple = ft.getAllowMultiple();
6300 19 Jun 13 nicklas 103         int value = 0;
6300 19 Jun 13 nicklas 104         if (required) value += 1;
6300 19 Jun 13 nicklas 105         if (multiple) value += 2;
6300 19 Jun 13 nicklas 106         json.put("id", dft.getId());
6300 19 Jun 13 nicklas 107         json.put("name", dft.getName() + (required ? " [×]" : " [-]"));
6300 19 Jun 13 nicklas 108         json.put("value", value);
6300 19 Jun 13 nicklas 109         return json;
5630 13 May 11 nicklas 110       }
6300 19 Jun 13 nicklas 111     }));
6300 19 Jun 13 nicklas 112   }
5630 13 May 11 nicklas 113
6300 19 Jun 13 nicklas 114   Set<Item> subtypableItems = Metadata.getSubtypableItems();
6300 19 Jun 13 nicklas 115   JSONObject jsonSubtypeableItems = new JSONObject();
6300 19 Jun 13 nicklas 116   JSONArray jsonItemTypes = new JSONArray();
6300 19 Jun 13 nicklas 117   for (Item item : subtypableItems)
6300 19 Jun 13 nicklas 118   {
6300 19 Jun 13 nicklas 119     jsonItemTypes.add(item.name());
6300 19 Jun 13 nicklas 120     JSONObject jsonSt = new JSONObject();
6300 19 Jun 13 nicklas 121     jsonSt.put("value", item.getValue());
6300 19 Jun 13 nicklas 122     jsonSt.put("fileStoreEnabled", FileStoreEnabled.class.isAssignableFrom(item.getItemClass()) ? 1 : 0);
6300 19 Jun 13 nicklas 123     jsonSt.put("supportsPushAnnotations", ItemSubtype.supportsPushAnnotations(item) ? 1 : 0);
6300 19 Jun 13 nicklas 124     JSONArray jsonRelated = new JSONArray();
6300 19 Jun 13 nicklas 125     for (Item related : ItemSubtype.getRelatedItems(item))
5630 13 May 11 nicklas 126     {
6300 19 Jun 13 nicklas 127       jsonRelated.add(related.name());
5630 13 May 11 nicklas 128     }
6300 19 Jun 13 nicklas 129     jsonSt.put("related", jsonRelated);
6300 19 Jun 13 nicklas 130     jsonSubtypeableItems.put(item.name(), jsonSt);
6300 19 Jun 13 nicklas 131   }
5713 02 Sep 11 nicklas 132
6300 19 Jun 13 nicklas 133   JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), subtype);
7604 25 Feb 19 nicklas 134   ExtensionsInvoker<TabAction> invoker = EditUtil.useEditExtensions(jspContext);
6300 19 Jun 13 nicklas 135   %>
6300 19 Jun 13 nicklas 136   <base:page type="popup" title="<%=title%>" id="edit-page">
6300 19 Jun 13 nicklas 137   <base:head scripts="tabcontrol-2.js,linkitems-2.js,~subtypes.js" styles="tabcontrol.css">
6300 19 Jun 13 nicklas 138     <ext:scripts context="<%=jspContext%>" />
6300 19 Jun 13 nicklas 139     <ext:stylesheets context="<%=jspContext%>" />
5630 13 May 11 nicklas 140   </base:head>
6300 19 Jun 13 nicklas 141   <base:body>
5922 11 Jan 12 nicklas 142     <h1><%=title%> <base:help tabcontrol="settings" /></h1>
6162 10 Oct 12 nicklas 143     <form action="index.jsp?ID=<%=ID%>" method="post" name="subtype">
5630 13 May 11 nicklas 144     <input type="hidden" name="cmd" value="UpdateItem">
5630 13 May 11 nicklas 145
6387 18 Dec 13 nicklas 146     <div id="page-data" class="datacontainer"
6300 19 Jun 13 nicklas 147       data-subtype-id="<%=itemId %>"
6300 19 Jun 13 nicklas 148       data-main-item-type="<%=subtype != null ? subtype.getMainItemType().name() : "" %>"
6300 19 Jun 13 nicklas 149       data-item-types=<%=HTML.encodeTags(jsonItemTypes.toJSONString()) %>
6300 19 Jun 13 nicklas 150       data-item-info="<%=HTML.encodeTags(jsonSubtypeableItems.toJSONString())%>"
6300 19 Jun 13 nicklas 151     ></div>
6300 19 Jun 13 nicklas 152
5922 11 Jan 12 nicklas 153     <t:tabcontrol id="settings" 
5922 11 Jan 12 nicklas 154       subclass="content dialogtabcontrol"
5630 13 May 11 nicklas 155       position="bottom" remember="<%=subtype != null%>"
5630 13 May 11 nicklas 156       extensions="<%=invoker%>">
6300 19 Jun 13 nicklas 157     <t:tab id="info" title="Item subtype" helpid="itemsubtype.edit">
5922 11 Jan 12 nicklas 158       <table class="fullform input100">
5630 13 May 11 nicklas 159       <tr>
5922 11 Jan 12 nicklas 160         <th>Name</th>
6300 19 Jun 13 nicklas 161         <td><input class="text required auto-init" data-auto-init="<%=subtype == null ? "focus-select" : "focus" %>"
6300 19 Jun 13 nicklas 162           type="text" name="name" 
5630 13 May 11 nicklas 163           value="<%=HTML.encodeTags(subtype == null ? Values.getString(cc.getPropertyValue("name"), "New item subtype") : subtype.getName())%>" 
5922 11 Jan 12 nicklas 164           maxlength="<%=ItemSubtype.MAX_NAME_LENGTH%>"></td>
5922 11 Jan 12 nicklas 165         <td></td>
5630 13 May 11 nicklas 166       </tr>
5630 13 May 11 nicklas 167       <tr>
5922 11 Jan 12 nicklas 168         <th>Main item type</th>
5630 13 May 11 nicklas 169         <td>
5630 13 May 11 nicklas 170           <%
5630 13 May 11 nicklas 171           if (subtype == null)
5630 13 May 11 nicklas 172           {
5630 13 May 11 nicklas 173             %>
6300 19 Jun 13 nicklas 174             <select name="itemType" id="itemType" class="required unchangeable selectionlist">
5630 13 May 11 nicklas 175             <%
5630 13 May 11 nicklas 176             int itemCode = Values.getInt(cc.getPropertyValue("itemType"), -1);
5631 16 May 11 nicklas 177             for (Item item : subtypableItems)
5630 13 May 11 nicklas 178             {
5630 13 May 11 nicklas 179               String selected = itemCode == item.getValue() ? "selected" : "";
5630 13 May 11 nicklas 180               %>
5630 13 May 11 nicklas 181               <option value="<%=item.name()%>" <%=selected%>><%=item.toString() %>
5630 13 May 11 nicklas 182               <%
5630 13 May 11 nicklas 183             }
5630 13 May 11 nicklas 184             %>
5630 13 May 11 nicklas 185             </select>
5630 13 May 11 nicklas 186             <%
5630 13 May 11 nicklas 187           }
5630 13 May 11 nicklas 188           else
5630 13 May 11 nicklas 189           {
5630 13 May 11 nicklas 190             %>
5630 13 May 11 nicklas 191             <%=subtype.getMainItemType() %>
5630 13 May 11 nicklas 192             <%
5630 13 May 11 nicklas 193           }
5630 13 May 11 nicklas 194           %>
5630 13 May 11 nicklas 195         </td>
5922 11 Jan 12 nicklas 196         <td></td>
5630 13 May 11 nicklas 197       </tr>
5983 23 Feb 12 nicklas 198       <tr id="section.pushAnnotations">
5983 23 Feb 12 nicklas 199         <th></th>
5983 23 Feb 12 nicklas 200         <td><input type="checkbox" name="pushAnnotations" 
5983 23 Feb 12 nicklas 201           id="pushAnnotations" value="1" 
5983 23 Feb 12 nicklas 202           <%=(subtype != null && subtype.getPushAnnotations()) || 
5983 23 Feb 12 nicklas 203             (subtype == null && Values.getBoolean(cc.getPropertyValue("pushAnnotations"))) ? "checked" : ""%>
5983 23 Feb 12 nicklas 204           ><label for="pushAnnotations">Push annotations to parent</label></td>
5983 23 Feb 12 nicklas 205         <td></td>
5983 23 Feb 12 nicklas 206       </tr>
5922 11 Jan 12 nicklas 207       <tr class="big">
5922 11 Jan 12 nicklas 208         <th>Description</th>
5922 11 Jan 12 nicklas 209         <td>
6217 14 Dec 12 nicklas 210           <textarea class="text" rows="4" name="description" id="description"
5630 13 May 11 nicklas 211             ><%=HTML.encodeTags(subtype == null ? cc.getPropertyValue("description") : subtype.getDescription())%></textarea>
5630 13 May 11 nicklas 212         </td>
5922 11 Jan 12 nicklas 213         <td style="width: 20px;">
6215 13 Dec 12 nicklas 214           <base:zoom textarea="description" title="Description" />
5922 11 Jan 12 nicklas 215         </td>
5630 13 May 11 nicklas 216       </tr>
5631 16 May 11 nicklas 217       <tr>
6149 25 Sep 12 nicklas 218         <th>Related subtypes</th>
5643 26 May 11 nicklas 219         <td><div id="section.none" style="display: none;"><i>- none -</i></div></td>
5922 11 Jan 12 nicklas 220         <td></td>
5631 16 May 11 nicklas 221       </tr>
5631 16 May 11 nicklas 222       <%
5631 16 May 11 nicklas 223       for (Item item : subtypableItems)
5631 16 May 11 nicklas 224       {
5631 16 May 11 nicklas 225         %>
5631 16 May 11 nicklas 226         <tr id="section.<%=item.name()%>" style="display: none;">
5922 11 Jan 12 nicklas 227           <th class="subprompt"><%=item%></th>
5631 16 May 11 nicklas 228           <td>
5631 16 May 11 nicklas 229             <base:select 
5631 16 May 11 nicklas 230               id="<%="related."+item.name()%>" 
6300 19 Jun 13 nicklas 231               data-item-type="<%=item.name()%>"
5631 16 May 11 nicklas 232               current="<%=subtype == null ? null : subtype.getRelatedSubtype(item) %>"
5631 16 May 11 nicklas 233               newitem="<%=subtype == null%>"
5645 27 May 11 nicklas 234               clazz="selectionlist"
5631 16 May 11 nicklas 235             />
5631 16 May 11 nicklas 236           </td>
5922 11 Jan 12 nicklas 237           <td></td>
5631 16 May 11 nicklas 238         </tr>
5631 16 May 11 nicklas 239         <%
5631 16 May 11 nicklas 240       }
5631 16 May 11 nicklas 241       %>
5922 11 Jan 12 nicklas 242       <tr class="dynamic">
5922 11 Jan 12 nicklas 243         <th></th>
5922 11 Jan 12 nicklas 244         <td colspan="2"></td>
5922 11 Jan 12 nicklas 245       </tr>
5630 13 May 11 nicklas 246       </table>
5630 13 May 11 nicklas 247     </t:tab>
5698 15 Aug 11 nicklas 248     <t:tab
5698 15 Aug 11 nicklas 249       id="filetypes"
5706 23 Aug 11 nicklas 250       title="File types"
5706 23 Aug 11 nicklas 251       helpid="itemsubtype.filetypes">
5922 11 Jan 12 nicklas 252       <div id="filetypes.enabled" style="height: 100%; display: none;">
5922 11 Jan 12 nicklas 253         <table class="fullform input100">
5922 11 Jan 12 nicklas 254         <tr class="dynamic">
5922 11 Jan 12 nicklas 255           <th>File types</th>
5698 15 Aug 11 nicklas 256           <td>
5922 11 Jan 12 nicklas 257             <div class="selectionlist">
5922 11 Jan 12 nicklas 258               <table>
5922 11 Jan 12 nicklas 259               <tr>
5922 11 Jan 12 nicklas 260               <td>
6300 19 Jun 13 nicklas 261                 <select name="fileTypes" id="fileTypes" 
6300 19 Jun 13 nicklas 262                   class="auto-init"
6300 19 Jun 13 nicklas 263                   data-auto-init="link-container"
6300 19 Jun 13 nicklas 264                   data-initial-items="[<%=HTML.encodeTags(jsonFileTypes.toJSONString()) %>]"
6300 19 Jun 13 nicklas 265                   size="10" multiple>
5922 11 Jan 12 nicklas 266                 </select>
5922 11 Jan 12 nicklas 267               </td>
5922 11 Jan 12 nicklas 268               <td style="vertical-align: top;">
5922 11 Jan 12 nicklas 269                 <base:buttongroup vertical="true">
5922 11 Jan 12 nicklas 270                   <base:button 
6300 19 Jun 13 nicklas 271                     id="btnAddFileTypes"
5922 11 Jan 12 nicklas 272                     subclass="leftaligned"
5922 11 Jan 12 nicklas 273                     style="width: 14em;"
5922 11 Jan 12 nicklas 274                     title="Add file types&hellip;" 
5922 11 Jan 12 nicklas 275                     tooltip="Add file types"
5922 11 Jan 12 nicklas 276                     />
5922 11 Jan 12 nicklas 277                   <base:button 
6300 19 Jun 13 nicklas 278                     subclass="leftaligned auto-init"
6300 19 Jun 13 nicklas 279                     data-auto-init="remove-link"
6300 19 Jun 13 nicklas 280                     data-list-id="fileTypes"
5922 11 Jan 12 nicklas 281                     style="width: 14em;"
5922 11 Jan 12 nicklas 282                     title="Remove" 
5922 11 Jan 12 nicklas 283                     tooltip="Remove the selected file types"
5922 11 Jan 12 nicklas 284                   />
5922 11 Jan 12 nicklas 285                 </base:buttongroup>
6300 19 Jun 13 nicklas 286                 <input type="checkbox" id="required" name="required" value="1">
5922 11 Jan 12 nicklas 287                   <label for="required">Required</label><br>
6300 19 Jun 13 nicklas 288                 <input type="checkbox" id="multiple" name="multiple" value="1">
5922 11 Jan 12 nicklas 289                   <label for="multiple">Allow multiple files</label>
5922 11 Jan 12 nicklas 290                 </td>
5922 11 Jan 12 nicklas 291               </tr>
5922 11 Jan 12 nicklas 292               </table>
5922 11 Jan 12 nicklas 293             </div>
5698 15 Aug 11 nicklas 294           </td>
5922 11 Jan 12 nicklas 295         </tr>
5922 11 Jan 12 nicklas 296         </table>
5698 15 Aug 11 nicklas 297       </div>
6613 21 Nov 14 nicklas 298       <div id="filetypes.disabled" class="bg-filled-50" style="height: 100%; display: none; border: 1px solid transparent;">
5922 11 Jan 12 nicklas 299         <div class="messagecontainer error"></div>
5698 15 Aug 11 nicklas 300       </div>
5698 15 Aug 11 nicklas 301     </t:tab>
5630 13 May 11 nicklas 302     </t:tabcontrol>
5922 11 Jan 12 nicklas 303     </form>
5922 11 Jan 12 nicklas 304     
5922 11 Jan 12 nicklas 305     <div class="legend">
5946 03 Feb 12 nicklas 306       <base:icon image="required.png" />= required information
5922 11 Jan 12 nicklas 307     </div>
5630 13 May 11 nicklas 308
5922 11 Jan 12 nicklas 309     <base:buttongroup subclass="dialogbuttons">
6300 19 Jun 13 nicklas 310       <base:button id="btnSave" title="Save" />
6300 19 Jun 13 nicklas 311       <base:button id="close" title="Cancel" />
5922 11 Jan 12 nicklas 312     </base:buttongroup>
5630 13 May 11 nicklas 313   </base:body>
5630 13 May 11 nicklas 314   </base:page>
5630 13 May 11 nicklas 315   <%
5630 13 May 11 nicklas 316 }
5630 13 May 11 nicklas 317 finally
5630 13 May 11 nicklas 318 {
5630 13 May 11 nicklas 319   if (dc != null) dc.close();
5630 13 May 11 nicklas 320 }
5630 13 May 11 nicklas 321 %>