[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