www/common/columns/add_relateditem_column.js

Code
Comments
Other
Rev Date Author Line
7773 17 Feb 20 nicklas 1 /* $Id $
7773 17 Feb 20 nicklas 2   ------------------------------------------------------------------
7773 17 Feb 20 nicklas 3   Copyright (C) 2020 Nicklas Nordborg
7773 17 Feb 20 nicklas 4
7773 17 Feb 20 nicklas 5   This file is part of BASE - BioArray Software Environment.
7773 17 Feb 20 nicklas 6   Available at http://base.thep.lu.se/
7773 17 Feb 20 nicklas 7
7773 17 Feb 20 nicklas 8   BASE is free software; you can redistribute it and/or
7773 17 Feb 20 nicklas 9   modify it under the terms of the GNU General Public License
7773 17 Feb 20 nicklas 10   as published by the Free Software Foundation; either version 3
7773 17 Feb 20 nicklas 11   of the License, or (at your option) any later version.
7773 17 Feb 20 nicklas 12
7773 17 Feb 20 nicklas 13   BASE is distributed in the hope that it will be useful,
7773 17 Feb 20 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
7773 17 Feb 20 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7773 17 Feb 20 nicklas 16   GNU General Public License for more details.
7773 17 Feb 20 nicklas 17
7773 17 Feb 20 nicklas 18   You should have received a copy of the GNU General Public License
7773 17 Feb 20 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
7773 17 Feb 20 nicklas 20   ------------------------------------------------------------------
7773 17 Feb 20 nicklas 21
7773 17 Feb 20 nicklas 22   @author Nicklas
7773 17 Feb 20 nicklas 23 */
7773 17 Feb 20 nicklas 24 'use strict';
7773 17 Feb 20 nicklas 25
7773 17 Feb 20 nicklas 26 var Configure = function()
7773 17 Feb 20 nicklas 27 {
7773 17 Feb 20 nicklas 28   var configure = {};
7773 17 Feb 20 nicklas 29   
8083 20 Oct 22 nicklas 30   var currentTargetSubtypes;
8083 20 Oct 22 nicklas 31   var currentTargetAnnotationTypesAll;
8083 20 Oct 22 nicklas 32   var currentTargetAnnotationTypesCategory;
8083 20 Oct 22 nicklas 33   var currentTargetExtensionColumns;
7773 17 Feb 20 nicklas 34   
8083 20 Oct 22 nicklas 35   var currentChildItemTypes;
8083 20 Oct 22 nicklas 36   var currentChildSubtypes;
8083 20 Oct 22 nicklas 37   var currentChildAnnotationTypesAll;
8083 20 Oct 22 nicklas 38   var currentChildAnnotationTypesCategory;
8083 20 Oct 22 nicklas 39   var currentChildExtensionColumns;
8083 20 Oct 22 nicklas 40   
7842 01 Sep 20 nicklas 41   // See also net.sf.basedb.clients.web.extensions.list.RelatedItemColumn.pathTitles
7779 28 Feb 20 nicklas 42   var nameCol = {'id': '.', 'text': 'Name'};
7779 28 Feb 20 nicklas 43   var externalIdCol = {'id': 'externalId', 'text': 'External ID'};
7779 28 Feb 20 nicklas 44   var bioPlateCol = {'id': 'bioWell.bioPlate', 'text': 'Bioplate'};
7779 28 Feb 20 nicklas 45   var entryDateCol = {'id': 'entryDate', 'text': 'Registered'};
7779 28 Feb 20 nicklas 46   var remainingQCol = {'id': 'remainingQuantity', 'text': 'Remaining quantity'};
7845 04 Sep 20 nicklas 47   var originalQCol = {'id': 'originalQuantity', 'text': 'Original quantity'};
7885 04 Dec 20 nicklas 48   var itemListCol = {'id': '§itemLists', 'text': 'Item list'};
7779 28 Feb 20 nicklas 49   
7845 04 Sep 20 nicklas 50   var creationRegistredCol = {'id': 'creationEvent.entryDate', 'text': 'Registration date'};
7845 04 Sep 20 nicklas 51   var creationEventdateCol = {'id': 'creationEvent.eventDate', 'text': 'Creation date'};
7779 28 Feb 20 nicklas 52   var creationProtocolCol = {'id': 'creationEvent.protocol', 'text': 'Protocol'};
7779 28 Feb 20 nicklas 53   var creationHardwareCol = {'id': 'creationEvent.hardware', 'text': 'Hardware'};
7779 28 Feb 20 nicklas 54
7779 28 Feb 20 nicklas 55   var protocolCol = {'id': 'protocol', 'text': 'Protocol'};
7779 28 Feb 20 nicklas 56   var hardwareCol = {'id': 'hardware', 'text': 'Hardware'};
7779 28 Feb 20 nicklas 57   var softwareCol = {'id': 'software', 'text': 'Software'};
7845 04 Sep 20 nicklas 58   var tagCol = {'id': 'tag', 'text': 'Tag'};
7845 04 Sep 20 nicklas 59   var jobTypeCol = {'id': 'job.itemSubtype', 'text': 'Job type'};
7779 28 Feb 20 nicklas 60
7779 28 Feb 20 nicklas 61   var staticColumns = {
7885 04 Dec 20 nicklas 62     'BIOSOURCE': [nameCol, externalIdCol, itemListCol, entryDateCol],
7885 04 Dec 20 nicklas 63     'SAMPLE': [nameCol, externalIdCol, itemListCol, bioPlateCol, creationEventdateCol, creationRegistredCol, creationProtocolCol, remainingQCol, originalQCol],
7885 04 Dec 20 nicklas 64     'EXTRACT': [nameCol, externalIdCol, itemListCol, bioPlateCol, creationEventdateCol, creationRegistredCol, creationProtocolCol, remainingQCol, originalQCol, tagCol],
7885 04 Dec 20 nicklas 65     'PHYSICALBIOASSAY': [nameCol, itemListCol, creationEventdateCol, creationRegistredCol, creationProtocolCol, creationHardwareCol],
7885 04 Dec 20 nicklas 66     'DERIVEDBIOASSAY': [nameCol, itemListCol, entryDateCol, protocolCol, softwareCol, hardwareCol, jobTypeCol],
7885 04 Dec 20 nicklas 67     'RAWBIOASSAY': [nameCol, itemListCol, entryDateCol, protocolCol, softwareCol, jobTypeCol]
7779 28 Feb 20 nicklas 68   }
7779 28 Feb 20 nicklas 69   
7773 17 Feb 20 nicklas 70   /**
7773 17 Feb 20 nicklas 71     Initialize the page.
7773 17 Feb 20 nicklas 72   */
7773 17 Feb 20 nicklas 73   configure.initPage = function()
7773 17 Feb 20 nicklas 74   {
7842 01 Sep 20 nicklas 75     Events.addEventHandler('targetItemType', 'change', configure.targetItemTypeOnChange);
8083 20 Oct 22 nicklas 76     Events.addEventHandler('targetSubtype', 'change', configure.targetSubtypeOnChange);
8083 20 Oct 22 nicklas 77     Events.addEventHandler('childItemType', 'change', configure.childItemTypeOnChange);
8083 20 Oct 22 nicklas 78     Events.addEventHandler('childSubtype', 'change', configure.childSubtypeOnChange);
7773 17 Feb 20 nicklas 79     Events.addEventHandler('showAllAnnotationTypes', 'change', configure.updateColumnsList);
7813 19 May 20 nicklas 80     Events.addEventHandler(document.body, 'click', configure.hideMessage);
7773 17 Feb 20 nicklas 81     
7773 17 Feb 20 nicklas 82     // Buttons
7773 17 Feb 20 nicklas 83     Buttons.addClickHandler('close', App.closeWindow);
7773 17 Feb 20 nicklas 84     Buttons.addClickHandler('btnAdd', configure.addColumn);
7773 17 Feb 20 nicklas 85   }
7773 17 Feb 20 nicklas 86   
8083 20 Oct 22 nicklas 87   // Clear existing columns
8083 20 Oct 22 nicklas 88   configure.clearColumns = function()
7773 17 Feb 20 nicklas 89   {
8083 20 Oct 22 nicklas 90     Doc.element('columns').innerHTML = '';
8083 20 Oct 22 nicklas 91     Doc.element('annotations').innerHTML = '';
8083 20 Oct 22 nicklas 92     Doc.element('extensions').innerHTML = '';
8083 20 Oct 22 nicklas 93     Doc.hide('targetPath');
8083 20 Oct 22 nicklas 94     Doc.hide('childPath');
8083 20 Oct 22 nicklas 95   }
8083 20 Oct 22 nicklas 96   // Clear the list and disable it
8083 20 Oct 22 nicklas 97   configure.clearList = function(listOrId)
8083 20 Oct 22 nicklas 98   {
8083 20 Oct 22 nicklas 99     var list = Doc.element(listOrId);
8083 20 Oct 22 nicklas 100     list.disabled = true;
8083 20 Oct 22 nicklas 101     list.length = 1;
8083 20 Oct 22 nicklas 102   }
8083 20 Oct 22 nicklas 103   
8083 20 Oct 22 nicklas 104   configure.targetItemTypeOnChange = function(event)
8083 20 Oct 22 nicklas 105   {
8083 20 Oct 22 nicklas 106     // Reset everything that depends on the target item type
8083 20 Oct 22 nicklas 107     configure.clearColumns();
8083 20 Oct 22 nicklas 108     configure.clearList('targetSubtype');
8083 20 Oct 22 nicklas 109     configure.clearList('childItemType');
8083 20 Oct 22 nicklas 110     configure.clearList('childSubtype');
8094 04 Nov 22 nicklas 111     Doc.element('allowDoublingBack').disabled = true;
8083 20 Oct 22 nicklas 112     
7842 01 Sep 20 nicklas 113     var frm = document.forms['relatedItems'];
8083 20 Oct 22 nicklas 114     var sourceItemType = frm.item_type.value;
7842 01 Sep 20 nicklas 115     var targetItemType = frm.targetItemType.value;
8083 20 Oct 22 nicklas 116     var direction = Data.get(frm.targetItemType[frm.targetItemType.selectedIndex], 'direction');
8083 20 Oct 22 nicklas 117     
8083 20 Oct 22 nicklas 118     if (targetItemType)
8083 20 Oct 22 nicklas 119     {
8083 20 Oct 22 nicklas 120       var url = 'ajax.jsp?ID='+App.getSessionId();
8083 20 Oct 22 nicklas 121       url += '&cmd=GetSubtypesAndAnnotationTypes&itemType='+encodeURIComponent(targetItemType);
8083 20 Oct 22 nicklas 122       url += '&sourceItemType='+encodeURIComponent(sourceItemType);
8083 20 Oct 22 nicklas 123       url += '&direction='+encodeURIComponent(direction);
8083 20 Oct 22 nicklas 124       
8083 20 Oct 22 nicklas 125       var request = Ajax.getXmlHttpRequest();
8083 20 Oct 22 nicklas 126       request.open("GET", url, true);
8083 20 Oct 22 nicklas 127       request.send(null);
8083 20 Oct 22 nicklas 128       Ajax.setReadyStateHandler(request, configure.targetTypeInfoLoaded, configure.targetTypeInfoLoaded);
8083 20 Oct 22 nicklas 129     }
8083 20 Oct 22 nicklas 130   }
8083 20 Oct 22 nicklas 131   
8083 20 Oct 22 nicklas 132   configure.targetSubtypeOnChange = function(event)
8083 20 Oct 22 nicklas 133   {
8083 20 Oct 22 nicklas 134     // Reset everything that depends on the target subtype
8083 20 Oct 22 nicklas 135     configure.clearColumns();
8083 20 Oct 22 nicklas 136     
8083 20 Oct 22 nicklas 137     var frm = document.forms['relatedItems'];
8083 20 Oct 22 nicklas 138     var targetItemType = frm.targetItemType.value;
8083 20 Oct 22 nicklas 139     var sourceItemType = frm.item_type.value;
8083 20 Oct 22 nicklas 140     var category = frm.targetSubtype.selectedIndex > 0 ? frm.targetSubtype[frm.targetSubtype.selectedIndex].text : null;
7842 01 Sep 20 nicklas 141     if (targetItemType && category)
7773 17 Feb 20 nicklas 142     {
7773 17 Feb 20 nicklas 143       var url = 'ajax.jsp?ID='+App.getSessionId();
7842 01 Sep 20 nicklas 144       url += '&cmd=GetAnnotationTypesForCategory&itemType='+encodeURIComponent(targetItemType);
8083 20 Oct 22 nicklas 145       url += '&sourceItemType='+encodeURIComponent(sourceItemType);
7773 17 Feb 20 nicklas 146       url += '&category='+encodeURIComponent(category);
7773 17 Feb 20 nicklas 147       
7773 17 Feb 20 nicklas 148       var request = Ajax.getXmlHttpRequest();
7773 17 Feb 20 nicklas 149       request.open("GET", url, true);
7773 17 Feb 20 nicklas 150       request.send(null);
8083 20 Oct 22 nicklas 151       Ajax.setReadyStateHandler(request, configure.targetTypeInfoLoaded, configure.targetTypeInfoLoaded);
7773 17 Feb 20 nicklas 152     }
7773 17 Feb 20 nicklas 153   }
7773 17 Feb 20 nicklas 154   
8083 20 Oct 22 nicklas 155   configure.targetTypeInfoLoaded = function(request)
7773 17 Feb 20 nicklas 156   {
8083 20 Oct 22 nicklas 157     var response = JSON.parse(request.responseText);
8083 20 Oct 22 nicklas 158     if (response.status != 'ok')
7773 17 Feb 20 nicklas 159     {
8083 20 Oct 22 nicklas 160       App.debug(request.responseText);
8083 20 Oct 22 nicklas 161       return;
8083 20 Oct 22 nicklas 162     }
8083 20 Oct 22 nicklas 163     var frm = document.forms['relatedItems'];
8083 20 Oct 22 nicklas 164     
8083 20 Oct 22 nicklas 165     if (response.childTypes)
8083 20 Oct 22 nicklas 166     {
8083 20 Oct 22 nicklas 167       frm.childItemType.length = 1;
8083 20 Oct 22 nicklas 168       currentChildItemTypes = response.childTypes;
8083 20 Oct 22 nicklas 169       for (var i = 0; i < currentChildItemTypes.length; i++)
8083 20 Oct 22 nicklas 170       {
8083 20 Oct 22 nicklas 171         var st = currentChildItemTypes[i];
8083 20 Oct 22 nicklas 172         frm.childItemType[frm.childItemType.length] = new Option('Child: '+st.name, st.id);
8083 20 Oct 22 nicklas 173       }
8083 20 Oct 22 nicklas 174       frm.childItemType.selectedIndex = 0;
8083 20 Oct 22 nicklas 175       frm.childItemType.disabled = currentChildItemTypes.length == 0;
8083 20 Oct 22 nicklas 176     }
8083 20 Oct 22 nicklas 177     
8083 20 Oct 22 nicklas 178     if (response.subtypes) 
8083 20 Oct 22 nicklas 179     {
8083 20 Oct 22 nicklas 180       currentTargetSubtypes = response.subtypes;
8083 20 Oct 22 nicklas 181       frm.targetSubtype.length = 1;
8083 20 Oct 22 nicklas 182       for (var i = 0; i < currentTargetSubtypes.length; i++)
8083 20 Oct 22 nicklas 183       {
8083 20 Oct 22 nicklas 184         var st = currentTargetSubtypes[i];
8083 20 Oct 22 nicklas 185         frm.targetSubtype[frm.targetSubtype.length] = new Option(st.name, st.id);
8083 20 Oct 22 nicklas 186       }
8083 20 Oct 22 nicklas 187       frm.targetSubtype.selectedIndex = 0;
8083 20 Oct 22 nicklas 188       frm.targetSubtype.disabled = currentTargetSubtypes.length == 0;
8083 20 Oct 22 nicklas 189     }
8083 20 Oct 22 nicklas 190     
8083 20 Oct 22 nicklas 191     if (response.annotationTypes) currentTargetAnnotationTypesAll = response.annotationTypes;
8083 20 Oct 22 nicklas 192     if (response.annotationTypesCategory) currentTargetAnnotationTypesCategory = response.annotationTypesCategory;
8083 20 Oct 22 nicklas 193     if (response.extensionColumns) currentTargetExtensionColumns = response.extensionColumns;
8083 20 Oct 22 nicklas 194     
8083 20 Oct 22 nicklas 195     configure.updateColumnsList();
8083 20 Oct 22 nicklas 196   }
8083 20 Oct 22 nicklas 197   
8083 20 Oct 22 nicklas 198   configure.childItemTypeOnChange = function(event)
8083 20 Oct 22 nicklas 199   {
8083 20 Oct 22 nicklas 200     // Reset everything that depends on the child item type
8083 20 Oct 22 nicklas 201     configure.clearColumns();
8083 20 Oct 22 nicklas 202     configure.clearList('childSubtype');
8094 04 Nov 22 nicklas 203     Doc.element('allowDoublingBack').disabled = true;
8083 20 Oct 22 nicklas 204     
8083 20 Oct 22 nicklas 205     var frm = document.forms['relatedItems'];
8083 20 Oct 22 nicklas 206     var targetItemType = frm.targetItemType.value;
8083 20 Oct 22 nicklas 207     var childItemType = frm.childItemType.value;
8083 20 Oct 22 nicklas 208     
8083 20 Oct 22 nicklas 209     if (targetItemType && childItemType)
8083 20 Oct 22 nicklas 210     {
7773 17 Feb 20 nicklas 211       var url = 'ajax.jsp?ID='+App.getSessionId();
8083 20 Oct 22 nicklas 212       url += '&cmd=GetSubtypesAndAnnotationTypes&itemType='+encodeURIComponent(childItemType);
8083 20 Oct 22 nicklas 213       url += '&sourceItemType='+encodeURIComponent(targetItemType);
8083 20 Oct 22 nicklas 214       url += '&direction=CHILD';
7773 17 Feb 20 nicklas 215       
7773 17 Feb 20 nicklas 216       var request = Ajax.getXmlHttpRequest();
7773 17 Feb 20 nicklas 217       request.open("GET", url, true);
7773 17 Feb 20 nicklas 218       request.send(null);
8083 20 Oct 22 nicklas 219       Ajax.setReadyStateHandler(request, configure.childTypeInfoLoaded, configure.childTypeInfoLoaded);
7773 17 Feb 20 nicklas 220     }
8083 20 Oct 22 nicklas 221     else
8083 20 Oct 22 nicklas 222     {
8083 20 Oct 22 nicklas 223       configure.updateColumnsList();
8083 20 Oct 22 nicklas 224     }
7773 17 Feb 20 nicklas 225   }
8083 20 Oct 22 nicklas 226
8083 20 Oct 22 nicklas 227   configure.childSubtypeOnChange = function(event)
7773 17 Feb 20 nicklas 228   {
8083 20 Oct 22 nicklas 229     // Reset everything that depends on the child subtype
8083 20 Oct 22 nicklas 230     configure.clearColumns();
8083 20 Oct 22 nicklas 231
8083 20 Oct 22 nicklas 232     var frm = document.forms['relatedItems'];
8083 20 Oct 22 nicklas 233     var targetItemType = frm.targetItemType.value;
8083 20 Oct 22 nicklas 234     var childItemType = frm.childItemType.value;
8083 20 Oct 22 nicklas 235     var category = frm.childSubtype.selectedIndex > 0 ? frm.childSubtype[frm.childSubtype.selectedIndex].text : null;
8083 20 Oct 22 nicklas 236     if (targetItemType && childItemType && category)
8083 20 Oct 22 nicklas 237     {
8083 20 Oct 22 nicklas 238       var url = 'ajax.jsp?ID='+App.getSessionId();
8083 20 Oct 22 nicklas 239       url += '&cmd=GetAnnotationTypesForCategory&itemType='+encodeURIComponent(childItemType);
8083 20 Oct 22 nicklas 240       url += '&sourceItemType='+encodeURIComponent(targetItemType);
8083 20 Oct 22 nicklas 241       url += '&category='+encodeURIComponent(category);
8083 20 Oct 22 nicklas 242       
8083 20 Oct 22 nicklas 243       var request = Ajax.getXmlHttpRequest();
8083 20 Oct 22 nicklas 244       request.open("GET", url, true);
8083 20 Oct 22 nicklas 245       request.send(null);
8083 20 Oct 22 nicklas 246       Ajax.setReadyStateHandler(request, configure.childTypeInfoLoaded, configure.childTypeInfoLoaded);
8083 20 Oct 22 nicklas 247     }
8083 20 Oct 22 nicklas 248   }
8083 20 Oct 22 nicklas 249
8083 20 Oct 22 nicklas 250   configure.childTypeInfoLoaded = function(request)
8083 20 Oct 22 nicklas 251   {
7773 17 Feb 20 nicklas 252     var response = JSON.parse(request.responseText);
7773 17 Feb 20 nicklas 253     if (response.status != 'ok')
7773 17 Feb 20 nicklas 254     {
7773 17 Feb 20 nicklas 255       App.debug(request.responseText);
7773 17 Feb 20 nicklas 256       return;
7773 17 Feb 20 nicklas 257     }
7842 01 Sep 20 nicklas 258     var frm = document.forms['relatedItems'];
8083 20 Oct 22 nicklas 259
7773 17 Feb 20 nicklas 260     if (response.subtypes) 
7773 17 Feb 20 nicklas 261     {
8083 20 Oct 22 nicklas 262       currentChildSubtypes = response.subtypes;
8083 20 Oct 22 nicklas 263       frm.childSubtype.length = 1;
8083 20 Oct 22 nicklas 264       for (var i = 0; i < currentChildSubtypes.length; i++)
7773 17 Feb 20 nicklas 265       {
8083 20 Oct 22 nicklas 266         var st = currentChildSubtypes[i];
8083 20 Oct 22 nicklas 267         frm.childSubtype[frm.childSubtype.length] = new Option(st.name, st.id);
7773 17 Feb 20 nicklas 268       }
8083 20 Oct 22 nicklas 269       frm.childSubtype.selectedIndex = 0;
8083 20 Oct 22 nicklas 270       frm.childSubtype.disabled = currentChildSubtypes.length == 0;
8094 04 Nov 22 nicklas 271       frm.allowDoublingBack.disabled = currentChildSubtypes.length == 0;
8083 20 Oct 22 nicklas 272     }  
8083 20 Oct 22 nicklas 273     
8083 20 Oct 22 nicklas 274     if (response.annotationTypes) currentChildAnnotationTypesAll = response.annotationTypes;
8083 20 Oct 22 nicklas 275     if (response.annotationTypesCategory) currentChildAnnotationTypesCategory = response.annotationTypesCategory;
8083 20 Oct 22 nicklas 276     if (response.extensionColumns) currentChildExtensionColumns = response.extensionColumns;
8083 20 Oct 22 nicklas 277
7773 17 Feb 20 nicklas 278     configure.updateColumnsList();
7773 17 Feb 20 nicklas 279   }
8083 20 Oct 22 nicklas 280
7773 17 Feb 20 nicklas 281   
7773 17 Feb 20 nicklas 282   configure.updateColumnsList = function()
7773 17 Feb 20 nicklas 283   {
7842 01 Sep 20 nicklas 284     var frm = document.forms['relatedItems'];
7773 17 Feb 20 nicklas 285     
7842 01 Sep 20 nicklas 286     var targetItemType = frm.targetItemType.value;
8083 20 Oct 22 nicklas 287     var targetSubtype = frm.targetSubtype.value;
8083 20 Oct 22 nicklas 288     var childItemType = frm.childItemType.value;
8083 20 Oct 22 nicklas 289     var childSubtype = frm.childSubtype.value;
7773 17 Feb 20 nicklas 290
8083 20 Oct 22 nicklas 291     // At least a target item type and a subtype must be selected
8083 20 Oct 22 nicklas 292     if (!targetItemType || !targetSubtype) return;
8083 20 Oct 22 nicklas 293     // If a child item type is selected, so must a child subtype
8083 20 Oct 22 nicklas 294     if (childItemType && !childSubtype) return;
8083 20 Oct 22 nicklas 295     
8083 20 Oct 22 nicklas 296     var targetDirection = Data.get(frm.targetItemType[frm.targetItemType.selectedIndex], 'direction');
8083 20 Oct 22 nicklas 297     var targetText = frm.targetSubtype[frm.targetSubtype.selectedIndex].text;
8083 20 Oct 22 nicklas 298     if (targetDirection == 'PARENT')
7773 17 Feb 20 nicklas 299     {
8083 20 Oct 22 nicklas 300       Doc.element('targetPath').innerHTML = 'Parent('+targetText+')';
8083 20 Oct 22 nicklas 301       Doc.element('targetPath').className = 'parentitem';
7773 17 Feb 20 nicklas 302     }
8083 20 Oct 22 nicklas 303     else
8083 20 Oct 22 nicklas 304     {
8083 20 Oct 22 nicklas 305       Doc.element('targetPath').innerHTML = 'Child('+targetText+')';
8083 20 Oct 22 nicklas 306       Doc.element('targetPath').className = 'childitem';
8083 20 Oct 22 nicklas 307     }
8083 20 Oct 22 nicklas 308     Doc.show('targetPath', 'inline');
8083 20 Oct 22 nicklas 309
8083 20 Oct 22 nicklas 310     var staticCols = staticColumns[targetItemType] || [];
8083 20 Oct 22 nicklas 311     var annotationCols = frm.showAllAnnotationTypes.checked ? currentTargetAnnotationTypesAll : currentTargetAnnotationTypesCategory;
8083 20 Oct 22 nicklas 312     var xtCols = currentTargetExtensionColumns;
7773 17 Feb 20 nicklas 313     
8083 20 Oct 22 nicklas 314     if (childItemType && childSubtype)
8083 20 Oct 22 nicklas 315     {
8083 20 Oct 22 nicklas 316       staticCols = staticColumns[childItemType] || [];
8083 20 Oct 22 nicklas 317       annotationCols = frm.showAllAnnotationTypes.checked ? currentChildAnnotationTypesAll : currentChildAnnotationTypesCategory;
8083 20 Oct 22 nicklas 318       xtCols = currentChildExtensionColumns;
8083 20 Oct 22 nicklas 319       var childText = frm.childSubtype[frm.childSubtype.selectedIndex].text;
8083 20 Oct 22 nicklas 320       Doc.element('childPath').innerHTML = 'Child: '+childText;
8083 20 Oct 22 nicklas 321       Doc.show('childPath', 'inline');
8083 20 Oct 22 nicklas 322     }    
7779 28 Feb 20 nicklas 323     
8083 20 Oct 22 nicklas 324     var html = '';
7779 28 Feb 20 nicklas 325     // Add static property columns depending on itemtype
8083 20 Oct 22 nicklas 326     for (var i = 0; i < staticCols.length; i++)
7779 28 Feb 20 nicklas 327     {
8083 20 Oct 22 nicklas 328       var c = staticCols[i];
8083 20 Oct 22 nicklas 329       var text = Strings.encodeTags(c.text);
8083 20 Oct 22 nicklas 330       html += '<div><label><input type="checkbox" data-column-id="'+c.id+'" data-column-title="'+text+'">';
8083 20 Oct 22 nicklas 331       html += text + '</label></div>';
7779 28 Feb 20 nicklas 332     }
8083 20 Oct 22 nicklas 333     Doc.element('columns').innerHTML = html;
8083 20 Oct 22 nicklas 334
7779 28 Feb 20 nicklas 335     // Add annotation columns
8083 20 Oct 22 nicklas 336     html = '';
8083 20 Oct 22 nicklas 337     for (var i = 0; i < annotationCols.length; i++)
7773 17 Feb 20 nicklas 338     {
8083 20 Oct 22 nicklas 339       var at = annotationCols[i];
8083 20 Oct 22 nicklas 340       var text = Strings.encodeTags(at.name);
8083 20 Oct 22 nicklas 341       html += '<div><label><input type="checkbox" data-column-id="#+'+at.id+'" data-column-title="'+text+'">';
8083 20 Oct 22 nicklas 342       html += text + '</label></div>';
7773 17 Feb 20 nicklas 343     }
8083 20 Oct 22 nicklas 344     Doc.element('annotations').innerHTML = html;
8083 20 Oct 22 nicklas 345     
8083 20 Oct 22 nicklas 346     // Extension columns
8083 20 Oct 22 nicklas 347     html = '';
8083 20 Oct 22 nicklas 348     for (var i = 0; i < xtCols.length; i++)
8083 20 Oct 22 nicklas 349     {
8083 20 Oct 22 nicklas 350       var xtCol = xtCols[i];
8083 20 Oct 22 nicklas 351       var id = "!"+xtCol.id+"#"+xtCol.columnId;
8083 20 Oct 22 nicklas 352       var text = Strings.encodeTags(xtCol.name);
8083 20 Oct 22 nicklas 353       if (xtCol.id.indexOf('net.sf.basedb.clients.web.related-item-columns') == 0)
8083 20 Oct 22 nicklas 354       {
8083 20 Oct 22 nicklas 355         // Special case when the extension is the related-item extionsion
8083 20 Oct 22 nicklas 356         // It has built-in support for two hops and doen't have to use the 
8083 20 Oct 22 nicklas 357         // extension mechanism recursively
8083 20 Oct 22 nicklas 358         id = xtCol.columnId;
8083 20 Oct 22 nicklas 359       }
8083 20 Oct 22 nicklas 360       html += '<div title="'+Strings.encodeTags(xtCol.tooltip)+'">';
8083 20 Oct 22 nicklas 361       html += '<label><input type="checkbox" data-column-id="'+id+'" data-column-title="'+text+'">';
8083 20 Oct 22 nicklas 362       html += (xtCol.nameHTML || text) + '</label></div>';
8083 20 Oct 22 nicklas 363     }
8083 20 Oct 22 nicklas 364     Doc.element('extensions').innerHTML = html;
7773 17 Feb 20 nicklas 365   }
7773 17 Feb 20 nicklas 366   
7813 19 May 20 nicklas 367   configure.addColumn = function(event)
7773 17 Feb 20 nicklas 368   {
7842 01 Sep 20 nicklas 369     var frm = document.forms['relatedItems'];
7773 17 Feb 20 nicklas 370     
7773 17 Feb 20 nicklas 371     var data = {};
7842 01 Sep 20 nicklas 372     data.targetItemType = frm.targetItemType.value;
8083 20 Oct 22 nicklas 373     data.targetSubtype = frm.targetSubtype.value;
8083 20 Oct 22 nicklas 374     data.childItemType = frm.childItemType.value;
8083 20 Oct 22 nicklas 375     data.childSubtype = frm.childSubtype.value;
8094 04 Nov 22 nicklas 376     data.allowDoublingBack = frm.allowDoublingBack.checked?1:0;
7773 17 Feb 20 nicklas 377
7842 01 Sep 20 nicklas 378     if (!data.targetItemType)
7773 17 Feb 20 nicklas 379     {
7842 01 Sep 20 nicklas 380       Forms.showNotification('targetItemType', 'Please select a parent or child item type!');
7773 17 Feb 20 nicklas 381       return;
7773 17 Feb 20 nicklas 382     }
8083 20 Oct 22 nicklas 383     if (!data.targetSubtype)
7773 17 Feb 20 nicklas 384     {
8083 20 Oct 22 nicklas 385       Forms.showNotification('targetSubtype', 'Please select a subtype!');
7773 17 Feb 20 nicklas 386       return;
7773 17 Feb 20 nicklas 387     }
8083 20 Oct 22 nicklas 388     if (data.childItemType && !data.childSubtype)
8083 20 Oct 22 nicklas 389     {
8083 20 Oct 22 nicklas 390       Forms.showNotification('childSubtype', 'Please select a subtype!');
8083 20 Oct 22 nicklas 391       return;
8083 20 Oct 22 nicklas 392     }
8083 20 Oct 22 nicklas 393     
8083 20 Oct 22 nicklas 394     data.targetSubtypeName = frm.targetSubtype[frm.targetSubtype.selectedIndex].text;
7842 01 Sep 20 nicklas 395     data.direction = Data.get(frm.targetItemType[frm.targetItemType.selectedIndex], 'direction');
7773 17 Feb 20 nicklas 396
8083 20 Oct 22 nicklas 397     var propertyPrefix = '/'+data.direction+'/'+data.targetItemType+'/'+data.targetSubtype+'/';
8083 20 Oct 22 nicklas 398     var titlePrefix = data.targetSubtypeName;
8083 20 Oct 22 nicklas 399     if (data.childItemType)
8083 20 Oct 22 nicklas 400     {
8083 20 Oct 22 nicklas 401       data.childSubtypeName = frm.childSubtype[frm.childSubtype.selectedIndex].text;
8094 04 Nov 22 nicklas 402       propertyPrefix += (data.allowDoublingBack?'/CHILD+/':'/CHILD/')+data.childItemType+'/'+data.childSubtype+'/';
8083 20 Oct 22 nicklas 403       titlePrefix += '.'+data.childSubtypeName;
8083 20 Oct 22 nicklas 404     }
8083 20 Oct 22 nicklas 405
7773 17 Feb 20 nicklas 406     var numSelected = 0;
8083 20 Oct 22 nicklas 407     var allColumns = document.querySelectorAll("input[data-column-id]");
8083 20 Oct 22 nicklas 408     for (var i = 0; i < allColumns.length; i++)
7773 17 Feb 20 nicklas 409     {
8083 20 Oct 22 nicklas 410       if (allColumns[i].checked)
7773 17 Feb 20 nicklas 411       {
8083 20 Oct 22 nicklas 412         var col = allColumns[i];
8083 20 Oct 22 nicklas 413         data.column = Data.get(col, 'column-id');
8083 20 Oct 22 nicklas 414         data.property = propertyPrefix+data.column;
8083 20 Oct 22 nicklas 415         data.title = titlePrefix + (data.column == '.' ? '' : '.'+Data.get(col, 'column-title'));
7842 01 Sep 20 nicklas 416         Events.sendCustomEvent(window.opener.Doc.element('selectRelatedItemColumn'), 'base-selected', data);
7773 17 Feb 20 nicklas 417         numSelected++;
8083 20 Oct 22 nicklas 418         // Remove the column from the list
8083 20 Oct 22 nicklas 419         var div = col.parentNode.parentNode;
8083 20 Oct 22 nicklas 420         div.parentNode.removeChild(div);
7773 17 Feb 20 nicklas 421       }
7773 17 Feb 20 nicklas 422     }
7773 17 Feb 20 nicklas 423     
7773 17 Feb 20 nicklas 424     if (numSelected == 0)
7773 17 Feb 20 nicklas 425     {
8083 20 Oct 22 nicklas 426       Forms.showNotification('columnstable', 'Please select at least one column!', null, 'pointer-below');
7773 17 Feb 20 nicklas 427       return;
7773 17 Feb 20 nicklas 428     }
7813 19 May 20 nicklas 429     Doc.element('added-column-msg').innerHTML = numSelected == 1 ? 
7813 19 May 20 nicklas 430       '1 column has been added to the table.' : numSelected + ' columns have been added to the table.';
8083 20 Oct 22 nicklas 431     Doc.show('added-column-msg', 'table');
7813 19 May 20 nicklas 432     event.stopPropagation(); // To prevent the hideMessage() method from executing
8083 20 Oct 22 nicklas 433     setTimeout(configure.hideMessage, 2000);
7773 17 Feb 20 nicklas 434   }
7773 17 Feb 20 nicklas 435   
7813 19 May 20 nicklas 436   configure.hideMessage = function(event)
7813 19 May 20 nicklas 437   {
7813 19 May 20 nicklas 438     Doc.hide('added-column-msg');
7813 19 May 20 nicklas 439   }
7813 19 May 20 nicklas 440   
7773 17 Feb 20 nicklas 441   return configure;
7773 17 Feb 20 nicklas 442 }();
7773 17 Feb 20 nicklas 443
7773 17 Feb 20 nicklas 444 Doc.onLoad(Configure.initPage);