mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
1e0c4ae8d1
Conflicts: cache/Cache.php cli/CliController.php core/Convert.php core/Core.php core/ManifestBuilder.php core/Object.php core/SSViewer.php core/control/ContentController.php core/control/ContentNegotiator.php core/control/FormResponse.php core/control/RequestHandler.php core/control/SilverStripeNavigatorItem.php core/i18n.php core/i18nTextCollector.php core/model/DataObjectSet.php core/model/Hierarchy.php core/model/Image.php core/model/MySQLDatabase.php core/model/SiteConfig.php core/model/SiteTree.php core/model/Translatable.php core/model/VirtualPage.php dev/Debug.php dev/SapphireTest.php dev/TestRunner.php dev/YamlFixture.php dev/install/MySQLDatabaseConfigurationHelper.php docs/en/installation/from-source.md docs/en/topics/themes.md docs/en/tutorials/4-site-search.md email/Mailer.php filesystem/File.php filesystem/Folder.php forms/ComplexTableField.php forms/CurrencyField.php forms/DateField.php forms/FieldSet.php forms/FileField.php forms/FileIFrameField.php forms/HtmlEditorConfig.php forms/HtmlEditorField.php forms/SelectionGroup.php forms/SimpleImageField.php forms/TabSet.php forms/TableField.php forms/TableListField.php forms/TreeDropdownField.php forms/TreeMultiselectField.php integration/Geoip.php javascript/SelectionGroup.js javascript/TreeSelectorField.js javascript/UpdateURL.js javascript/core/jquery.ondemand.js javascript/tiny_mce_improvements.js javascript/tree/tree.js lang/en_US.php search/ContentControllerSearchExtension.php security/Group.php security/Member.php security/PermissionCheckboxSetField.php security/PermissionRole.php security/Security.php static-main.php templates/RelationComplexTableField.ss templates/TableListField.ss tests/ConvertTest.php tests/DataObjectSetTest.php tests/DataObjectTest.php tests/DataObjectTest.yml tests/RequestHandlingTest.php tests/SSViewerTest.php tests/SiteTreePermissionsTest.php tests/SiteTreeTest.php tests/TransactionTest.php tests/api/RestfulServiceTest.php tests/control/DirectorTest.php tests/control/ModelAsControllerTest.php tests/fieldtypes/WidgetAreaEditorTest.php tests/forms/CurrencyFieldTest.php tests/forms/FormTest.php tests/model/DatabaseTest.php tests/model/ImageTest.php tests/search/ContentControllerSearchExtensionTest.php tests/security/MemberAuthenticatorTest.php thirdparty/.gitignore thirdparty/behaviour/behaviour.js thirdparty/firebug-lite/firebug.js thirdparty/firebug-lite/firebugx.js thirdparty/jquery-form/jquery.form.js thirdparty/jquery-livequery/jquery.livequery.js thirdparty/jquery-livequery/test/jquery.js thirdparty/jquery-livequery/test/test.html thirdparty/jquery-livequery/test/test2.html thirdparty/jquery-metadata/META.json thirdparty/jquery-metadata/README thirdparty/jquery-metadata/jquery.metadata.js thirdparty/jquery-metadata/test/index.html thirdparty/jquery-metadata/test/jquery.js thirdparty/jquery-metadata/test/test.js thirdparty/jquery-metadata/test/testrunner.js thirdparty/jquery-metadata/test/testsuite.css thirdparty/jquery-ui-themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_222222_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_2e83ff_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_454545_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_888888_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_cd0a0a_256x240.png thirdparty/jquery-ui/i18n/jquery-ui-i18n.js thirdparty/jquery-ui/i18n/ui.datepicker-ar.js thirdparty/jquery-ui/i18n/ui.datepicker-bg.js thirdparty/jquery-ui/i18n/ui.datepicker-ca.js thirdparty/jquery-ui/i18n/ui.datepicker-cs.js thirdparty/jquery-ui/i18n/ui.datepicker-da.js thirdparty/jquery-ui/i18n/ui.datepicker-de.js thirdparty/jquery-ui/i18n/ui.datepicker-el.js thirdparty/jquery-ui/i18n/ui.datepicker-eo.js thirdparty/jquery-ui/i18n/ui.datepicker-es.js thirdparty/jquery-ui/i18n/ui.datepicker-fa.js thirdparty/jquery-ui/i18n/ui.datepicker-fi.js thirdparty/jquery-ui/i18n/ui.datepicker-fr.js thirdparty/jquery-ui/i18n/ui.datepicker-he.js thirdparty/jquery-ui/i18n/ui.datepicker-hr.js thirdparty/jquery-ui/i18n/ui.datepicker-hu.js thirdparty/jquery-ui/i18n/ui.datepicker-hy.js thirdparty/jquery-ui/i18n/ui.datepicker-id.js thirdparty/jquery-ui/i18n/ui.datepicker-is.js thirdparty/jquery-ui/i18n/ui.datepicker-it.js thirdparty/jquery-ui/i18n/ui.datepicker-ja.js thirdparty/jquery-ui/i18n/ui.datepicker-ko.js thirdparty/jquery-ui/i18n/ui.datepicker-lt.js thirdparty/jquery-ui/i18n/ui.datepicker-lv.js thirdparty/jquery-ui/i18n/ui.datepicker-ms.js thirdparty/jquery-ui/i18n/ui.datepicker-nl.js thirdparty/jquery-ui/i18n/ui.datepicker-no.js thirdparty/jquery-ui/i18n/ui.datepicker-pl.js thirdparty/jquery-ui/i18n/ui.datepicker-pt-BR.js thirdparty/jquery-ui/i18n/ui.datepicker-ro.js thirdparty/jquery-ui/i18n/ui.datepicker-ru.js thirdparty/jquery-ui/i18n/ui.datepicker-sk.js thirdparty/jquery-ui/i18n/ui.datepicker-sl.js thirdparty/jquery-ui/i18n/ui.datepicker-sq.js thirdparty/jquery-ui/i18n/ui.datepicker-sr-SR.js thirdparty/jquery-ui/i18n/ui.datepicker-sr.js thirdparty/jquery-ui/i18n/ui.datepicker-sv.js thirdparty/jquery-ui/i18n/ui.datepicker-th.js thirdparty/jquery-ui/i18n/ui.datepicker-tr.js thirdparty/jquery-ui/i18n/ui.datepicker-uk.js thirdparty/jquery-ui/i18n/ui.datepicker-zh-CN.js thirdparty/jquery-ui/i18n/ui.datepicker-zh-TW.js thirdparty/jquery/jquery.js thirdparty/jsmin/.piston.yml thirdparty/jsmin/jsmin.php thirdparty/prototype/prototype.js thirdparty/scriptaculous/dragdrop.js thirdparty/simplepie/.piston.yml thirdparty/spyc/.piston.yml thirdparty/spyc/README thirdparty/spyc/php4/spyc.php4 thirdparty/spyc/php4/test.php4 thirdparty/spyc/spyc.php thirdparty/spyc/spyc.yaml thirdparty/tinymce-advcode/dialog.html thirdparty/tinymce-advcode/editor_plugin_src.js thirdparty/tinymce-advcode/js/dialog.js thirdparty/tinymce/langs/en.js thirdparty/tinymce/plugins/advhr/langs/en_dlg.js thirdparty/tinymce/plugins/advhr/rule.htm thirdparty/tinymce/plugins/advimage/image.htm thirdparty/tinymce/plugins/advimage/langs/en_dlg.js thirdparty/tinymce/plugins/advlink/langs/en_dlg.js thirdparty/tinymce/plugins/advlink/link.htm thirdparty/tinymce/plugins/emotions/emotions.htm thirdparty/tinymce/plugins/emotions/langs/en_dlg.js thirdparty/tinymce/plugins/example/dialog.htm thirdparty/tinymce/plugins/fullpage/fullpage.htm thirdparty/tinymce/plugins/fullpage/langs/en_dlg.js thirdparty/tinymce/plugins/fullscreen/fullscreen.htm thirdparty/tinymce/plugins/inlinepopups/template.htm thirdparty/tinymce/plugins/media/langs/en_dlg.js thirdparty/tinymce/plugins/media/media.htm thirdparty/tinymce/plugins/paste/js/pasteword.js thirdparty/tinymce/plugins/paste/langs/en_dlg.js thirdparty/tinymce/plugins/paste/pastetext.htm thirdparty/tinymce/plugins/paste/pasteword.htm thirdparty/tinymce/plugins/searchreplace/langs/en_dlg.js thirdparty/tinymce/plugins/searchreplace/searchreplace.htm thirdparty/tinymce/plugins/spellchecker/editor_plugin.js thirdparty/tinymce/plugins/spellchecker/editor_plugin_src.js thirdparty/tinymce/plugins/style/langs/en_dlg.js thirdparty/tinymce/plugins/style/props.htm thirdparty/tinymce/plugins/table/cell.htm thirdparty/tinymce/plugins/table/langs/en_dlg.js thirdparty/tinymce/plugins/table/merge_cells.htm thirdparty/tinymce/plugins/table/row.htm thirdparty/tinymce/plugins/table/table.htm thirdparty/tinymce/plugins/template/langs/en_dlg.js thirdparty/tinymce/plugins/template/template.htm thirdparty/tinymce/plugins/xhtmlxtras/abbr.htm thirdparty/tinymce/plugins/xhtmlxtras/acronym.htm thirdparty/tinymce/plugins/xhtmlxtras/attributes.htm thirdparty/tinymce/plugins/xhtmlxtras/cite.htm thirdparty/tinymce/plugins/xhtmlxtras/del.htm thirdparty/tinymce/plugins/xhtmlxtras/ins.htm thirdparty/tinymce/plugins/xhtmlxtras/langs/en_dlg.js thirdparty/tinymce/themes/advanced/about.htm thirdparty/tinymce/themes/advanced/anchor.htm thirdparty/tinymce/themes/advanced/charmap.htm thirdparty/tinymce/themes/advanced/color_picker.htm thirdparty/tinymce/themes/advanced/image.htm thirdparty/tinymce/themes/advanced/langs/en.js thirdparty/tinymce/themes/advanced/langs/en_dlg.js thirdparty/tinymce/themes/advanced/link.htm thirdparty/tinymce/themes/advanced/source_editor.htm thirdparty/tinymce/themes/simple/langs/en.js thirdparty/tinymce/tiny_mce.js thirdparty/tinymce/tiny_mce_src.js widgets/Widget.php
437 lines
13 KiB
JavaScript
Executable File
437 lines
13 KiB
JavaScript
Executable File
/**
|
|
* TreeDropdownField.js
|
|
*/
|
|
TreeDropdownField = Class.extend('Observable');
|
|
TreeDropdownField.prototype = {
|
|
initialize: function() {
|
|
// Hook up all the fieldy bits
|
|
this.editLink = this.getElementsByTagName('a')[0];
|
|
if (this.getElementsByTagName('span').length > 0) {
|
|
// no search, humanItems is a span
|
|
this.humanItems = this.getElementsByTagName('span')[0];
|
|
this.inputTag = this.getElementsByTagName('input')[0];
|
|
}
|
|
else {
|
|
// search is present, humanItems is an input
|
|
this.inputTag = this.getElementsByTagName('input')[0];
|
|
this.humanItems = this.getElementsByTagName('input')[1];
|
|
this.humanItems.onkeyup = this.search_onkeyup;
|
|
}
|
|
this.editLink.treeDropdownField = this;
|
|
this.humanItems.treeDropdownField = this;
|
|
this.inputTag.treeDropdownField = this;
|
|
|
|
this.editLink.onclick = this.edit_click;
|
|
this.humanItems.onclick = this.human_click;
|
|
this.inputTag.setValue = this.setValue.bind(this);
|
|
},
|
|
|
|
destroy: function() {
|
|
if(this.editLink) {
|
|
this.editLink.onclick = null;
|
|
this.editLink.treeDropdownField = null;
|
|
this.editLink = null;
|
|
}
|
|
if(this.humanItems) {
|
|
this.humanItems.onclick = null;
|
|
this.humanItems.treeDropdownField = null;
|
|
this.humanItems = null;
|
|
}
|
|
if(this.inputTag) {
|
|
this.inputTag.setValue = null;
|
|
this.inputTag.treeDropdownField = null;
|
|
this.inputTag = null;
|
|
}
|
|
},
|
|
|
|
getName: function() {
|
|
return this.inputTag.name;
|
|
},
|
|
|
|
refresh: function() {
|
|
this.createTreeNode();
|
|
|
|
this.ajaxGetTree( (function(response) {
|
|
this.newTreeReady(response, false);
|
|
this.updateTreeLabel();
|
|
}).bind(this));
|
|
},
|
|
|
|
// Build a URL from the field's base URL and the given sub URL
|
|
buildURL: function(subURL) {
|
|
var baseURL = jQuery(this).attr('href');
|
|
if (!baseURL) {
|
|
// Occurs if treedropdown has no form e.g. treefields in widget areas.
|
|
baseURL = this.ownerForm().action + '/field/' + this.getName() + '/';
|
|
var baseTags = document.getElementsByTagName('base');
|
|
var base = (baseTags) ? baseTags[0].href : '';
|
|
if (base == baseURL.substring(0, base.length))
|
|
baseURL = baseURL.substring(base.length);
|
|
}
|
|
var subHasQuerystring = subURL.match(/\?/);
|
|
|
|
if(baseURL.match(/^(.*)\?(.*)$/)) {
|
|
if(subHasQuerystring) return RegExp.$1 + '/' + subURL + '&' + RegExp.$2
|
|
else return RegExp.$1 + '/' + subURL + '?' + RegExp.$2
|
|
} else {
|
|
return baseURL + '/' + subURL;
|
|
}
|
|
},
|
|
ownerForm: function() {
|
|
var f =this.parentNode;
|
|
while(f && f.tagName.toLowerCase() != 'form') f = f.parentNode;
|
|
return f;
|
|
},
|
|
|
|
toggleTree: function() {
|
|
if(this.treeShown) this.hideTree();
|
|
else this.showTree();
|
|
},
|
|
|
|
createTreeNode: function(keepTreeHidden) {
|
|
if(!this.itemTree) {
|
|
this.itemTree = document.createElement('div');
|
|
|
|
if(keepTreeHidden) {
|
|
this.hideTree();
|
|
}
|
|
|
|
this.itemTree.className = 'tree_holder';
|
|
this.itemTree.innerHTML = ss.i18n._t('LOADING', 'Loading...');
|
|
this.appendChild(this.itemTree);
|
|
}
|
|
},
|
|
|
|
deleteTreeNode: function() {
|
|
if (!this.itemTree) return;
|
|
var parent = this.itemTree.parentNode;
|
|
parent.removeChild(this.itemTree);
|
|
this.itemTree = null;
|
|
},
|
|
|
|
showTree: function () {
|
|
if (!this.treeShown) this.saveCurrentState();
|
|
this.treeShown = true;
|
|
|
|
if(this.itemTree) {
|
|
this.itemTree.style.display = 'block';
|
|
// Store this in a parameter so that stopObserving works
|
|
this.bound_testForBlur = this.testForBlur.bind(this);
|
|
Event.observe(document, 'click', this.bound_testForBlur);
|
|
this.stretchIframeIfNeeded();
|
|
} else {
|
|
this.createTreeNode();
|
|
|
|
this.ajaxGetTree( (function(response) {
|
|
this.newTreeReady(response, false);
|
|
this.updateTreeLabel();
|
|
}).bind(this));
|
|
}
|
|
},
|
|
|
|
saveCurrentState: function() {
|
|
this.origHumanText = this.getHumanText();
|
|
},
|
|
|
|
restoreOriginalState: function() {
|
|
this.setHumanText(this.origHumanText);
|
|
},
|
|
|
|
/**
|
|
* If this control is inside an iframe, stretch the iframe out to fit the tree.
|
|
*/
|
|
stretchIframeIfNeeded: function() {
|
|
if(parent && parent.document) {
|
|
if(!this.iframeObj) {
|
|
var iframes = parent.document.getElementsByTagName('iframe')
|
|
var i,item;
|
|
for(i=0;item=iframes[i];i++) {
|
|
if(item.contentWindow == window) {
|
|
this.iframeObj = item;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// This iframe stretching doesn't work with the greybox
|
|
if(this.iframeObj && this.iframeObj.id == 'GB_frame') return;
|
|
|
|
var desiredHeight = Position.cumulativeOffset(this.itemTree)[1] + this.itemTree.offsetHeight + 2;
|
|
if(this.iframeObj && desiredHeight > this.iframeObj.offsetHeight) {
|
|
this.iframeObj.oldHeight = this.iframeObj.offsetHeight;
|
|
this.iframeObj.style.height = desiredHeight + 'px';
|
|
}
|
|
}
|
|
},
|
|
|
|
unstretchIframeIfNeeded: function() {
|
|
if(this.iframeObj && this.iframeObj.oldHeight)
|
|
this.iframeObj.style.height = this.iframeObj.oldHeight + 'px';
|
|
},
|
|
|
|
testForBlur: function (event) {
|
|
var clicked = Event.element(event);
|
|
if(clicked != this.itemTree && !hasAncestor(clicked, this.itemTree) && clicked != this.editLink && clicked != this.humanItems) {
|
|
this.hideTree();
|
|
}
|
|
},
|
|
|
|
hideTree: function() {
|
|
this.treeShown = false;
|
|
if(this.itemTree) {
|
|
this.itemTree.style.display = 'none';
|
|
if(this.bound_testForBlur) Event.stopObserving(document, 'click', this.bound_testForBlur);
|
|
// this.editLink.style.display = this.humanItems.style.display = 'block';
|
|
this.unstretchIframeIfNeeded();
|
|
}
|
|
// this.style.position = '';
|
|
},
|
|
|
|
ajaxGetTree: function(after) {
|
|
var ajaxURL = this.buildURL('tree?forceValue=' + this.inputTag.value);
|
|
var secId = jQuery(':input[name=SecurityID]');
|
|
ajaxURL += secId.length ? '&SecurityID=' + secId.val() : '';
|
|
var localeField = jQuery(this.ownerForm()).find(':input[name=locale],:input[name=Locale]');
|
|
if(localeField.length) {ajaxURL += "&locale=" + localeField.val();}
|
|
if(this.inputTag.value) ajaxURL += '&forceValue=' + this.inputTag.value;
|
|
if(this.search() != null) ajaxURL += "&search=" + this.search();
|
|
new Ajax.Request(ajaxURL, {
|
|
method : 'get',
|
|
onSuccess : after,
|
|
onFailure : function(response) { errorMessage("Error getting data", response); }
|
|
})
|
|
},
|
|
|
|
search: function() {
|
|
if (this.humanItems.nodeName != 'INPUT' || !this.searched) return null;
|
|
return this.humanItems.value;
|
|
},
|
|
|
|
/**
|
|
* Called once the tree has been delivered from ajax
|
|
*/
|
|
newTreeReady: function (response, keepTreeHidden) {
|
|
this.itemTree.innerHTML = response.responseText;
|
|
// HACK IE6: see http://www.hedgerwow.com/360/bugs/css-select-free.html
|
|
this.itemTree.appendChild(document.createElement('iframe'));
|
|
this.tree = Tree.create(this.itemTree.getElementsByTagName('ul')[0], {
|
|
ajaxExpansion: this.ajaxExpansion,
|
|
getIdx: function() {
|
|
return this.getElementsByTagName('a')[0].getAttribute('rel');
|
|
},
|
|
idxBase : 'selector-' + this.getName() + '-',
|
|
dropdownField : this,
|
|
onselect : this.tree_click
|
|
});
|
|
|
|
// Select the appropriate items
|
|
var selectedItems = this.inputTag.value.split(/ *, */);
|
|
var i, isSelected = {};
|
|
for(i=0;i<selectedItems.length;i++) isSelected[selectedItems[i]] = true;
|
|
|
|
if(!keepTreeHidden) {
|
|
this.showTree();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Expander bound to each tree node
|
|
*/
|
|
ajaxExpansion: function() {
|
|
this.addNodeClass('loading');
|
|
var ul = this.treeNodeHolder();
|
|
ul.innerHTML = ss.i18n._t('LOADING', 'Loading...');
|
|
|
|
var ajaxURL = this.options.dropdownField.buildURL('tree/' + this.getIdx());
|
|
ajaxURL += $('SecurityID') ? '&SecurityID=' + $('SecurityID').value : '';
|
|
if($('Form_EditForm_Locale')) ajaxURL += "&locale=" + $('Form_EditForm_Locale').value;
|
|
// ajaxExpansion is called in context of TreeNode, not Tree, so search() doesn't exist.
|
|
if (this.search && this.search() != null) ajaxURL += "&search=" + this.search();
|
|
|
|
new Ajax.Request(ajaxURL, {
|
|
onSuccess : this.installSubtree.bind(this),
|
|
onFailure : function(response) { errorMessage('error loading subtree', response); }
|
|
});
|
|
},
|
|
|
|
setValue: function(val) {
|
|
this.inputTag = this.getElementsByTagName('input')[0];
|
|
|
|
if(this.inputTag.value != val) {
|
|
this.inputTag.value = val;
|
|
jQuery(this).trigger('ss.TreeDropdownField.change', {val: val});
|
|
this.notify('Change', val);
|
|
|
|
// If the tree item is already downloaded, just update the label
|
|
if($('selector-' + this.getName() + '-' + this.inputTag.value)) {
|
|
this.updateTreeLabel();
|
|
|
|
// Otherwise, update the tree with ajax
|
|
} else {
|
|
this.ajaxGetTree( (function(response) {
|
|
this.createTreeNode(true);
|
|
this.newTreeReady(response, true);
|
|
this.updateTreeLabel();
|
|
}).bind(this));
|
|
}
|
|
}
|
|
},
|
|
|
|
updateTreeLabel: function() {
|
|
if ( this.searched || (this.humanItems.nodeName == 'INPUT' && !this.inputTag.value) ) return; // don't update the search
|
|
var treeNode;
|
|
if(treeNode = $('selector-' + this.getName() + '-' + this.inputTag.value)) {
|
|
this.setHumanText(treeNode.getTitle());
|
|
|
|
if(treeNode.tree.selected && treeNode.tree.selected.removeNodeClass) treeNode.tree.selected.removeNodeClass('current');
|
|
treeNode.addNodeClass('current');
|
|
this.tree.selected = treeNode;
|
|
|
|
} else {
|
|
this.setHumanText(this.inputTag.value ? this.inputTag.value : '(Choose)');
|
|
}
|
|
},
|
|
|
|
getHumanText: function() {
|
|
return this.humanItems.nodeName == 'INPUT' ? this.humanItems.value : this.humanItems.innerHTML;
|
|
},
|
|
|
|
setHumanText: function (s) {
|
|
if (this.humanItems.nodeName == 'INPUT')
|
|
this.humanItems.value = s;
|
|
else
|
|
this.humanItems.innerHTML = s;
|
|
},
|
|
|
|
setValueFromTree: function(treeID, title) {
|
|
this.setHumanText(title);
|
|
this.inputTag.value = treeID.replace('selector-' + this.getName() + '-','');
|
|
jQuery(this).trigger('ss.TreeDropdownField.change', {val: this.inputTag.value});
|
|
this.notify('Change', this.inputTag.value);
|
|
|
|
this.hideTree();
|
|
},
|
|
|
|
edit_click : function() {
|
|
if (this.treeDropdownField.treeShown) this.treeDropdownField.restoreOriginalState();
|
|
this.treeDropdownField.toggleTree();
|
|
return false;
|
|
},
|
|
|
|
search_onkeyup: function(e) {
|
|
if(typeof window.event!="undefined") e=window.event; //code for IE
|
|
if (e.keyCode == 27) { // esc, cancel the selection and hide the tree.
|
|
this.treeDropdownField.restoreOriginalState();
|
|
this.treeDropdownField.hideTree();
|
|
}
|
|
else {
|
|
var that = this;
|
|
clearTimeout(this.timeout);
|
|
this.timeout = setTimeout(function() {
|
|
that.treeDropdownField.searched = true;
|
|
that.treeDropdownField.deleteTreeNode();
|
|
that.treeDropdownField.showTree();
|
|
}, 750);
|
|
}
|
|
},
|
|
|
|
human_click: function() {
|
|
if (this.treeDropdownField.humanItems.nodeName != 'INPUT') {
|
|
if (this.treeDropdownField.treeShown) this.treeDropdownField.restoreOriginalState();
|
|
this.treeDropdownField.toggleTree();
|
|
return false;
|
|
}
|
|
|
|
if (!this.treeDropdownField.treeShown) this.treeDropdownField.toggleTree();
|
|
if (!this.treeDropdownField.defaultCleared || !this.treeDropdownField.searched) {
|
|
this.treeDropdownField.defaultCleared = true;
|
|
this.treeDropdownField.setHumanText('');
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
tree_click : function() {
|
|
this.options.dropdownField.setValueFromTree(this.id, this.getTitle());
|
|
|
|
if(this.tree.selected && this.tree.selected.removeNodeClass) this.tree.selected.removeNodeClass('current');
|
|
this.addNodeClass('current');
|
|
this.tree.selected = this;
|
|
|
|
this.options.dropdownField.searched = false;
|
|
}
|
|
}
|
|
|
|
TreeMultiselectField = Class.extend('TreeDropdownField');
|
|
TreeMultiselectField.prototype = {
|
|
destroy: function() {
|
|
if(this.TreeDropdownField) this.TreeDropdownField.destroy();
|
|
this.TreeDropdownField = null;
|
|
},
|
|
|
|
newTreeReady: function (response) {
|
|
this.TreeDropdownField.newTreeReady(response);
|
|
MultiselectTree.create(this.tree);
|
|
this.tree.options.onselect = this.updateVal.bind(this);
|
|
|
|
// Select the appropriate items
|
|
var selectedItems = this.inputTag.value.split(/ *, */);
|
|
var i, isSelected = {};
|
|
for(i=0;i<selectedItems.length;i++) isSelected[selectedItems[i]] = true;
|
|
|
|
var allNodes = this.tree.getElementsByTagName('li');
|
|
|
|
for(i=0;i<allNodes.length;i++) {
|
|
allNodes[i].id.match(/([^-]+)-(\d+)$/);
|
|
var idx = RegExp.$2
|
|
if(isSelected[idx]) {
|
|
this.tree.selectNode(allNodes[i]);
|
|
allNodes[i].expose();
|
|
}
|
|
}
|
|
},
|
|
|
|
hideTree: function() {
|
|
this.TreeDropdownField.hideTree();
|
|
if(this.tree) this.updateVal();
|
|
},
|
|
|
|
/**
|
|
* Update the inputTag and humanItems from the currently selected nodes.
|
|
*/
|
|
updateVal: function() {
|
|
var internalVal = humanVal = "";
|
|
|
|
for(i in this.tree.selectedNodes) {
|
|
internalVal += (internalVal?',':'') + i;
|
|
humanVal += (humanVal?', ':'') + this.tree.selectedNodes[i];
|
|
}
|
|
|
|
this.inputTag.value = internalVal;
|
|
this.setHumanText(humanVal);
|
|
},
|
|
|
|
updateTreeLabel: function() {
|
|
var treeNode;
|
|
|
|
if(this.inputTag.value) {
|
|
var innerHTML = '';
|
|
var selectedItems = this.inputTag.value.split(/ *, */);
|
|
for(i=0;i<selectedItems.length;i++) {
|
|
if(treeNode = $('selector-' + this.getName() + '-' + selectedItems[i])) {
|
|
innerHTML += (innerHTML?', ':'') + treeNode.getTitle();
|
|
} else {
|
|
innerHTML += selectedItems[i];
|
|
}
|
|
}
|
|
this.setHumanText(innerHTML);
|
|
} else {
|
|
this.setHumanText('(Choose)');
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
TreeMultiselectField.applyTo('div.TreeDropdownField.multiple');
|
|
TreeDropdownField.applyTo('div.TreeDropdownField.single');
|