[Rt-commit] r2828 - in rt/branches/CHALDEA-EXPERIMENTAL:
html/Admin/CustomFields html/Elements html/NoAuth lib/RT
autrijus at bestpractical.com
autrijus at bestpractical.com
Tue May 3 08:49:15 EDT 2005
Author: autrijus
Date: Tue May 3 08:49:14 2005
New Revision: 2828
Added:
rt/branches/CHALDEA-EXPERIMENTAL/html/Elements/EditCustomFieldCascaded
rt/branches/CHALDEA-EXPERIMENTAL/html/Elements/EditCustomFieldCombobox
rt/branches/CHALDEA-EXPERIMENTAL/html/NoAuth/combobox.js
Modified:
rt/branches/CHALDEA-EXPERIMENTAL/html/Admin/CustomFields/Modify.html
rt/branches/CHALDEA-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm
Log:
* first cut at a combo box that seems to work.
Modified: rt/branches/CHALDEA-EXPERIMENTAL/html/Admin/CustomFields/Modify.html
==============================================================================
--- rt/branches/CHALDEA-EXPERIMENTAL/html/Admin/CustomFields/Modify.html (original)
+++ rt/branches/CHALDEA-EXPERIMENTAL/html/Admin/CustomFields/Modify.html Tue May 3 08:49:14 2005
@@ -89,7 +89,7 @@
</tr>
</table>
<BR>
-% if ($CustomFieldObj->Id && $CustomFieldObj->Type =~ /^Select/i) {
+% if ($CustomFieldObj->Id && $CustomFieldObj->IsSelectionType) {
<H2><&|/l&>Values</&></H2>
<div>
<& /Admin/Elements/EditCustomFieldValues, CustomField => $CustomFieldObj &>
Added: rt/branches/CHALDEA-EXPERIMENTAL/html/Elements/EditCustomFieldCascaded
==============================================================================
--- (empty file)
+++ rt/branches/CHALDEA-EXPERIMENTAL/html/Elements/EditCustomFieldCascaded Tue May 3 08:49:14 2005
@@ -0,0 +1,61 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC
+%# <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+% while ($Values and my $value = $Values->Next ) {
+<input type="checkbox" name="<%$NamePrefix%><%$CustomField->Id%>-DeleteValueIds" value="<% $value->Id %>"><& ShowCustomFieldImage, Object => $value &>
+<br>
+% }
+% if (!$MaxValues or !$Values or $Values->Count < $MaxValues) {
+...
+% }
+<%ARGS>
+$Object => undef
+$CustomField => undef
+$NamePrefix => undef
+$Default => undef
+$Values => undef
+$Multiple => 0
+$Rows => undef
+</%ARGS>
Added: rt/branches/CHALDEA-EXPERIMENTAL/html/Elements/EditCustomFieldCombobox
==============================================================================
--- (empty file)
+++ rt/branches/CHALDEA-EXPERIMENTAL/html/Elements/EditCustomFieldCombobox Tue May 3 08:49:14 2005
@@ -0,0 +1,81 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC
+%# <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+% while ($Values and my $value = $Values->Next and $Multiple) {
+<input type="checkbox" name="<%$NamePrefix%><%$CustomField->Id%>-DeleteValueIds" value="<% $value->Id %>"><% $value->Content %>
+<br>
+% }
+% (!$Multiple or !$MaxValues or !$Values or $Values->Count < $MaxValues) or return;
+% my $name = $NamePrefix . $CustomField->Id . "-Values";
+<script type="text/javascript" src="<%$RT::WebPath%>/NoAuth/combobox.js"></script>
+
+<span id="<% $name %>_Container">
+<input name="<% $name %>" value="<% $Default %>" type="text" id="<% $name %>" autocomplete="off" />
+<span id="<% $name %>_Button"></span></span><select name="List-<% $name %>" id="<% $name %>_List" onchange="ComboBox_SimpleAttach(this, this.form['<% $name %>']); " rows="<% $Rows %>">
+% my $CFVs = $CustomField->Values;
+% while ($CFVs and my $value = $CFVs->Next ) {
+ <option value="<%$value->Name%>"><% $value->Name%></option>
+% }
+</select>
+<script language="javascript"><!--
+var ComboBoxes = new Array('<% $name %>');
+if ( typeof( window.addEventListener ) != "undefined" ) {
+ window.addEventListener("load", ComboBox_Init, false);
+} else if ( typeof( window.attachEvent ) != "undefined" ) {
+ window.attachEvent("onload", ComboBox_Init);
+} else {
+ ComboBox_Init();
+}
+//--></script>
+<%ARGS>
+$Object => undef
+$CustomField => undef
+$NamePrefix => undef
+$Default => undef
+$Values => undef
+$Multiple => 0
+$Rows => undef
+$MaxValues => undef
+</%ARGS>
Added: rt/branches/CHALDEA-EXPERIMENTAL/html/NoAuth/combobox.js
==============================================================================
--- (empty file)
+++ rt/branches/CHALDEA-EXPERIMENTAL/html/NoAuth/combobox.js Tue May 3 08:49:14 2005
@@ -0,0 +1,235 @@
+function ComboBox_Init() {
+ if ( ComboBox_UplevelBrowser() ) {
+ for( var i = 0; i < ComboBoxes.length; i++ ) {
+ ComboBox_Load( ComboBoxes[i] );
+ }
+ }
+}
+function ComboBox_UplevelBrowser() {
+ if( typeof( document.getElementById ) == "undefined" ) return false;
+ var combo = document.getElementById( ComboBoxes[0] + "_Container" );
+ if( combo == null || typeof( combo ) == "undefined" ) return false;
+ if( typeof( combo.style ) == "undefined" ) return false;
+ if( typeof( combo.innerHTML ) == "undefined" ) return false;
+ return true;
+}
+function ComboBox_Load( comboId ) {
+ var combo = document.getElementById( comboId + "_Container" );
+ var button = document.getElementById( comboId + "_Button" );
+ var list = document.getElementById( comboId + "_List" );
+ var text = document.getElementById( comboId );
+
+
+ combo.List = list;
+ combo.Button = button;
+ combo.Text = text;
+ combo.style.border = "2px inset ButtonFace";
+ combo.style.padding = "0px";
+ combo.style.margin = "0px";
+
+ button.Container = combo;
+ button.Toggle = ComboBox_ToggleList;
+ button.onclick = button.Toggle;
+ button.onmouseover = function(e) { this.Container.List.DisableBlur(e); };
+ button.onmouseout = function(e) { this.Container.List.EnableBlur(e); };
+ button.style.padding = "0px";
+ button.style.margin = "0px";
+ button.style.background = "ButtonFace";
+ button.style.color = "ButtonText";
+ button.style.borderLeft = "1px outset ButtonFace";
+ button.style.cursor = "default";
+ button.style.fontSize = "8pt";
+ button.innerHTML = "\u25BC";
+ button.onselectstart = function(e){ return false; };
+
+ text.Container = combo;
+ text.TypeDown = ComboBox_TextTypeDown;
+ text.KeyAccess = ComboBox_TextKeyAccess;
+ text.onkeyup = function(e) { this.KeyAccess(e); this.TypeDown(e); };
+ text.style.border = "none";
+ text.style.margin = "0px";
+ text.style.padding = "0px";
+ text.style.width = ( list.offsetWidth ) + "px";
+
+ list.Container = combo;
+ list.Show = ComboBox_ShowList;
+ list.Hide = ComboBox_HideList;
+ list.EnableBlur = ComboBox_ListEnableBlur;
+ list.DisableBlur = ComboBox_ListDisableBlur;
+ list.Select = ComboBox_ListItemSelect;
+ list.ClearSelection = ComboBox_ListClearSelection;
+ list.KeyAccess = ComboBox_ListKeyAccess;
+ list.FireTextChange = ComboBox_ListFireTextChange;
+ list.onchange = null;
+ list.onclick = function(e){ this.Select(e); this.ClearSelection(); this.FireTextChange(); };
+ list.onkeyup = function(e) { this.KeyAccess(e); };
+ list.EnableBlur(null);
+ list.style.position = "absolute";
+ list.style.zIndex = 200;
+ list.size = ComboBox_GetListSize( list );
+ list.IsShowing = true;
+ list.Hide();
+
+}
+function ComboBox_InitEvent( e ) {
+ if( typeof( e ) == "undefined" && typeof( window.event ) != "undefined" ) e = window.event;
+ if( e == null ) e = new Object();
+ return e;
+}
+function ComboBox_ListClearSelection() {
+ if ( typeof( this.Container.Text.createTextRange ) == "undefined" ) return;
+ var rNew = this.Container.Text.createTextRange();
+ rNew.moveStart('character', this.Container.Text.value.length) ;
+ rNew.select();
+}
+function ComboBox_GetListSize( theList ) {
+ ComboBox_EnsureListSize( theList );
+ return theList.listSize;
+}
+function ComboBox_EnsureListSize( theList ) {
+ if ( typeof( theList.listSize ) == "undefined" ) {
+ if( typeof( theList.getAttribute ) != "undefined" ) {
+ if( theList.getAttribute( "listSize" ) != null && theList.getAttribute( "listSize" ) != "" ) {
+ theList.listSize = theList.getAttribute( "listSize" );
+ return;
+ }
+ }
+ if( theList.options.length > 0 ) {
+ theList.listSize = theList.options.length;
+ return;
+ }
+ theList.listSize = 4;
+ }
+}
+function ComboBox_ListKeyAccess(e) { //Make enter/space and escape do the right thing :)
+ e = ComboBox_InitEvent( e );
+ if( e.keyCode == 13 || e.keyCode == 32 ) {
+ this.Select();
+ return;
+ }
+ if( e.keyCode == 27 ) {
+ this.Hide();
+ this.Container.Text.focus();
+ return;
+ }
+}
+function ComboBox_TextKeyAccess(e) { //Make alt+arrow expand the list
+ e = ComboBox_InitEvent( e );
+ if( e.altKey && (e.keyCode == 38 || e.keyCode == 40) ) {
+ this.Container.List.Show();
+ }
+}
+function ComboBox_TextTypeDown(e) { //Make the textbox do a type-down on the list
+ e = ComboBox_InitEvent( e );
+ var items = this.Container.List.options;
+ if( this.value == "" ) return;
+ var ctrlKeys = Array( 8, 46, 37, 38, 39, 40, 33, 34, 35, 36, 45, 16, 20 );
+ for( var i = 0; i < ctrlKeys.length; i++ ) {
+ if( e.keyCode == ctrlKeys[i] ) return;
+ }
+ for( var i = 0; i < items.length; i++ ) {
+ var item = items[i];
+ if( item.text.toLowerCase().indexOf( this.value.toLowerCase() ) == 0 ) {
+ this.Container.List.selectedIndex = i;
+ if ( typeof( this.Container.Text.createTextRange ) != "undefined" ) {
+ this.Container.List.Select();
+ }
+ break;
+ }
+ }
+}
+function ComboBox_ListFireTextChange() {
+ var textOnChange = this.Container.Text.onchange;
+ if ( textOnChange != null && typeof(textOnChange) == "function" ) {
+ textOnChange();
+ }
+}
+function ComboBox_ListEnableBlur(e) {
+ this.onblur = this.Hide;
+}
+function ComboBox_ListDisableBlur(e) {
+ this.onblur = null;
+}
+function ComboBox_ListItemSelect(e) {
+ if( this.options.length > 0 ) {
+ var text = this.Container.Text;
+ var oldValue = text.value;
+ var newValue = this.options[ this.selectedIndex ].text;
+ text.value = newValue;
+ if ( typeof( text.createTextRange ) != "undefined" ) {
+ if (newValue != oldValue) {
+ var rNew = text.createTextRange();
+ rNew.moveStart('character', oldValue.length) ;
+ rNew.select();
+ }
+ }
+ }
+ this.Hide();
+ this.Container.Text.focus();
+}
+function ComboBox_ToggleList(e) {
+ if( this.Container.List.IsShowing == true ) {
+ this.Container.List.Hide();
+ } else {
+ this.Container.List.Show();
+ }
+}
+function ComboBox_ShowList(e) {
+ if ( !this.IsShowing && !this.disabled ) {
+ this.style.width = ( this.Container.offsetWidth ) + "px";
+ this.style.top = ( this.Container.offsetHeight + ComboBox_RecursiveOffsetTop(this.Container,true) ) + "px";
+ this.style.left = ( ComboBox_RecursiveOffsetLeft(this.Container,true) ) + "px";
+ ComboBox_SetVisibility(this,true);
+ this.focus();
+ this.IsShowing = true;
+ }
+}
+function ComboBox_HideList(e) {
+ if( this.IsShowing ) {
+ ComboBox_SetVisibility(this,false);
+ this.IsShowing = false;
+ }
+}
+function ComboBox_SetVisibility(theList,isVisible) {
+ var isIE = ( typeof( theList.dataSrc ) != "undefined" ); // dataSrc is an IE-only property which is unlikely to be supported elsewhere
+ if ( isIE ) {
+ if ( isVisible ) {
+ theList.style.visibility = "visible";
+ } else {
+ theList.style.visibility = "hidden";
+ }
+ } else {
+ if ( isVisible ) {
+ theList.style.display = "block";
+ } else {
+ theList.style.display = "none";
+ }
+ }
+}
+function ComboBox_RecursiveOffsetTop(thisObject,isFirst) {
+ if(thisObject.offsetParent) {
+ if ( thisObject.style.position == "absolute" && !isFirst && typeof(document.designMode) != "undefined" ) {
+ return 0;
+ }
+ return (thisObject.offsetTop + ComboBox_RecursiveOffsetTop(thisObject.offsetParent,false));
+ } else {
+ return thisObject.offsetTop;
+ }
+}
+function ComboBox_RecursiveOffsetLeft(thisObject,isFirst) {
+ if(thisObject.offsetParent) {
+ if ( thisObject.style.position == "absolute" && !isFirst && typeof(document.designMode) != "undefined" ) {
+ return 0;
+ }
+ return (thisObject.offsetLeft + ComboBox_RecursiveOffsetLeft(thisObject.offsetParent,false));
+ } else {
+ return thisObject.offsetLeft;
+ }
+}
+function ComboBox_SimpleAttach(selectElement,textElement) {
+ textElement.value = selectElement.options[ selectElement.options.selectedIndex ].text;
+ var textOnChange = textElement.onchange;
+ if ( textOnChange != null && typeof( textOnChange ) == "function" ) {
+ textOnChange();
+ }
+}
Modified: rt/branches/CHALDEA-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm
==============================================================================
--- rt/branches/CHALDEA-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm (original)
+++ rt/branches/CHALDEA-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm Tue May 3 08:49:14 2005
@@ -536,6 +536,22 @@
# }}}
+# {{{ IsSelectionType
+
+=head2 IsSelectionType
+
+Retuns a boolean value indicating whether the C<Values> method makes sense
+to this Custom Field.
+
+=cut
+
+sub IsSelectionType {
+ my $self = shift;
+ $self->Type =~ /(?:Select|Combobox|Cascaded)/;
+}
+
+# }}}
+
=head2 FriendlyType [TYPE, MAX_VALUES]
@@ -576,14 +592,14 @@
'Select up to [_1] values', # loc
],
Combobox => [
- 'Select or enter multiple values', # loc
- 'Select or enter one value', # loc
- 'Select or enter up to [_1] values', # loc
+ 'Combobox: Select or enter multiple values', # loc
+ 'Combobox: Select or enter one value', # loc
+ 'Combobox: Select or enter up to [_1] values', # loc
],
Cascaded => [
- 'Select multiple cascaded values', # loc
- 'Select one cascaded value', # loc
- 'Select up to [_1] cascaded values', # loc
+ 'Cascaded: Select multiple cascaded values', # loc
+ 'Cascaded: Select one cascaded value', # loc
+ 'Cascaded: Select up to [_1] cascaded values', # loc
],
);
@@ -865,7 +881,7 @@
sub TypeComposites {
my $self = shift;
- return grep !/Text-0/, map { ("$_-1", "$_-0") } $self->Types;
+ return grep !/(?:Text|Cascade|Combobox)-0/, map { ("$_-1", "$_-0") } $self->Types;
}
=head2 LookupTypes
More information about the Rt-commit
mailing list