|
From: <ken...@us...> - 2008-10-30 13:38:16
|
Revision: 817
http://andro.svn.sourceforge.net/andro/?rev=817&view=rev
Author: kendowns
Date: 2008-10-30 13:38:07 +0000 (Thu, 30 Oct 2008)
Log Message:
-----------
Two Major Contributions
1) Rudimentary HTML generation routines that mimic the PHP-side androHTML and its ilk. Not intended for full-blown client-side HTML, intended for simple generation of HTML w/o using document.createElement() (slow) or having to build strings (error prone and ugly).
2) Created all browser-side code for an editable grid based on the "tabDiv" widget.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-10-28 20:59:30 UTC (rev 816)
+++ trunk/andro/clib/x6.js 2008-10-30 13:38:07 UTC (rev 817)
@@ -36,17 +36,8 @@
on and off by commenting and uncommenting the relevant lines.
# Beanshell: Turn logging off by commenting out lines
- # NOTICE: THE FIRST AND SECOND LINES HAVE THE STRING LITERAL '* /'
- # YOU MUST REMOVE THAT SPACE WHEN YOU RUN THESE
- SearchAndReplace.setSearchString("/*C* /");
- SearchAndReplace.setReplaceString("/*C* / //");
- SearchAndReplace.setBeanShellReplace(false);
- SearchAndReplace.setIgnoreCase(true);
- SearchAndReplace.setRegexp(false);
- SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
- SearchAndReplace.replaceAll(view);
SearchAndReplace.setSearchString("//console.");
- SearchAndReplace.setReplaceString("////console.");
+ SearchAndReplace.setReplaceString("//console.");
SearchAndReplace.setBeanShellReplace(false);
SearchAndReplace.setIgnoreCase(true);
SearchAndReplace.setRegexp(false);
@@ -54,16 +45,7 @@
SearchAndReplace.replaceAll(view);
# Beanshell: Turn logging on by uncommenting the lines.
- # NOTICE: THE FIRST AND SECOND LINES HAVE THE STRING LITERAL '* /'
- # YOU MUST REMOVE THAT SPACE WHEN YOU RUN THESE
- SearchAndReplace.setSearchString("/*C* / //");
- SearchAndReplace.setReplaceString("/*C* /");
- SearchAndReplace.setBeanShellReplace(false);
- SearchAndReplace.setIgnoreCase(true);
- SearchAndReplace.setRegexp(false);
- SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
- SearchAndReplace.replaceAll(view);
- SearchAndReplace.setSearchString("////console.");
+ SearchAndReplace.setSearchString("//console.");
SearchAndReplace.setReplaceString("//console.");
SearchAndReplace.setBeanShellReplace(false);
SearchAndReplace.setIgnoreCase(true);
@@ -71,7 +53,162 @@
SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
SearchAndReplace.replaceAll(view);
\* ================================================================== */
+
+/****O* Javascript-API/jsHtml
+*
+* NAME
+* Javascript-API.jsHtml
+*
+* FUNCTION
+* The javascript function jsHtml is a constructor
+* function for a new HTML node. It is considerably
+* faster and easier than document.createElement() and
+* node.appendChild.
+*
+* This function works almost exactly the same way as the
+* PHP function html(), except that it works in the
+* browser.
+*
+* The resulting object is considerably simpler than the
+* HTML nodes you can create in PHP, and is designed
+* only for basic tasks. There are no shortcuts for
+* creating complex entities, those must be coded by
+* hand.
+*
+* You can pass the innerHTML in as the second parameter,
+* or you can set it directly by assigning the innerHtml
+* property of the object.
+*
+* INPUTS
+* * string - a valid (x)html tag name like 'div' or 'span'
+* * string - (optional) the value of innerHtml
+*
+* EXAMPLE
+* Use the Javascript "new" operator with this function.
+* <script>
+* var div = new jsHtml('div','Hello, I am a div!');
+* div.hp.style = 'width: 300px';
+* var html = div.bufferedRender();
+* $( -- some jquery selector -- ).append(html);
+* </script>
+*
+******
+*/
+function jsHtml(tag,innerHtml) {
+ this.tag = tag;
+ this.children = [ ];
+ this.hp = { };
+
+ /****O* jsHtml.innerHtml
+ *
+ * NAME
+ * jsHtml.innerHtml
+ *
+ * FUNCTION
+ * The javascript property innerHtml holds the innerHTML
+ * of an HTML node created by jsHtml(). You can pass in
+ * the innerHtml as the second parameter to jsHtml, or
+ * you can set this property directly.
+ *
+ * EXAMPLE
+ * Use the Javascript "new" operator with this function.
+ * <script>
+ * var div = new jsHtml('div');
+ * div.innerHtml = 'I set this on the 2nd line!';
+ * var html = div.bufferedRender();
+ * $( -- some jquery selector -- ).append(html);
+ * </script>
+ *
+ ******
+ */
+ this.innerHtml = innerHtml ? innerHtml : '';
+ /****O* jsHtml.addChild
+ *
+ * NAME
+ * jsHtml.addChild
+ *
+ * FUNCTION
+ * The javascript method addChild adds one HTML node as
+ * a child to another. Both nodes must have been
+ * created by using the jsHtml() constructor function.
+ *
+ * EXAMPLE
+ * Use the Javascript "new" operator with this function.
+ * <script>
+ * var div = new jsHtml('div');
+ * var span = new jsHtml('span','A span in a div!');
+ * div.addChild(span);
+ * var html = div.bufferedRender();
+ * $( -- some jquery selector -- ).append(html);
+ * </script>
+ *
+ ******
+ */
+ this.addChild = function(child) {
+ this.children.push(child);
+ }
+ /******/
+
+ /****O* jsHtml.h
+ *
+ * NAME
+ * jsHtml.h
+ *
+ * FUNCTION
+ * The javascript method h creates a new HTML node and
+ * makes it a child of the current node. This is a
+ * shortcut for having to call jsHtml and then
+ * addChild.
+ *
+ * EXAMPLE
+ * Use the Javascript "new" operator with this function.
+ * <script>
+ * var div = new jsHtml('div');
+ * var span = div.h('span','Hello!');
+ * var html = div.bufferedRender();
+ * $( -- some jquery selector -- ).append(html);
+ * </script>
+ *
+ ******
+ */
+ this.h = function(tag,innerHtml) {
+ var newNode = new jsHtml(tag,innerHtml);
+ this.addChild(newNode);
+ return newNode;
+ }
+ /******/
+
+ /****O* jsHtml.bufferedRender
+ *
+ * NAME
+ * jsHtml.bufferedRender
+ *
+ * FUNCTION
+ * The javascript method bufferedRender returns a string
+ * of HTML for a node created with jsHtml. It sets all
+ * properties, and recursively runs through all children.
+ * The innerHtml, if it is present, goes out last.
+ *
+ * SOURCE
+ */
+ this.bufferedRender = function() {
+ var html = '<' + this.tag;
+ for(var attName in this.hp) {
+ html+=' '+attName+'="'+this.hp[attName]+'"';
+ }
+ html+=">";
+ for(var idx in this.children) {
+ html+=this.children[idx].bufferedRender();
+ }
+ html+=this.innerHtml;
+ html+='</'+this.tag+'>';
+ return html;
+ }
+ /******/
+
+}
+
/****O* Javascript-API/x6events
*
@@ -151,7 +288,7 @@
* SOURCE
*/
subscribeToEvent: function(eventName,id) {
- /*C*/ // var ux=u.uniqueId(); //console.group("subscribeToEvent "+ux);
+ //console.group("subscribeToEvent "+eventName);
//console.log("event name: ",eventName)
//console.log("id subscbr: ",id);
if(id=='undefined') {
@@ -173,7 +310,7 @@
this.subscribers[eventName] = [ ];
}
this.subscribers[eventName].push(id);
- /*C*/ // //console.groupEnd("subscribeToEvent "+ux);
+ //console.groupEnd();
},
/******/
@@ -229,7 +366,7 @@
*/
retvals: { },
fireEvent: function(eventName,arguments) {
- /*C*/ // var ux=u.uniqueId(); //console.group("fireEvent "+eventName+' '+ux);
+ //console.group("fireEvent "+eventName);
//console.log('arguments: ',arguments);
// Find out if anybody is listening for this event
var subscribers = this.getSubscribers(eventName);
@@ -261,7 +398,7 @@
}
}
//console.log("RETURNING: ",this.retvals[eventName]);
- /*C*/ // //console.groupEnd("fireEvent "+ux);
+ //console.groupEnd();
return this.retvals[eventName];
}
}
@@ -284,7 +421,7 @@
// DOM elements with property x6plugIn=xxx.
// Invoke the constructor for each one.
init: function() {
- //u.debugFlag = true;
+ u.debugFlag = true;
// Job 1: Activate all of the plugins
for(var plugInId in x6plugins) {
@@ -292,9 +429,8 @@
if(u.p(this,'id','')=='') {
this.id = u.uniqueId();
}
- u.debug(
- "Initializing object "+this.id+" as plugIn "+plugInId
- );
+ s="Initializing object "+this.id+" as plugIn "+plugInId;
+ //console.log(s);
this.zTable = u.p(this,'x6table');
x6plugins[plugInId](this,this.id,u.p(this,'x6table'));
});
@@ -302,16 +438,19 @@
// Job 2, activate a global keyboard handler
$(document).keypress(function(e) {
- u.debug("document.keypress (BEGIN)",1);
+ //console.group("Document Keypress");
+ //console.log(e);
var retval= x6.keyDispatcher(e);
- u.debug("document.keypress (END)",-1);
+ //console.groupEnd();
return retval;
});
- // Fade in anybody who has been asked to fade in,
- // and when finished put focus onto whichever
- // object has asked for it.
- $('.fadein').fadeIn('slow',function() { x6.initFocus(); });
+ // We used to fade in here, but that was no good, because
+ // the fade in would occur before any page-specific code
+ // had run, and the user would see things jumping around.
+ // Now the index_hidden x6 dispatcher sends this command
+ // very last, so it is the last thing that happens.
+ //$('.fadein').fadeIn('slow',function() { x6.initFocus(); });
},
initFocus: function() {
@@ -392,21 +531,21 @@
var stopThem = [ 'CtrlF5', 'F10' ];
// Now we have a complete key label, fire the event
- u.debug("In x6.keyDispatch, code and event follow");
- u.debug(retval);
- u.debug(e);
+ //console.log("In x6.keyDispatch, code and event follow");
+ //console.log(retval);
+ //console.log(e);
if(stopThem.indexOf(retval)>0) {
- u.debug("x6.keyDispatch: key is in force stop list, stopping propagation.");
+ //console.log("x6.keyDispatch: key is in force stop list, stopping propagation.");
e.stopPropagation();
return false;
}
else if (!x6events.fireEvent('key_'+retval,null)) {
- u.debug("x6.keyDispatch: handler returned false, stopping propagation.");
+ //console.log("x6.keyDispatch: handler returned false, stopping propagation.");
e.stopPropagation();
return false;
}
else {
- u.debug("x6.keyDispatch: handler returned true, continuing propagation.");
+ //console.log("x6.keyDispatch: handler returned true, continuing propagation.");
return true;
}
}
@@ -418,24 +557,46 @@
\* **************************************************************** */
var x6inputs = {
+ // This routine takes an input that has no x6 event
+ // handlers and adds all of the event handlers to it
+ initInput: function(input,tabIndex,mode) {
+ //console.group("Initializing Input");
+ //console.log(tabIndex,mode);
+ //console.log(input);
+ $(input)
+ .keyup(function(e) { x6inputs.keyUp(e,this) })
+ .keydown(function(e) { x6inputs.keyDown(e,this) })
+ .focus(function(e) { x6inputs.focus(e,this) })
+ .blur(function(e) { x6inputs.blur(e,this) });
+ input.tabIndex = tabIndex;
+ if(mode=='new') {
+ input.zNew = 1;
+ x6inputs.setClass(input);
+ }
+ //console.groupEnd();
+ },
+
// Key up is used to look for changed values because
// you do not see an input's new value until the keyup
// event. You do not see it in keypress or keydown.
keyUp: function(e,inp) {
+ //console.group("Input keyUp");
+ //console.log(e);
+ //console.log(inp);
x6inputs.setClass(inp);
+ //console.groupEnd("Input keyUp");
},
// Keydown is used only for tab or shift tab, to enforce
// the concept of a "tab loop". This function only does
// anything if there are no enabled controls after the
- //
+ // current control
//
keyDown: function(e,inp) {
- //u.debugPush();
- ////console.log(e);
- //u.debug(e);
- //u.debug(inp);
if(e.keyCode!=9) return true;
+ //console.group("input keyDown handler");
+ //console.log(e);
+ //console.log(inp);
// work out which property to use.
if(e.shiftKey) {
@@ -446,8 +607,8 @@
var prop = 'xNextTab';
var jqf = ':first';
}
- //u.debug(prop);
- //u.debug(jqf);
+ //console.log(prop);
+ //console.log(jqf);
// The loop breaks when we find a readable control
// or get to the end of the list
@@ -458,20 +619,20 @@
// at beginning
if( u.p(xinp,prop,'X')=='X') {
jqx = '[tabindex]:not([disabled])'+jqf;
- //u.debug("no control found, string to use: "+jqx);
+ //console.log("no control found, string to use: "+jqx);
break;
}
// Advance to next
var tabCandidate = u.p(xinp,prop);
jsq = '[tabindex='+tabCandidate+']';
- //u.debug('advancing to '+jsq);
+ //console.log('advancing to '+jsq);
xinp = $(jsq)[0];
// and if the next is not disabled, return TRUE,
// do NOTHING, and the browser will handle it
if(u.p(xinp,'disabled',false)==false) {
- //u.debug("next control is not read only, letting browse do it");
+ //console.log("next control is not read only, letting browse do it");
break;
}
@@ -481,17 +642,21 @@
if(xinp==inp) break;
}
if(jqx=='') {
- //u.debug('not trying to pick focus');
+ //console.log('not trying to pick focus');
}
else {
- //u.debug("trying to pick focus: "+jqx);
+ //console.log("trying to pick focus: "+jqx);
$(jqx).focus();
}
//u.debugPop();
if(jqx=='') {
+ //console.log("returning TRUE");
+ //console.groupEnd();
return true;
}
else {
+ //console.log("PREVENTING DEFAULT AND RETURNING FALSE");
+ //console.groupEnd();
e.preventDefault();
return false;
}
@@ -514,6 +679,9 @@
},
setClass: function(inp) {
+ ux = u.uniqueId();
+ //console.group("setClass for an input "+ux);
+ //console.log(inp);
if(u.p(inp,'zOriginalValue',null)==null) inp.zOriginalValue = '';
if(inp.value==inp.zOriginalValue) {
inp.zChanged = 0;
@@ -537,12 +705,15 @@
else if(zNew) css = 'changed';
else if(zChanged) css = 'changed';
else css = '';
+ //console.log("initial class is "+css);
// Now pick the selected version if required
if(zSelected) css += 'Selected';
+ //console.log("Final class is "+css);
// Now do some stuff if it is read only
inp.disabled = zRO;
+ //console.log("Read Only Decision is",inp.disabled);
// Flag to do the row
doRow = u.p(inp,'xClassRow',0);
@@ -555,6 +726,7 @@
if(doRow && !zSelected) {
inp.parentNode.parentNode.className = '';
}
+ //console.groupEnd();
},
clearOut: function(inp) {
@@ -564,7 +736,12 @@
inp.value = '';
inp.zOriginalValue = '';
x6inputs.setClass(inp);
+ },
+
+ findFocus: function(obj) {
+ $(obj).find(":input:first").focus();
}
+
}
@@ -1209,3 +1386,375 @@
}
}
}
+
+
+/***im* x6plugins/tabDiv
+*
+* NAME
+* x6plugins.tabDiv
+*
+* FUNCTION
+* The Javascript method x6plugins.tabDiv implements
+* all browser-side functionality for Andromeda's built-in
+* plugIn tabDiv. A "tabDiv" appears to the user to be an
+* HTML TABLE but it is implemented with divs.
+*
+* This routine is called automatically by x6.init, there
+* is not usually any reason for calling this routine
+* directly.
+*
+* INPUTS
+* self - the DOM object to be activated.
+* id - the ID of the object to be 'activated'.
+* table - the database table that the tabDiv is handling.
+*
+* RESULTS
+* no return value.
+*
+******
+*/
+x6plugins.x6tabDiv = function(self,id,table) {
+ // Start out by claiming not to be editing
+ // any particular key.
+ self.zSkey = -1;
+
+ // if grid select is 'inline', we subscribe to
+ // requests to edit rows
+ if(u.p(self,'xGridSelect','')=='inline') {
+ x6events.subscribeToEvent('reqEditRow_'+table,id);
+ self['receiveEvent_reqEditRow_'+table] = function(skey) {
+ /* Quiet return if the clicked the row already being edited */
+ if(skey==this.zSkey) return false;
+
+ //console.group('reqEditRow',table);
+ var grid = this;
+
+ /*
+ * If editing a different row, try to save
+ * and clear that row first
+ */
+ if(this.zSkey>-1) {
+ var oldSkey = this.zSkey;
+ if(!x6events.fireEvent('reqSaveRow_'+this.zTable)) {
+ //console.groupEnd();
+ return false;
+ }
+ else {
+ //console.log("removing inputs current row");
+ this.removeInputs(oldSkey);
+ this.zSkey==-1;
+ }
+ }
+
+ // Make sure we have the row, otherwise it is
+ // kind of useless
+ if( $(this).find('#row_'+skey).length == 1) {
+ //console.log("We have the row, we can edit");
+ this.zSkey = skey;
+ this.buttonsOn();
+
+ //console.group("Putting inputs into div cells");
+ $(this).find('.tbody #row_'+skey+' div').each(
+ function() {
+ // Work up to figuring out the name of the
+ // id that holds the hidden input, then
+ // grab the input and put it in.
+ var colnum = u.p(this,'gColumn');
+ var colid = grid.zColsInfo[colnum].column_id;
+ var id = 'wrapper_'+grid.zTable+'_'+colid;
+
+ // Current Value
+ var curval = this.innerHTML;
+ //console.log(id,curval);
+
+ this.innerHTML = u.byId(id).innerHTML;
+ $(this).find(":input")[0].value=curval;
+ //console.log(this.innerHTML);
+ }
+ );
+ //console.groupEnd();
+ }
+
+ //console.groupEnd();
+ }
+ }
+
+ // if grid is editable, xGridReqNew will be set to
+ // 'inline', which means new lines are added directly
+ // to the grid.
+ if(u.p(self,'xGridReqNew','')=='inline') {
+ x6events.subscribeToEvent('reqNewRow_'+table,id);
+
+ self['receiveEvent_reqNewRow_'+table] = function(skey) {
+ //console.group("reqNewLine "+this.zTable);
+ //console.log('Table: '+this.zTable);
+
+ /*
+ * If editing a new row, we will try to save it.
+ * If successful, quietly continue. If it happens
+ * to be all empty, just focus on the row.
+ */
+ if(this.zSkey>-1) {
+ if(!x6events.fireEvent('reqSaveRow_'+this.zTable)) {
+ //console.log('Failed to save new row, no new new row');
+ //console.groupEnd();
+ x6inputs.findFocus( $(this).find("#row_0") );
+ return true;
+ }
+ }
+
+ // We are going to make a new row. Right now it will
+ // go at the top of div.thead, but later it has to
+ // be smarter and go in after the selected row, if any.
+ var newRow = new jsHtml('div');
+ newRow.hp.id = 'row_0';
+ newRow.hp.style = 'display: none;';
+ var numbers = [ 'int', 'numb', 'money' ];
+ //console.log(newRow);
+ for (var idx in this.zColsInfo) {
+ var colInfo = this.zColsInfo[idx];
+ if(colInfo.column_id == '') continue;
+
+ var innerDiv = newRow.h('div');
+ innerDiv.hp.style= "width: "+colInfo.width+"px;";
+ if(numbers.indexOf(colInfo.type_id)>=0) {
+ innerDiv.hp.style+="text-align: right";
+ }
+ var id = '#wrapper_'+this.zTable+'_'+colInfo.column_id;
+ var newInput = $(id).html();
+ //console.log("column: ",colInfo.column_id,newInput);
+ innerDiv.innerHtml = newInput;
+ }
+ //console.log(newRow);
+ // Add this new row into the visuals so it is real
+ $(this).find('.tbody').prepend(newRow.bufferedRender());
+ // Initialize all inputs to behave in x6 mode
+ tabIndex = 1000;
+ $(this).find(':input').each(
+ function() { x6inputs.initInput(this,tabIndex++,'new'); }
+ );
+ $(this).find('#row_0').fadeIn('fast'
+ ,function() { x6inputs.findFocus( this ) }
+ );
+
+ // This warns downstream code that we are working
+ // on a new row.
+ this.zSkey = 0;
+
+ // Turn on buttons
+ this.buttonsOn();
+
+ // Send a message and get lost
+ //console.log('New row created, ready to edit');
+ //console.groupEnd();
+ return true;
+ }
+ }
+
+ // If grid allows either kind of inline row, it must
+ // must accept an abandon request and throw out the row
+ var xSelect = u.p(self,'xGridSelect','');
+ var xReqNew = u.p(self,'xGridReqNew','');
+ if(xSelect == 'inline' || xReqNew == 'inline') {
+ x6events.subscribeToEvent('cancelEdit_'+table,id);
+
+ self['receiveEvent_cancelEdit_'+table] = function(skey) {
+ if(this.zSkey==-1) return false;
+
+ //console.group("Abandon: cancelEdit "+this.zTable);
+ if(this.zSkey==0) {
+ //console.log("Abandoning new row");
+ this.zSkey = -1;
+ this.buttonsOff();
+ $(this).find("#row_0").fadeOut('fast'
+ ,function() { $(this).remove(); }
+ );
+ }
+
+ if(this.zSkey>0) {
+
+ }
+
+ //console.groupEnd();
+ }
+ }
+
+ // An explicit flag set in the PHP side determines
+ // if we accept delete requests
+ if(u.p(self,'xGridReqDel','N')=='Y') {
+ x6events.subscribeToEvent('reqDelRow_'+table,id);
+
+ self['receiveEvent_reqDelRow_'+table] = function() {
+ //console.group("reqDelRow "+table);
+ if(this.zSkey==-1) {
+ //console.log("No row, ignoring");
+ //console.groupEnd();
+ alert("Please select a row first");
+ return;
+ }
+ else if(this.zSkey==0) {
+ //console.log("on a new row, firing cancelEdit command");
+ x6events.fireEvent('cancelEdit_'+this.zTable);
+ }
+ else {
+ if(confirm("Delete the selected row?")) {
+ //console.log("asking server to delete");
+ ua.json.init('x6page',this.zTable);
+ ua.json.addParm('x6action','delete');
+ ua.json.addParm('skey',this.zSkey);
+ if(!ua.json.execute()) {
+ //console.log("server refused to delete");
+ }
+ else {
+ //console.log("server did the delete");
+ $(this).find('#row_'+this.zSkey).fadeOut(
+ function() { $(this).remove(); }
+ );
+ this.zSkey = -1;
+ this.buttonsOff();
+ }
+ }
+ }
+ //console.groupEnd();
+ }
+ }
+
+ // If grid allows either kind of inline row, it must
+ // must accept a save request as well
+ if(xSelect == 'inline' || xReqNew == 'inline') {
+ x6events.subscribeToEvent('reqSaveRow_'+table,id);
+
+ self['receiveEvent_reqSaveRow_'+table] = function() {
+ /* never should get here if zskey=-1 */
+ if(this.zSkey==-1) return false;
+
+ //console.group("Request, Save Row "+this.zTable);
+
+ var allInputs = '';
+ $(this).find("#row_"+this.zSkey+" :input").each(
+ function() {
+ allInputs += this.value.trim();
+ }
+ );
+ if( allInputs=='') {
+ //console.log("Current row is empty, no save");
+ if(this.zSkey==0) {
+ //console.log("New Row, firing cancelEdit, returning TRUE");
+ x6events.fireEvent('cancelEdit_'+this.zTable);
+ //console.groupEnd()
+ return true;
+ }
+ else {
+ //console.log("Must remain on row, returning FALSE");
+ //console.groupEnd()
+ return false;
+ }
+ }
+
+ /* Row is not empty, continue with save */
+ ua.json.init('x6page',this.zTable);
+ ua.json.addParm('x6action','save');
+ ua.json.addParm('x4v_skey',this.zSkey);
+ ua.json.inputs(this);
+ if(!ua.json.execute()) {
+ //console.log("Errors on save, returning FALSE");
+ //console.groupEnd();
+ return false;
+ }
+ else {
+ // If returned ok, we have a new skey
+ //console.log("Row saved OK");
+ ua.json.process();
+ var row = $a.data.row;
+ var skey = row.skey;
+
+ // Replace the input values with server returned values
+ $(this).find("#row_"+this.zSkey+" div").each(
+ function() {
+ col = u.p($(this).find(":input")[0],'xColumnId');
+ //console.log(col,row[col]);
+ this.innerHTML = row[col];
+ }
+ );
+
+ // If this was a new row, set it up
+ if(this.zSkey==0) {
+ $(this).find("#row_0").each(
+ function() {
+ this.id = 'row_'+$a.data.row.skey;
+ }
+ );
+
+ // PHP-JAVASCRIPT DUPLICATION ALERT!
+ // This code also exists in androLib.php
+ // addRow method of the tabDiv class
+ var table = this.zTable;
+ if (u.p(this,'xgridhilight')=='Y') {
+ $(this).find('#row_'+$a.data.row.skey)
+ .mouseover(
+ function() {
+ $(this).addClass('hilight')
+ }
+ )
+ .mouseout(
+ function() {
+ $(this).removeClass('hilight')
+ }
+ )
+ .click(
+ function() {
+ x6events.fireEvent(
+ 'reqEditRow_'+table,this.id
+ );
+ }
+ );
+ }
+ }
+
+
+ // Tell downstream code we are not editing a row
+ this.zSkey = -1;
+ this.buttonsOff();
+ }
+ //console.groupEnd();
+ return true;
+ }
+ }
+
+
+ /*
+ * Routine to remove inputs from a given row and replace
+ * them with the values of the inputs
+ */
+ self.removeInputs = function(skey) {
+ //console.group("Removing Inputs");
+ //console.log("Row sk...
[truncated message content] |
|
From: <ken...@us...> - 2008-10-31 12:51:42
|
Revision: 831
http://andro.svn.sourceforge.net/andro/?rev=831&view=rev
Author: kendowns
Date: 2008-10-31 12:51:39 +0000 (Fri, 31 Oct 2008)
Log Message:
-----------
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-10-31 12:48:30 UTC (rev 830)
+++ trunk/andro/clib/x6.js 2008-10-31 12:51:39 UTC (rev 831)
@@ -99,7 +99,7 @@
this.children = [ ];
this.hp = { };
- /****O* jsHtml.innerHtml
+ /****O* jsHtml/innerHtml
*
* NAME
* jsHtml.innerHtml
@@ -123,7 +123,7 @@
*/
this.innerHtml = innerHtml ? innerHtml : '';
- /****O* jsHtml.addChild
+ /****O* jsHtml/addChild
*
* NAME
* jsHtml.addChild
@@ -150,7 +150,7 @@
}
/******/
- /****O* jsHtml.h
+ /****O* jsHtml/h
*
* NAME
* jsHtml.h
@@ -179,7 +179,7 @@
}
/******/
- /****O* jsHtml.bufferedRender
+ /****O* jsHtml/bufferedRender
*
* NAME
* jsHtml.bufferedRender
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-10-31 18:12:39
|
Revision: 840
http://andro.svn.sourceforge.net/andro/?rev=840&view=rev
Author: kendowns
Date: 2008-10-31 18:12:36 +0000 (Fri, 31 Oct 2008)
Log Message:
-----------
Ongoing cleanup
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-10-31 18:12:08 UTC (rev 839)
+++ trunk/andro/clib/x6.js 2008-10-31 18:12:36 UTC (rev 840)
@@ -565,9 +565,9 @@
//console.log(input);
$(input)
.keyup(function(e) { x6inputs.keyUp(e,this) })
- .keydown(function(e) { x6inputs.keyDown(e,this) })
.focus(function(e) { x6inputs.focus(e,this) })
- .blur(function(e) { x6inputs.blur(e,this) });
+ .blur(function(e) { x6inputs.blur(e,this) })
+ .keydown(function(e) { x6inputs.keyDown(e,this) });
input.tabIndex = tabIndex;
if(mode=='new') {
input.zNew = 1;
@@ -598,68 +598,40 @@
//console.log(e);
//console.log(inp);
- // work out which property to use.
+ var tg = u.p(inp,'xTabGroup','tgdefault');
+ //console.log("Tab Group",tg);
+
if(e.shiftKey) {
- var prop = 'xPrevTab';
- var jqf = ':last';
+ // hitting shift-tab on the first control means
+ // jump back to the last control
+ var first = $('[xTabGroup='+tg+']:not([disabled]):first')[0];
+ //console.log("The first is:");
+ //console.log(first);
+ //console.log("The input is:");
+ //console.log(inp);
+ if(first==inp) {
+ //console.log("This is first, jumping to last");
+ $('[xTabGroup='+tg+']:not([disabled]):last').focus();
+ e.preventDefault();
+ }
}
else {
- var prop = 'xNextTab';
- var jqf = ':first';
- }
- //console.log(prop);
- //console.log(jqf);
-
- // The loop breaks when we find a readable control
- // or get to the end of the list
- var xinp = inp;
- var jqx = '';
- while(true) {
- // Current control has no next tab, start over
- // at beginning
- if( u.p(xinp,prop,'X')=='X') {
- jqx = '[tabindex]:not([disabled])'+jqf;
- //console.log("no control found, string to use: "+jqx);
- break;
+ // hitting tab on the last control is the only
+ // thing I care about. If I'm not on the last
+ // control, let the browser do it, much faster.
+ var last = $('[xTabGroup='+tg+']:not([disabled]):last')[0];
+ //console.log("The last is:");
+ //console.log(last);
+ //console.log("The input is:");
+ //console.log(inp);
+ if(last==inp) {
+ //console.log("This is last, jumping to first");
+ $('[xTabGroup='+tg+']:not([disabled]):first').focus();
+ e.preventDefault();
}
-
- // Advance to next
- var tabCandidate = u.p(xinp,prop);
- jsq = '[tabindex='+tabCandidate+']';
- //console.log('advancing to '+jsq);
- xinp = $(jsq)[0];
-
- // and if the next is not disabled, return TRUE,
- // do NOTHING, and the browser will handle it
- if(u.p(xinp,'disabled',false)==false) {
- //console.log("next control is not read only, letting browse do it");
- break;
- }
-
- // if we get around to the original input, something
- // is wrong, cancel also so we don't have an
- // infinite loop
- if(xinp==inp) break;
}
- if(jqx=='') {
- //console.log('not trying to pick focus');
- }
- else {
- //console.log("trying to pick focus: "+jqx);
- $(jqx).focus();
- }
- //u.debugPop();
- if(jqx=='') {
- //console.log("returning TRUE");
- //console.groupEnd();
- return true;
- }
- else {
- //console.log("PREVENTING DEFAULT AND RETURNING FALSE");
- //console.groupEnd();
- e.preventDefault();
- return false;
- }
+ //console.groupEnd();
+ return;
},
focus: function(inp) {
@@ -1472,6 +1444,13 @@
//console.log(this.innerHTML);
}
);
+ tabIndex = 1000;
+ $(this).find('.tbody #row_'+skey+' :input').each(
+ function() {
+ x6inputs.initInput(this,tabIndex++,'new');
+ this.setAttribute('xTabGroup','rowEdit');
+ }
+ );
//console.groupEnd();
}
@@ -1486,7 +1465,7 @@
x6events.subscribeToEvent('reqNewRow_'+table,id);
self['receiveEvent_reqNewRow_'+table] = function(skey) {
- //console.group("reqNewLine "+this.zTable);
+ //console.group("reqNewRow "+this.zTable);
//console.log('Table: '+this.zTable);
/*
@@ -1495,6 +1474,10 @@
* to be all empty, just focus on the row.
*/
if(this.zSkey>-1) {
+ /* special case, empty new row, just focus */
+ if(this.zSkey == 0) {
+
+ }
if(!x6events.fireEvent('reqSaveRow_'+this.zTable)) {
//console.log('Failed to save new row, no new new row');
//console.groupEnd();
@@ -1531,7 +1514,10 @@
// Initialize all inputs to behave in x6 mode
tabIndex = 1000;
$(this).find(':input').each(
- function() { x6inputs.initInput(this,tabIndex++,'new'); }
+ function() {
+ x6inputs.initInput(this,tabIndex++,'new');
+ this.setAttribute('xTabGroup','rowEdit');
+ }
);
$(this).find('#row_0').fadeIn('fast'
,function() { x6inputs.findFocus( this ) }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-11-03 15:54:16
|
Revision: 846
http://andro.svn.sourceforge.net/andro/?rev=846&view=rev
Author: kendowns
Date: 2008-11-03 15:54:14 +0000 (Mon, 03 Nov 2008)
Log Message:
-----------
Daily changes.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-11-03 15:53:28 UTC (rev 845)
+++ trunk/andro/clib/x6.js 2008-11-03 15:54:14 UTC (rev 846)
@@ -288,9 +288,9 @@
* SOURCE
*/
subscribeToEvent: function(eventName,id) {
- //console.group("subscribeToEvent "+eventName);
- //console.log("event name: ",eventName)
- //console.log("id subscbr: ",id);
+ //c*onsole.group("subscribeToEvent "+eventName);
+ //c*onsole.log("event name: ",eventName)
+ //c*onsole.log("id subscbr: ",id);
if(id=='undefined') {
u.error('x6events.subscribeToEvent. Second parameter '
+' undefined. First parameter: '+eventName
@@ -310,7 +310,7 @@
this.subscribers[eventName] = [ ];
}
this.subscribers[eventName].push(id);
- //console.groupEnd();
+ //c*onsole.groupEnd();
},
/******/
@@ -397,7 +397,7 @@
break;
}
}
- //console.log("RETURNING: ",this.retvals[eventName]);
+ //console.log("fireEvent RETURNING: ",this.retvals[eventName]);
//console.groupEnd();
return this.retvals[eventName];
}
@@ -429,8 +429,8 @@
if(u.p(this,'id','')=='') {
this.id = u.uniqueId();
}
- s="Initializing object "+this.id+" as plugIn "+plugInId;
- //console.log(s);
+ //s="Initializing object "+this.id+" as plugIn "+plugInId;
+ //c*onsole.log(s);
this.zTable = u.p(this,'x6table');
x6plugins[plugInId](this,this.id,u.p(this,'x6table'));
});
@@ -559,20 +559,36 @@
var x6inputs = {
// This routine takes an input that has no x6 event
// handlers and adds all of the event handlers to it
- initInput: function(input,tabIndex,mode) {
+ initInput: function(input,tabIndex,mode,tabGroup) {
//console.group("Initializing Input");
- //console.log(tabIndex,mode);
+ //console.log("tabindex, mode, tabgroup: ",tabIndex,mode,tabGroup);
//console.log(input);
+
+ // This is standard events and attributes
+ input.setAttribute('xTabGroup',tabGroup);
+ input.setAttribute('tabIndex' ,tabIndex);
+ input.zOriginalValue = input.value.trim();
$(input)
.keyup(function(e) { x6inputs.keyUp(e,this) })
.focus(function(e) { x6inputs.focus(e,this) })
.blur(function(e) { x6inputs.blur(e,this) })
.keydown(function(e) { x6inputs.keyDown(e,this) });
- input.tabIndex = tabIndex;
if(mode=='new') {
input.zNew = 1;
x6inputs.setClass(input);
}
+
+ // KFD 11/1/08, EXPERIMENTAL use of jquery.maskedinput
+ //if(u.p(input,'xinputmask','')!='') {
+ // $(input).mask(u.p(input,'xinputmask'));
+ //}
+
+ // This is important, it says that this is an
+ // active input. This distinguishes it from possible
+ // hidden inputs that were used as a clone source
+ // that have many of the same properties.
+ input.zActive = 1;
+
//console.groupEnd();
},
@@ -711,9 +727,17 @@
},
findFocus: function(obj) {
- $(obj).find(":input:first").focus();
+ if(typeof(obj)=='string') {
+ $(obj+" :input:first:not([disabled])").focus();
+ }
+ else {
+ $(obj).find(":input:first:not([disabled])").focus();
+ }
+ },
+
+ jqFocusString: function() {
+ return ":input:not([disabled]):first";
}
-
}
@@ -759,7 +783,7 @@
x6plugins.buttonStandard(self,'abandon','CtrlT');
self.main = function() {
if(confirm("Abandon all changes?")) {
- x6events.fireEvent('cancelEdit_'+this.zTable);
+ x6events.fireEvent('reqUndoRow_'+this.zTable);
}
}
},
@@ -918,94 +942,229 @@
*/
tableController: function(self,id,table) {
// Initialize new properties
- self.zSkey = -1;
+ u.bb.vgfSet('skey_'+table,-1);
self.zSortCol = false;
self.zSortAsc = false;
- // Table Controller will cache rows if offered
+ /*
+ * Table controller will be happy to cache
+ * rows for a table if they are offered. It
+ * will also be happy to add a row to that
+ * cache if offered. There ought also to be
+ * something here to remove a row, but that
+ * seems to be missing?
+ *
+ * Note: shouldn't that be cacheAddRow ?
+ * Note: and then wouldn't we want cacheDelRow?
+ */
x6events.subscribeToEvent('cacheRows_'+table,id);
self['receiveEvent_cacheRows_'+table] = function(rows) {
this.zRows = rows;
}
- // Table Controller will add a row to cache if offered
x6events.subscribeToEvent('addRow_'+table,id);
self['receiveEvent_addRow_'+table] = function(row) {
this.zRows[row.skey] = row;
}
+
+ /*
+ * Table controller accepts the request to
+ * save current changes. First checks if this
+ * makes sense.
+ *
+ */
+ x6events.subscribeToEvent('reqSaveRow_'+table,id);
+ self['receiveEvent_reqSaveRow_'+table] = function(dupe) {
+ //console.group("tableController reqSaveRow "+this.zTable);
+
+ var result = this.saveOk();
+ u.bb.vgfSet('lastSave_'+this.zTable,result);
+ if(result!='fail') {
+ if(result!='noaction') {
+ x6events.fireEvent('uiRowSaved_'+table,$a.data.row);
+ }
+ }
+ //console.log('tableController reqSaveRow finished');
+ //console.groupEnd();
+ }
- // Handle a new row by generating defaults and telling
- // anybody who cares to display this row in this mode
+
+ /*
+ * Table controller accepts the request to
+ * begin editing a new row. It must first
+ * work out if any open rows being edited must
+ * be saved. If everything works out it
+ * broadcasts a UI notification that UI elements
+ * should display their inputs in NEW mode.
+ *
+ */
x6events.subscribeToEvent('reqNewRow_' +table,id);
- self['receiveEvent_reqNewRow_'+table] = function(dupeCurrent) {
- if( x6events.fireEvent('attemptChangeMode_'+u.p(this,'x6table'))) {
- if(dupeCurrent && this.zSkey >0) {
- var row = this.zRows[this.zSkey];
+ self['receiveEvent_reqNewRow_'+table] = function(dupe) {
+ //console.group("tableController reqNewRow "+this.zTable);
+
+ var result = this.saveOk();
+ u.bb.vgfSet('lastSave_'+this.zTable,result);
+ if(result!='fail') {
+ if(result!='noaction') {
+ x6events.fireEvent('uiRowSaved_'+table,$a.data.row);
}
- else {
- var row = { }
- }
- var argsObj = {
- mode: 'new',
- row: row
- };
- x6events.fireEvent('goMode_'+u.p(this,'x6table'),argsObj);
- this.zSkey=0;
+ x6events.fireEvent('uiNewRow_'+table);
}
+ //console.groupEnd();
}
- // table controller responds to request to edit a
- // particular row.
- x6events.subscribeToEvent('reqEditRow_' +table,id);
+ /*
+ * Table controller accepts a request to edit a
+ * row. It is smart enough that if we are already
+ * editing that row it does nothing. Otherwise
+ * it tries to save any existing row before
+ * deciding whether to move on.
+ *
+ */
+ x6events.subscribeToEvent('reqEditRow_'+table,id);
self['receiveEvent_reqEditRow_'+table] = function(skey) {
- if( x6events.fireEvent('attemptChangeMode_'+u.p(this,'x6table'))) {
- var argsObj = {
- mode: 'edit',
- row: this.zRows[skey]
- };
- x6events.fireEvent('goMode_'+u.p(this,'x6table'),argsObj);
- this.zSkey = skey;
+ //console.group("tableController reqEditRow "+this.zTable);
+ var skeynow = u.bb.vgfGet('skey_'+this.zTable);
+ if(skeynow == skey) {
+ //console.log("Request to edit same row, no action");
+ }
+ else {
+ var result = this.saveOk();
+ u.bb.vgfSet('lastSave_'+this.zTable,result);
+ if(result!='fail') {
+ if(result!='noaction') {
+ x6events.fireEvent('uiRowSaved_'+table,$a.data.row);
+ }
+ x6events.fireEvent('uiEditRow_'+table,skey);
+ }
}
+ //console.log("tableController reqEditRow finished");
+ //console.groupEnd();
+ return true;
}
- // table controller responds to an abandon event
- x6events.subscribeToEvent('cancelEdit_'+table,id);
- self['receiveEvent_cancelEdit_'+table] = function() {
- // If we were on a new row, abandon it. Otherwise
- // take no action
- if(this.zSkey==0) this.zSkey = -1;
+ /*
+ * The saveOk figures out if it needs to save and
+ * tries to do so. If no active fields have changed,
+ * it just returns 'noaction'. If it needs to save,
+ * it attempts to do so and returns 'success' or
+ * 'fail'.
+ */
+ self.saveOk = function() {
+ //console.group("tableController saveOK");
+ var inpAll = { };
+ var inpChg = { };
+ var cntChg = 0;
+ var jq = ':input[xtableid='+this.zTable+'][zActive]';
+ //console.log("Query string",jq);
+ $(this).find(jq).each(
+ function() {
+ var col = u.p(this,'xcolumnid');
+ inpAll[col] = this.value;
+ var oval = u.p(this,'zOriginalValue','').trim();
+ if(this.value.trim()!= oval) {
+ inpChg[col] = this.value.trim();
+ cntChg++;
+ }
+ }
+ );
+ //console.log("All inputs: ",inpAll);
+ //console.log("Changed inputs: ",inpChg);
+ //console.log("Count of changes: ",cntChg);
+
+ // Only attempt a save if something changed
+ if(cntChg == 0) {
+ //console.log("no changes, not trying to save");
+ var retval = 'noaction';
+ }
+ else {
+ //console.log("attempting database save");
+ //console.log("Sending x4v_skey ",this.zSkey);
+ ua.json.init('x6page',this.zTable);
+ ua.json.addParm('x6action','save');
+ ua.json.addParm('x4v_skey',u.bb.vgfGet('skey_'+this.zTable));
+ ua.json.inputs(jq);
+ if(ua.json.execute()) {
+ var retval = 'success';
+ ua.json.process();
+ }
+ else {
+ var retval = 'fail';
+ var errors = [ ];
+ for(var idx in ua.json.jdata.error) {
+ if(ua.json.jdata.error[idx].slice(0,8)!='(ADMIN):') {
+ errors.push(ua.json.jdata.error[idx]);
+ }
+ }
+ //console.log("save failed, here are errors");
+ //console.log(errors);
+ x6events.fireEvent('uiShowErrors_'+this.zTable,errors);
+ }
+ }
+
+ //console.log("tableController saveOK RETURNING: ",retval);
+ //console.groupEnd();
+ return retval;
+ };
+
+
+ /*
+ * The table controller accepts requests to undo
+ * changes to a row. It actually rolls back all
+ * inputs and sets their classes, and then
+ * fires of a uiUndoRow event so various other
+ * elements can do their own thing.
+ */
+ x6events.subscribeToEvent('reqUndoRow_'+table,id);
+ self['receiveEvent_reqUndoRow_'+table] = function() {
+ //console.group("tableController reqUndoRow");
+ var skey = u.bb.vgfGet('skey_'+table);
+ if(skey>=0) {
+ //console.log("Skey is >= 0, continuing ",skey);
+ $(this).find(":input:not([disabled])[zActive]").each(
+ function() {
+ this.value = this.zOriginalValue;
+ this.zError = 0;
+ x6inputs.setClass(this);
+ }
+ );
+ x6events.fireEvent('uiUndoRow_'+this.zTable);
+ }
+ //console.log("tableController reqUndoRow Finished");
+ //console.groupEnd();
+ return true;
}
+ /*
+ * The table controller accepts delete request
+ * and asks the database to do the delete. If
+ * this is successful, it tells any UI subscribers
+ * to update their displays accordingly.
+ */
x6events.subscribeToEvent('reqDelRow_' +table,id);
self['receiveEvent_reqDelRow_'+table] = function() {
- if(this.zSkey==-1) {
- alert("Please click on a row first, then click [DELETE]");
- return false;
+ //console.group("tableController reqDelRow ",this.zTable);
+ var skey = u.bb.vgfGet('skey_'+this.zTable);
+ if(this.zSkey<1) {
+ //console.log("nothing being edited, quietly ignoring");
}
- var table = u.p(this,'x6table');
- ua.json.init('x6page',table);
- ua.json.addParm('x6action','delete');
- ua.json.addParm('skey',this.zSkey);
- ua.json.addParm('json',1);
- if(ua.json.execute()) {
- // Remove from cache
- if(typeof(this.zRows[this.zSkey])!='undefined') {
- delete this.zRows[this.zSkey];
+ else {
+ if(confirm("Delete current row?")) {
+ //console.log("sending delete to server");
+ ua.json.init('x6page',this.zTable);
+ ua.json.addParm('x6action','delete');
+ ua.json.addParm('skey',skey);
+ ua.json.addParm('json',1);
+ if(ua.json.execute()) {
+ x6events.fireEvent('uiDelRow_'+table,skey);
+ }
}
-
- // Tell everybody else to get rid of it
- x6events.fireEvent('delRow_'+table,this.zSkey);
- this.skey = -1;
}
- return;
+ //console.log("tableController reqDelRow finished");
+ //console.groupEnd();
+ return true;
}
- x6events.subscribeToEvent('rowChanged_'+table,id);
- self['receiveEvent_rowChanged_'+table] = function(row) {
- var skey = row.skey;
- this.zRows[skey] = row;
- }
-
// Sort requests are sorted out here.
x6events.subscribeToEvent('reqSort_'+table,id);
self['receiveEvent_reqSort_'+table] = function(args) {
@@ -1386,345 +1545,326 @@
******
*/
x6plugins.x6tabDiv = function(self,id,table) {
- // Start out by claiming not to be editing
- // any particular key.
- self.zSkey = -1;
-
- // if grid select is 'inline', we subscribe to
- // requests to edit rows
- if(u.p(self,'xGridSelect','')=='inline') {
- x6events.subscribeToEvent('reqEditRow_'+table,id);
- self['receiveEvent_reqEditRow_'+table] = function(skey) {
- /* Quiet return if the clicked the row already being edited */
- if(skey==this.zSkey) return false;
+ /*
+ * These two will tell us down below if the grid
+ * displays inputs for new rows and allows
+ * inline editing of rows
+ */
+ var uiNewRow = u.p(self,'uiNewRow' ,'');
+ var uiEditRow = u.p(self,'uiEditRow','');
+
+ /*
+ * The grid is happy to display a new row for
+ * editing if a certain flag has been set.
+ * The event uiNewRow is unconditional, it means
+ * all prerequisites have been met and the grid
+ * should proceed forthwith.
+ */
+ if(uiNewRow=='inline') {
+ x6events.subscribeToEvent('uiNewRow_'+table,id);
+
+ self['receiveEvent_uiNewRow_'+table] = function() {
+ //console.group("tabDiv uiNewRow "+this.zTable);
+ var skey = u.bb.vgfGet('skey_'+this.zTable,-1);
- //console.group('reqEditRow',table);
- var grid = this;
-
/*
- * If editing a different row, try to save
- * and clear that row first
+ * If we are currently editing a new row, just
+ * focus on it.
*/
- if(this.zSkey>-1) {
- var oldSkey = this.zSkey;
- if(!x6events.fireEvent('reqSaveRow_'+this.zTable)) {
- //console.groupEnd();
- return false;
- }
- else {
- //console.log("removing inputs current row");
- this.removeInputs(oldSkey);
- this.zSkey==-1;
- }
- }
-
- // Make sure we have the row, otherwise it is
- // kind of useless
- if( $(this).find('#row_'+skey).length == 1) {
- //console.log("We have the row, we can edit");
- this.zSkey = skey;
- this.buttonsOn();
-
- //console.group("Putting inputs into div cells");
- $(this).find('.tbody #row_'+skey+' div').each(
- function() {
- // Work up to figuring out the name of the
- // id that holds the hidden input, then
- // grab the input and put it in.
- var colnum = u.p(this,'gColumn');
- var colid = grid.zColsInfo[colnum].column_id;
- var id = 'wrapper_'+grid.zTable+'_'+colid;
-
- // Current Value
- var curval = this.innerHTML;
- //console.log(id,curval);
-
- this.innerHTML = u.byId(id).innerHTML;
- $(this).find(":input")[0].value=curval;
- //console.log(this.innerHTML);
- }
- );
- tabIndex = 1000;
- $(this).find('.tbody #row_'+skey+' :input').each(
- function() {
- x6inputs.initInput(this,tabIndex++,'new');
- this.setAttribute('xTabGroup','rowEdit');
- }
- );
+ if(skey==0 && u.bb.vgfGet('lastSave_'+this.zTable)=='noaction') {
+ $(this).find("#row_0 :input:first:not([disabled])").focus();
+ //console.log("On an empty new row, setting focus");
//console.groupEnd();
+ return;
}
- //console.groupEnd();
- }
- }
-
- // if grid is editable, xGridReqNew will be set to
- // 'inline', which means new lines are added directly
- // to the grid.
- if(u.p(self,'xGridReqNew','')=='inline') {
- x6events.subscribeToEvent('reqNewRow_'+table,id);
-
- self['receiveEvent_reqNewRow_'+table] = function(skey) {
- //console.group("reqNewRow "+this.zTable);
- //console.log('Table: '+this.zTable);
-
/*
- * If editing a new row, we will try to save it.
- * If successful, quietly continue. If it happens
- * to be all empty, just focus on the row.
+ * If editing some other row, we know it was saved
+ * and is ok, convert it back to display
*/
- if(this.zSkey>-1) {
- /* special case, empty new row, just focus */
- if(this.zSkey == 0) {
-
- }
- if(!x6events.fireEvent('reqSaveRow_'+this.zTable)) {
- //console.log('Failed to save new row, no new new row');
- //console.groupEnd();
- x6inputs.findFocus( $(this).find("#row_0") );
- return true;
- }
+ if(skey>=0) {
+ this.removeInputs();
}
- // We are going to make a new row. Right now it will
- // go at the top of div.thead, but later it has to
- // be smarter and go in after the selected row, if any.
+ /*
+ * This is the major UI stuff. We need to slip a
+ * row into the grid, clone some of the invisible
+ * inputs that have been provided by the PHP code,
+ * and get them all initialized and ready to go.
+ */
var newRow = new jsHtml('div');
newRow.hp.id = 'row_0';
newRow.hp.style = 'display: none;';
var numbers = [ 'int', 'numb', 'money' ];
- //console.log(newRow);
for (var idx in this.zColsInfo) {
var colInfo = this.zColsInfo[idx];
if(colInfo.column_id == '') continue;
var innerDiv = newRow.h('div');
innerDiv.hp.style= "width: "+colInfo.width+"px;";
+ innerDiv.hp.gColumn = idx;
if(numbers.indexOf(colInfo.type_id)>=0) {
innerDiv.hp.style+="text-align: right";
}
var id = '#wrapper_'+this.zTable+'_'+colInfo.column_id;
var newInput = $(id).html();
- //console.log("column: ",colInfo.column_id,newInput);
+ //console.log("column: ",colInfo.column_id);
innerDiv.innerHtml = newInput;
}
- //console.log(newRow);
- // Add this new row into the visuals so it is real
+
+ /*
+ * Now do everything required to make the
+ * row visible and editable
+ */
$(this).find('.tbody').prepend(newRow.bufferedRender());
- // Initialize all inputs to behave in x6 mode
tabIndex = 1000;
$(this).find(':input').each(
function() {
- x6inputs.initInput(this,tabIndex++,'new');
+ x6inputs.initInput(this,tabIndex++,'new','rowNew');
this.setAttribute('xTabGroup','rowEdit');
}
);
+ var grid = this;
$(this).find('#row_0').fadeIn('fast'
- ,function() { x6inputs.findFocus( this ) }
+ ,function() {
+ //grid.buttonsOn();
+ x6inputs.findFocus( this );
+ }
);
- // This warns downstream code that we are working
- // on a new row.
- this.zSkey = 0;
-
- // Turn on buttons
+ // Send a message and get lost
+ u.bb.vgfSet('skey_'+this.zTable,0);
this.buttonsOn();
-
- // Send a message and get lost
//console.log('New row created, ready to edit');
//console.groupEnd();
return true;
}
}
-
- // If grid allows either kind of inline row, it must
- // must accept an abandon request and throw out the row
- var xSelect = u.p(self,'xGridSelect','');
- var xReqNew = u.p(self,'xGridReqNew','');
- if(xSelect == 'inline' || xReqNew == 'inline') {
- x6events.subscribeToEvent('cancelEdit_'+table,id);
+
+ /*
+ * The grid is happy to display an existing row
+ * for editing if the flag has been set. This
+ * is an unconditional event, it assumes all is
+ * well and nothing stands in the way of editing.
+ */
+ if(uiEditRow=='inline') {
+ x6events.subscribeToEvent('uiEditRow_'+table,id);
- self['receiveEvent_cancelEdit_'+table] = function(skey) {
- if(this.zSkey==-1) return false;
-
- //console.group("Abandon: cancelEdit "+this.zTable);
- if(this.zSkey==0) {
- //console.log("Abandoning new row");
- this.zSkey = -1;
- this.buttonsOff();
- $(this).find("#row_0").fadeOut('fast'
- ,function() { $(this).remove(); }
- );
+ self['receiveEvent_uiEditRow_'+table] = function(skey) {
+ //console.group("tabDiv uiEditRow "+this.zTable);
+
+ if( $(this).find('#row_'+skey).length == 0) {
+ //console.log("We don't have that row, cannot edit");
+ //console.groupEnd();
+ return;
}
- if(this.zSkey>0) {
-
+ /*
+ * If editing some other row, we know it was saved
+ * and is ok, convert it back to display
+ */
+ if(u.bb.vgfGet('skey_'+this.zTable)>=0) {
+ this.removeInputs();
}
-
+
+ //console.log("Putting inputs into div cells");
+ grid = this;
+ $(this).find('.tbody #row_'+skey+' div').each(
+ function() {
+ // Work up to figuring out the name of the
+ // id that holds the hidden input, then
+ // grab the input and put it in.
+ var colnum = u.p(this,'gColumn');
+ var colid = grid.zColsInfo[colnum].column_id;
+ var id = 'wrapper_'+grid.zTable+'_'+colid;
+
+ // Current Value
+ var curval = this.innerHTML;
+ //console.log(id,curval);
+
+ this.innerHTML = u.byId(id).innerHTML;
+ $(this).find(":input")[0].value=curval;
+ }
+ );
+ tabIndex = 1000;
+ $(this).find('.tbody #row_'+skey+' :input').each(
+ function() {
+ x6inputs.initInput(this,tabIndex++,'new','rowEdit');
+ }
+ );
+ var string = x6inputs.jqFocusString();
+ $(this).find('.tbody #row_'+skey+' '+string).focus();
+ this.buttonsOn();
+ u.bb.vgfSet('skey_'+this.zTable,skey);
+ //console.log('uiEditRow Completed, returning true');
//console.groupEnd();
+ return true;
}
}
+
+ /*
+ * A grid may need to convert inputs back into display
+ * elements. This routine is unconditionally created
+ * and is only called by ui event handlers.
+ *
+ */
+ self.removeInputs = function() {
+ //console.group("tabDiv removeInputs");
- // An explicit flag set in the PHP side determines
- // if we accept delete requests
- if(u.p(self,'xGridReqDel','N')=='Y') {
- x6events.subscribeToEvent('reqDelRow_'+table,id);
-
- self['receiveEvent_reqDelRow_'+table] = function() {
- //console.group("reqDelRow "+table);
- if(this.zSkey==-1) {
- //console.log("No row, ignoring");
- //console.groupEnd();
- alert("Please select a row first");
+ var skey = u.bb.vgfGet('skey_'+this.zTable);
+ //console.log("skey is ",skey);
+ $(this).find("#row_"+skey+" div").each(
+ function() {
+ var val = $(this).find(":input")[0].value;
+ //console.log(val);
+ this.innerHTML = val;
+ }
+ );
+
+ // If we are removing inputs from the 0 row
+ // and the last save had no action, kill the row
+ if(skey==0) {
+ if(u.bb.vgfGet('lastSave_'+this.zTable)=='noaction') {
+ $(this).find("#row_0").fadeOut(
+ function() { $(this).remove() }
+ );
return;
}
- else if(this.zSkey==0) {
- //console.log("on a new row, firing cancelEdit command");
- x6events.fireEvent('cancelEdit_'+this.zTable);
- }
- else {
- if(confirm("Delete the selected row?")) {
- //console.log("asking server to delete");
- ua.json.init('x6page',this.zTable);
- ua.json.addParm('x6action','delete');
- ua.json.addParm('skey',this.zSkey);
- if(!ua.json.execute()) {
- //console.log("server refused to delete");
- }
- else {
- //console.log("server did the delete");
- $(this).find('#row_...
[truncated message content] |
|
From: <ken...@us...> - 2008-11-03 19:36:51
|
Revision: 854
http://andro.svn.sourceforge.net/andro/?rev=854&view=rev
Author: kendowns
Date: 2008-11-03 19:36:48 +0000 (Mon, 03 Nov 2008)
Log Message:
-----------
Major changes to plugins so grid and twosides now work almost completely.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-11-03 19:36:09 UTC (rev 853)
+++ trunk/andro/clib/x6.js 2008-11-03 19:36:48 UTC (rev 854)
@@ -889,630 +889,508 @@
$(self).click(function() {
if(!this.zDisabled) this.main();
});
- },
+ }
+}
+
+
+/****m* x6plugins/tableController
+*
+* NAME
+* x6plugins.tableController
+*
+* FUNCTION
+* The Javascript method x6plugins.tableController is
+* a constructor function. It accepts as a parameter the
+* ID of a DOM element. It adds functions to that DOM
+* element so that it will fully implement all browser-side
+* features of our tableController object.
+*
+* A tableController subscribes to all events in which a
+* user requests to do something like add a row or delete
+* a row. The tableController executes whatever server-side
+* requests are required, and then fires various events to
+* notify other UI elements that they should display the
+* results.
+*
+* Normally you do not invoke this method directly. All
+* x6 plugins are detected and implmented automatically on
+* page load.
+
+* To turn any DOM element into a table controller, just set
+* the properties x6plugIn and x6table, as in either
+* of these:
+*
+* <?php
+* # here is one way to do it:
+* echo "<div x6plugIn='tableController' x6table='users'>";
+*
+* # another way to do it:
+* $div = html('div');
+* $div->hp['x6plugIn'] = 'tableController';
+* $div->hp['x6table'] = 'users';
+* $div->render();
+* ?>
+*
+* You should not have more than one table controller per
+* table on a page -- Andromeda will not trap for this!
+*
+* INPUTS
+* id - the ID of the object to be 'activated'.
+*
+* RESULTS
+* no return value.
+*
+******
+*/
+x6plugins.tableController = function(self,id,table) {
+ // Initialize new properties
+ u.bb.vgfSet('skey_'+table,-1);
+ self.zSortCol = false;
+ self.zSortAsc = false;
+ self.zCache = u.p(self,'xCache')=='Y' ? true : false;
- /****m* x6plugins/tableController
- *
- * NAME
- * x6plugins.tableController
- *
- * FUNCTION
- * The Javascript method x6plugins.tableController is
- * a constructor function. It accepts as a parameter the
- * ID of a DOM element. It adds functions to that DOM
- * element so that it will fully implement all browser-side
- * features of our tableController object.
- *
- * A tableController subscribes to all events in which a
- * user requests to do something like add a row or delete
- * a row. The tableController executes whatever server-side
- * requests are required, and then fires various events to
- * notify other UI elements that they should display the
- * results.
- *
- * Normally you do not invoke this method directly. All
- * x6 plugins are detected and implmented automatically on
- * page load.
+ /*
+ * Table controller accepts the request to
+ * save current changes. First checks if this
+ * makes sense.
+ *
+ */
+ x6events.subscribeToEvent('reqSaveRow_'+table,id);
+ self['receiveEvent_reqSaveRow_'+table] = function(dupe) {
+ //console.group("tableController reqSaveRow "+this.zTable);
+
+ var result = this.saveOk();
+ u.bb.vgfSet('lastSave_'+this.zTable,result);
+ //console.log('tableController reqSaveRow finished');
+ //console.groupEnd();
+ }
- * To turn any DOM element into a table controller, just set
- * the properties x6plugIn and x6table, as in either
- * of these:
- *
- * <?php
- * # here is one way to do it:
- * echo "<div x6plugIn='tableController' x6table='users'>";
- *
- * # another way to do it:
- * $div = html('div');
- * $div->hp['x6plugIn'] = 'tableController';
- * $div->hp['x6table'] = 'users';
- * $div->render();
- * ?>
- *
- * You should not have more than one table controller per
- * table on a page -- Andromeda will not trap for this!
- *
- * INPUTS
- * id - the ID of the object to be 'activated'.
- *
- * RESULTS
- * no return value.
- *
- ******
+
+ /*
+ * Table controller accepts the request to
+ * begin editing a new row. It must first
+ * work out if any open rows being edited must
+ * be saved. If everything works out it
+ * broadcasts a UI notification that UI elements
+ * should display their inputs in NEW mode.
+ *
*/
- tableController: function(self,id,table) {
- // Initialize new properties
- u.bb.vgfSet('skey_'+table,-1);
- self.zSortCol = false;
- self.zSortAsc = false;
+ x6events.subscribeToEvent('reqNewRow_' +table,id);
+ self['receiveEvent_reqNewRow_'+table] = function(dupe) {
+ //console.group("tableController reqNewRow "+this.zTable);
- /*
- * Table controller will be happy to cache
- * rows for a table if they are offered. It
- * will also be happy to add a row to that
- * cache if offered. There ought also to be
- * something here to remove a row, but that
- * seems to be missing?
- *
- * Note: shouldn't that be cacheAddRow ?
- * Note: and then wouldn't we want cacheDelRow?
- */
- x6events.subscribeToEvent('cacheRows_'+table,id);
- self['receiveEvent_cacheRows_'+table] = function(rows) {
- this.zRows = rows;
+ var result = this.saveOk();
+ u.bb.vgfSet('lastSave_'+this.zTable,result);
+ if(result!='fail') {
+ x6events.fireEvent('uiNewRow_'+table);
}
- x6events.subscribeToEvent('addRow_'+table,id);
- self['receiveEvent_addRow_'+table] = function(row) {
- this.zRows[row.skey] = row;
- }
+ //console.groupEnd();
+ }
- /*
- * Table controller accepts the request to
- * save current changes. First checks if this
- * makes sense.
- *
- */
- x6events.subscribeToEvent('reqSaveRow_'+table,id);
- self['receiveEvent_reqSaveRow_'+table] = function(dupe) {
- //console.group("tableController reqSaveRow "+this.zTable);
-
+ /*
+ * Table controller accepts a request to edit a
+ * row. It is smart enough that if we are already
+ * editing that row it does nothing. Otherwise
+ * it tries to save any existing row before
+ * deciding whether to move on.
+ *
+ */
+ x6events.subscribeToEvent('reqEditRow_'+table,id);
+ self['receiveEvent_reqEditRow_'+table] = function(skey) {
+ //console.group("tableController reqEditRow "+this.zTable);
+ var skeynow = u.bb.vgfGet('skey_'+this.zTable);
+ if(skeynow == skey) {
+ //console.log("Request to edit same row, no action");
+ }
+ else {
var result = this.saveOk();
u.bb.vgfSet('lastSave_'+this.zTable,result);
if(result!='fail') {
- if(result!='noaction') {
- x6events.fireEvent('uiRowSaved_'+table,$a.data.row);
- }
+ x6events.fireEvent('uiEditRow_'+table,skey);
}
- //console.log('tableController reqSaveRow finished');
- //console.groupEnd();
}
-
-
- /*
- * Table controller accepts the request to
- * begin editing a new row. It must first
- * work out if any open rows being edited must
- * be saved. If everything works out it
- * broadcasts a UI notification that UI elements
- * should display their inputs in NEW mode.
- *
- */
- x6events.subscribeToEvent('reqNewRow_' +table,id);
- self['receiveEvent_reqNewRow_'+table] = function(dupe) {
- //console.group("tableController reqNewRow "+this.zTable);
-
- var result = this.saveOk();
- u.bb.vgfSet('lastSave_'+this.zTable,result);
- if(result!='fail') {
- if(result!='noaction') {
- x6events.fireEvent('uiRowSaved_'+table,$a.data.row);
+ //console.log("tableController reqEditRow finished");
+ //console.groupEnd();
+ return true;
+ }
+
+ /*
+ * The saveOk figures out if it needs to save and
+ * tries to do so. If no active fields have changed,
+ * it just returns 'noaction'. If it needs to save,
+ * it attempts to do so and returns 'success' or
+ * 'fail'.
+ */
+ self.saveOk = function() {
+ //console.group("tableController saveOK");
+ var inpAll = { };
+ var inpChg = { };
+ var cntChg = 0;
+ var jq = ':input[xtableid='+this.zTable+'][zActive]';
+ //console.log("Query string",jq);
+ $(this).find(jq).each(
+ function() {
+ var col = u.p(this,'xcolumnid');
+ inpAll[col] = this.value;
+ var oval = u.p(this,'zOriginalValue','').trim();
+ if(this.value.trim()!= oval) {
+ inpChg[col] = this.value.trim();
+ cntChg++;
}
- x6events.fireEvent('uiNewRow_'+table);
}
- //console.groupEnd();
+ );
+ //console.log("All inputs: ",inpAll);
+ //console.log("Changed inputs: ",inpChg);
+ //console.log("Count of changes: ",cntChg);
+
+ // Only attempt a save if something changed
+ if(cntChg == 0) {
+ //console.log("no changes, not trying to save");
+ var retval = 'noaction';
}
-
- /*
- * Table controller accepts a request to edit a
- * row. It is smart enough that if we are already
- * editing that row it does nothing. Otherwise
- * it tries to save any existing row before
- * deciding whether to move on.
- *
- */
- x6events.subscribeToEvent('reqEditRow_'+table,id);
- self['receiveEvent_reqEditRow_'+table] = function(skey) {
- //console.group("tableController reqEditRow "+this.zTable);
- var skeynow = u.bb.vgfGet('skey_'+this.zTable);
- if(skeynow == skey) {
- //console.log("Request to edit same row, no action");
- }
+ else {
+ //console.log("attempting database save");
+ //console.log("Sending x4v_skey ",this.zSkey);
+ ua.json.init('x6page',this.zTable);
+ ua.json.addParm('x6action','save');
+ ua.json.addParm('x4v_skey',u.bb.vgfGet('skey_'+this.zTable));
+ ua.json.inputs(jq);
+ if(ua.json.execute()) {
+ var retval = 'success';
+ ua.json.process();
+ }
else {
- var result = this.saveOk();
- u.bb.vgfSet('lastSave_'+this.zTable,result);
- if(result!='fail') {
- if(result!='noaction') {
- x6events.fireEvent('uiRowSaved_'+table,$a.data.row);
+ var retval = 'fail';
+ var errors = [ ];
+ for(var idx in ua.json.jdata.error) {
+ if(ua.json.jdata.error[idx].slice(0,8)!='(ADMIN):') {
+ errors.push(ua.json.jdata.error[idx]);
}
- x6events.fireEvent('uiEditRow_'+table,skey);
}
+ //console.log("save failed, here are errors");
+ //console.log(errors);
+ x6events.fireEvent('uiShowErrors_'+this.zTable,errors);
}
- //console.log("tableController reqEditRow finished");
- //console.groupEnd();
- return true;
}
- /*
- * The saveOk figures out if it needs to save and
- * tries to do so. If no active fields have changed,
- * it just returns 'noaction'. If it needs to save,
- * it attempts to do so and returns 'success' or
- * 'fail'.
- */
- self.saveOk = function() {
- //console.group("tableController saveOK");
- var inpAll = { };
- var inpChg = { };
- var cntChg = 0;
- var jq = ':input[xtableid='+this.zTable+'][zActive]';
- //console.log("Query string",jq);
- $(this).find(jq).each(
+ // If save went ok, notify any ui elements, then
+ // fire off a cache save also if required.
+ if(retval=='success') {
+ //console.log(retval);
+ x6events.fireEvent('uiRowSaved_'+table,$a.data.row);
+ if(this.zCache) {
+ this.zRows[$a.data.row.skey] = $a.data.row;
+ }
+ }
+
+ //console.log("tableController saveOK RETURNING: ",retval);
+ //console.groupEnd();
+ return retval;
+ };
+
+
+ /*
+ * The table controller accepts requests to undo
+ * changes to a row. It actually rolls back all
+ * inputs and sets their classes, and then
+ * fires of a uiUndoRow event so various other
+ * elements can do their own thing.
+ */
+ x6events.subscribeToEvent('reqUndoRow_'+table,id);
+ self['receiveEvent_reqUndoRow_'+table] = function() {
+ //console.group("tableController reqUndoRow");
+ var skey = u.bb.vgfGet('skey_'+table);
+ if(skey>=0) {
+ //console.log("Skey is >= 0, continuing ",skey);
+ $(this).find(":input:not([disabled])[zActive]").each(
function() {
- var col = u.p(this,'xcolumnid');
- inpAll[col] = this.value;
- var oval = u.p(this,'zOriginalValue','').trim();
- if(this.value.trim()!= oval) {
- inpChg[col] = this.value.trim();
- cntChg++;
- }
+ this.value = this.zOriginalValue;
+ this.zError = 0;
+ x6inputs.setClass(this);
}
);
- //console.log("All inputs: ",inpAll);
- //console.log("Changed inputs: ",inpChg);
- //console.log("Count of changes: ",cntChg);
-
- // Only attempt a save if something changed
- if(cntChg == 0) {
- //console.log("no changes, not trying to save");
- var retval = 'noaction';
- }
- else {
- //console.log("attempting database save");
- //console.log("Sending x4v_skey ",this.zSkey);
+ x6events.fireEvent('uiUndoRow_'+this.zTable);
+ }
+ //console.log("tableController reqUndoRow Finished");
+ //console.groupEnd();
+ return true;
+ }
+
+
+ /*
+ * The table controller accepts delete request
+ * and asks the database to do the delete. If
+ * this is successful, it tells any UI subscribers
+ * to update their displays accordingly.
+ */
+ x6events.subscribeToEvent('reqDelRow_' +table,id);
+ self['receiveEvent_reqDelRow_'+table] = function() {
+ //console.group("tableController reqDelRow ",this.zTable);
+ var skey = u.bb.vgfGet('skey_'+this.zTable);
+ if(this.zSkey<1) {
+ //console.log("nothing being edited, quietly ignoring");
+ }
+ else {
+ if(confirm("Delete current row?")) {
+ //console.log("sending delete to server");
ua.json.init('x6page',this.zTable);
- ua.json.addParm('x6action','save');
- ua.json.addParm('x4v_skey',u.bb.vgfGet('skey_'+this.zTable));
- ua.json.inputs(jq);
+ ua.json.addParm('x6action','delete');
+ ua.json.addParm('skey',skey);
+ ua.json.addParm('json',1);
if(ua.json.execute()) {
- var retval = 'success';
- ua.json.process();
+ x6events.fireEvent('uiDelRow_'+table,skey);
}
- else {
- var retval = 'fail';
- var errors = [ ];
- for(var idx in ua.json.jdata.error) {
- if(ua.json.jdata.error[idx].slice(0,8)!='(ADMIN):') {
- errors.push(ua.json.jdata.error[idx]);
- }
- }
- //console.log("save failed, here are errors");
- //console.log(errors);
- x6events.fireEvent('uiShowErrors_'+this.zTable,errors);
- }
}
-
- //console.log("tableController saveOK RETURNING: ",retval);
- //console.groupEnd();
- return retval;
- };
-
-
- /*
- * The table controller accepts requests to undo
- * changes to a row. It actually rolls back all
- * inputs and sets their classes, and then
- * fires of a uiUndoRow event so various other
- * elements can do their own thing.
- */
- x6events.subscribeToEvent('reqUndoRow_'+table,id);
- self['receiveEvent_reqUndoRow_'+table] = function() {
- //console.group("tableController reqUndoRow");
- var skey = u.bb.vgfGet('skey_'+table);
- if(skey>=0) {
- //console.log("Skey is >= 0, continuing ",skey);
- $(this).find(":input:not([disabled])[zActive]").each(
- function() {
- this.value = this.zOriginalValue;
- this.zError = 0;
- x6inputs.setClass(this);
- }
- );
- x6events.fireEvent('uiUndoRow_'+this.zTable);
- }
- //console.log("tableController reqUndoRow Finished");
- //console.groupEnd();
- return true;
}
-
-
- /*
- * The table controller accepts delete request
- * and asks the database to do the delete. If
- * this is successful, it tells any UI subscribers
- * to update their displays accordingly.
- */
- x6events.subscribeToEvent('reqDelRow_' +table,id);
- self['receiveEvent_reqDelRow_'+table] = function() {
- //console.group("tableController reqDelRow ",this.zTable);
- var skey = u.bb.vgfGet('skey_'+this.zTable);
- if(this.zSkey<1) {
- //console.log("nothing being edited, quietly ignoring");
- }
- else {
- if(confirm("Delete current row?")) {
- //console.log("sending delete to server");
- ua.json.init('x6page',this.zTable);
- ua.json.addParm('x6action','delete');
- ua.json.addParm('skey',skey);
- ua.json.addParm('json',1);
- if(ua.json.execute()) {
- x6events.fireEvent('uiDelRow_'+table,skey);
- }
- }
- }
- //console.log("tableController reqDelRow finished");
- //console.groupEnd();
- return true;
+ //console.log("tableController reqDelRow finished");
+ //console.groupEnd();
+ return true;
+ }
+
+ // Sort requests are sorted out here.
+ x6events.subscribeToEvent('reqSort_'+table,id);
+ self['receiveEvent_reqSort_'+table] = function(args) {
+ // Work out sort order
+ table = this.zTable
+ xColumn = args.xColumn;
+ xChGroup= args.xChGroup;
+ if(xColumn == this.zSortCol) {
+ this.zSortAsc = ! this.zSortAsc;
}
-
- // Sort requests are sorted out here.
- x6events.subscribeToEvent('reqSort_'+table,id);
- self['receiveEvent_reqSort_'+table] = function(args) {
- // Work out sort order
- table = this.zTable
- xColumn = args.xColumn;
- xChGroup= args.xChGroup;
- if(xColumn == this.zSortCol) {
- this.zSortAsc = ! this.zSortAsc;
- }
- else {
- this.zSortCol = xColumn;
- this.zSortAsc = true;
- }
-
- // Flip all icons to both
- $('[xChGroup='+xChGroup+']').html('↑&darr');
-
- // Flip just this icon to up or down
- var icon = this.zSortAsc ? '↓' : '↑';
- $('[xChGroup='+xChGroup+'][xColumn='+xColumn+']').html(icon);
-
- // Make the request to the server
- var args2 = { sortCol: this.zSortCol, sortAsc: this.zSortAsc };
- x6events.fireEvent('doSort_'+this.zTable,args2);
+ else {
+ this.zSortCol = xColumn;
+ this.zSortAsc = true;
}
-
- },
-
- /****m* x6plugins/grid
- * NAME
- * x6plugins.grid
- *
- ******/
- grid: function(self,id,table) {
+ // Flip all icons to both
+ $('[xChGroup='+xChGroup+']').html('↑&darr');
- // Subscribe to deletion event
- x6events.subscribeToEvent('delRow_'+table,id);
- self['receiveEvent_delRow_'+table] = function(skey) {
- $(this).find('#row_'+skey).fadeOut(function() {
- $(this).remove();
- });
- }
+ // Flip just this icon to up or down
+ var icon = this.zSortAsc ? '↓' : '↑';
+ $('[xChGroup='+xChGroup+'][xColumn='+xColumn+']').html(icon);
- // Grid accepts an addrow and requests some html from
- // the server, then interprets it as a goMode
- //
- x6events.subscribeToEvent('addRow_'+table,id);
- self['receiveEvent_addRow_'+table] = function(row) {
- ua.json.init('x6page',this.zTable);
- ua.json.addParm('x6plugIn',u.p(this,'x6plugIn'));
- ua.json.addParm('x6action','onerow');
- ua.json.addParm('skey',row.skey);
- if(ua.json.execute()) {
- var html = ua.json.jdata.html['*MAIN*'];
- $(this).find('.tbody').prepend(html);
- this['receiveEvent_goMode_'+table]({mode:'edit',row:row});
- }
- }
-
- // Grid accepts a notification that we are actually
- // editing a row or reviewing a row
- x6events.subscribeToEvent('goMode_'+table,id);
- self['receiveEvent_goMode_'+table] = function(args) {
- // In all cases, turn off any rows that are selected
- $(this).find('.tbody .selected')
- .removeClass('selected')
- .removeClass('hilight');
-
- // If there is a new row, turn that one on
- if(args.mode == 'edit') {
- $(this).find('#row_'+args.row.skey)
- .removeClass('hilight')
- .addClass('selected');
- }
- }
+ // Make the request to the server
+ var args2 = { sortCol: this.zSortCol, sortAsc: this.zSortAsc };
+ x6events.fireEvent('doSort_'+this.zTable,args2);
+ }
+
- // Grid responds to request to sort in a particular order
- x6events.subscribeToEvent('doSort_'+table,id);
- self['receiveEvent_doSort_'+table] = function(args) {
- ua.json.init('x6page',this.zTable);
- ua.json.addParm('x6plugIn',u.p(this,'x6plugIn'));
- ua.json.addParm('x6action','refresh');
- ua.json.addParm('sortCol',args.sortCol);
- ua.json.addParm('sortAsc',args.sortAsc);
- u.dialogs.pleaseWait();
- if(ua.json.execute(true)) {
- var html = ua.json.jdata.html['*MAIN*'];
- $(this).find('.tbody').replaceWith(html);
- }
- u.dialogs.clear();
- }
+ /*
+ * Table controller will be happy to cache
+ * rows for a table if they are offered. It
+ * will also be happy to add a row to that
+ * cache if offered. There ought also to be
+ * something here to remove a row, but that
+ * seems to be missing?
+ *
+ * Note: shouldn't that be cacheAddRow ?
+ * Note: and then wouldn't we want cacheDelRow?
+ */
+ this.zRows = { };
+ x6events.subscribeToEvent('cacheRows_'+table,id);
+ self['receiveEvent_cacheRows_'+table] = function(rows) {
+ this.zRows = rows;
+ }
+ x6events.subscribeToEvent('addRow_'+table,id);
+ self['receiveEvent_addRow_'+table] = function(row) {
+ this.zRows[row.skey] = row;
+ }
+
+ /*
+ * A request to put the current row onto
+ * the bulletin board.
+ */
+ x6events.subscribeToEvent('dbFetchRow_'+table,id);
+ self['receiveEvent_dbFetchRow_'+table] = function(skey) {
- // First keyboard event, keydown
- x6events.subscribeToEvent('key_UpArrow',id);
- self.receiveEvent_key_UpArrow = function(e) {
- var jqRows = $(this).find('.hilight').prev();
- if(jqRows.length==0) {
- $(this).find('tbody tr:first').addClass('hilight');
- }
- else {
- $(this).find('tbody tr.hilight').removeClass('hilight')
- .prev().addClass('hilight');
- }
- x6events.retvals['key_UpArrow'] =false;
+ if(typeof(this.zRows[skey])=='undefined') {
+ //console.log("tableController bbRow, no row found");
}
- x6events.subscribeToEvent('key_DownArrow',id);
- self.receiveEvent_key_DownArrow = function(e) {
- var jqRows = $(this).find('.hilight').next();
- if(jqRows.length==0) {
- $(this).find('tbody tr:first').addClass('hilight');
- }
- else {
- $(this).find('.hilight').removeClass('hilight')
- .next().addClass('hilight');
- }
- x6events.retvals['key_UpArrow'] =false;
+ else {
+ //console.log("tableController bbRow, publishing row "+skey);
+ //console.log("putting onto bb as dbRow_"+this.zTable);
+ u.bb.vgfSet('dbRow_'+this.zTable,this.zRows[skey]);
}
-
-
- },
+ }
- /****m* x6plugins/detailDisplay
- *
- * NAME
- * x6plugins.detailDisplay
- *
- * FUNCTION
- * The Javascript method x6plugins.detailDisplay implements
- * all browser-side functionality for Andromeda's built-in
- * plugIn detailDisplay.
- *
- * A 'detailDisplay' plugIn displays user inputs to edit
- * the values for a particular row in a table.
- *
- * This plugin subscribes to the following events:
- * * goMode_{table}
- *
- * INPUTS
- * self - the DOM object to be activated.
- * id - the ID of the object to be 'activated'.
- * table - the database table that the detailPane is handling.
- *
- * RESULTS
- * no return value.
- *
- ******
+ /*
+ * Two requests, one to turn on editing-mode buttons,
+ * another to turn them off.
*/
- detailDisplay: function(self,id,table) {
- self.zSkey = -1;
+ x6events.subscribeToEvent('buttonsOn_'+table,id);
+ self['receiveEvent_buttonsOn_'+table] = function() {
+ x6events.fireEvent('enable_save');
+ x6events.fireEvent('enable_abandon');
+ x6events.fireEvent('enable_remove');
+ }
+ x6events.subscribeToEvent('buttonsOff_'+table,id);
+ self['receiveEvent_buttonsOff_'+table] = function() {
+ x6events.fireEvent('disable_save');
+ x6events.fireEvent('disable_abandon');
+ x6events.fireEvent('disable_remove');
+ }
+}
+
+
+/****m* x6plugins/detailDisplay
+*
+* NAME
+* x6plugins.detailDisplay
+*
+* FUNCTION
+* The Javascript method x6plugins.detailDisplay implements
+* all browser-side functionality for Andromeda's built-in
+* plugIn detailDisplay.
+*
+* A 'detailDisplay' plugIn displays user inputs to edit
+* the values for a particular row in a table.
+*
+* This plugin subscribes to the following events:
+* * goMode_{table}
+*
+* INPUTS
+* self - the DOM object to be activated.
+* id - the ID of the object to be 'activated'.
+* table - the database table that the detailPane is handling.
+*
+* RESULTS
+* no return value.
+*
+******
+*/
+x6plugins.detailDisplay = function(self,id,table) {
+ // detail receives a request to go to a mode which
+ // is unconditional, it will do what it is told
+ x6events.subscribeToEvent('uiEditRow_'+table,id);
+ self['receiveEvent_uiEditRow_'+table] = function(skey) {
+ //console.group("detailDisplay uiEditRow",skey);
- // detail receives a request to attempt to go into a
- // mode. It checks to see if a save is required first.
- x6events.subscribeToEvent('attemptChangeMode_'+table,id);
- self['receiveEvent_attemptChangeMode_'+table] = function() {
- // Check for existing row with changes
- if(this.zSkey>=0) {
- var ichg = $(this).find(":input[zChanged=1]");
- if(ichg.length > 0) {
- alert("There are changed Values. Must save first");
- return false;
- }
- }
- return true;
- }
+ // Ask somebody to publish the row
+ x6events.fireEvent('dbFetchRow_'+table,skey);
+ var row = u.bb.vgfGet('dbRow_'+table);
- // Detail receives...
[truncated message content] |
|
From: <ken...@us...> - 2008-11-04 20:17:05
|
Revision: 857
http://andro.svn.sourceforge.net/andro/?rev=857&view=rev
Author: kendowns
Date: 2008-11-04 20:17:04 +0000 (Tue, 04 Nov 2008)
Log Message:
-----------
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-11-04 19:40:23 UTC (rev 856)
+++ trunk/andro/clib/x6.js 2008-11-04 20:17:04 UTC (rev 857)
@@ -564,19 +564,31 @@
//console.log("tabindex, mode, tabgroup: ",tabIndex,mode,tabGroup);
//console.log(input);
+ // Get the read-only decision
+ if(mode=='new') {
+ //console.log("hello, ro ins");
+ input.zRO = u.p(input,'xroins','N')=='Y' ? 1: 0;
+ }
+ else {
+ //console.log("hello, ro upd");
+ input.zRO = u.p(input,'xroupd','N')=='Y' ? 1: 0;
+ }
+
// This is standard events and attributes
input.setAttribute('xTabGroup',tabGroup);
input.setAttribute('tabIndex' ,tabIndex);
input.zOriginalValue = input.value.trim();
- $(input)
- .keyup(function(e) { x6inputs.keyUp(e,this) })
- .focus(function(e) { x6inputs.focus(e,this) })
- .blur(function(e) { x6inputs.blur(e,this) })
- .keydown(function(e) { x6inputs.keyDown(e,this) });
+ if(!input.zRO) {
+ $(input)
+ .keyup(function(e) { x6inputs.keyUp(e,this) })
+ .focus(function(e) { x6inputs.focus(e,this) })
+ .blur(function(e) { x6inputs.blur(e,this) })
+ .keydown(function(e) { x6inputs.keyDown(e,this) });
+ }
if(mode=='new') {
input.zNew = 1;
- x6inputs.setClass(input);
}
+ x6inputs.setClass(input);
// KFD 11/1/08, EXPERIMENTAL use of jquery.maskedinput
//if(u.p(input,'xinputmask','')!='') {
@@ -599,6 +611,27 @@
//console.group("Input keyUp");
//console.log(e);
//console.log(inp);
+
+ // if a numeric, filter out disallowed values
+ type = u.p(inp,'xtypeid');
+ //console.log(typeof(inp.value));
+ switch(type) {
+ case 'int':
+ //console.log("int, allowing only digits");
+ //console.log(inp);
+ //console.log(inp.value);
+ inp.value = inp.value.replace(/[^0-9]/g,'');
+ break;
+ case 'numb':
+ case 'money':
+ //console.log("numb or money, allowing only digits and period");
+ inp.value = inp.value.replace(/[^0-9\.]/g,'');
+ break;
+ case date:
+ //console.log("date, alowing digits, / and -");
+ inp.value = inp.value.replace(/[^0-9\/\-]/g,'');
+ }
+
x6inputs.setClass(inp);
//console.groupEnd("Input keyUp");
},
@@ -737,7 +770,8 @@
jqFocusString: function() {
return ":input:not([disabled]):first";
- }
+ },
+
}
@@ -1049,12 +1083,18 @@
var retval = 'noaction';
}
else {
+
//console.log("attempting database save");
//console.log("Sending x4v_skey ",this.zSkey);
ua.json.init('x6page',this.zTable);
ua.json.addParm('x6action','save');
ua.json.addParm('x4v_skey',u.bb.vgfGet('skey_'+this.zTable));
ua.json.inputs(jq);
+ // Look for an "skey after" to send back
+ var skeyAfter = u.bb.vgfGet('skeyAfter_'+this.zTable,-1);
+ if(skeyAfter!=-1) {
+ ua.json.addParm('skeyAfter',skeyAfter);
+ }
if(ua.json.execute()) {
var retval = 'success';
ua.json.process();
@@ -1072,6 +1112,7 @@
x6events.fireEvent('uiShowErrors_'+this.zTable,errors);
}
}
+ u.bb.vgfSet('lastSave_'+this.zTable,retval);
// If save went ok, notify any ui elements, then
// fire off a cache save also if required.
@@ -1171,7 +1212,7 @@
// Make the request to the server
var args2 = { sortCol: this.zSortCol, sortAsc: this.zSortAsc };
- x6events.fireEvent('doSort_'+this.zTable,args2);
+ x6events.fireEvent('uiSort_'+this.zTable,args2);
}
@@ -1490,11 +1531,34 @@
innerDiv.innerHtml = newInput;
}
+ /*
+ * Kind of a big deal. If the grid has the
+ * flag xInsertAfter set to "Y", we must slip the
+ * new row in after the current, and trap the
+ * skey value of the current
+ */
+ var iAfter = false;
+ if(u.p(this,'xInsertAfter','N')=='Y') {
+ if(skey>0) {
+ iAfter = skey;
+ u.bb.vgfSet('skeyAfter_'+this.zTable,skey);
+ }
+ else {
+ u.bb.vgfSet('skeyAfter_'+this.zTable,0);
+ }
+ }
+ if(iAfter) {
+ $(this).find('#row_'+iAfter).after(newRow.bufferedRender());
+ }
+ else {
+ $(this).find('.tbody').prepend(newRow.bufferedRender());
+ u.bb.vgfSet('skeyAfter_'+this.zTable,-1);
+ }
+
/*
* Now do everything required to make the
* row visible and editable
*/
- $(this).find('.tbody').prepend(newRow.bufferedRender());
tabIndex = 1000;
$(this).find(':input').each(
function() {
@@ -1566,7 +1630,7 @@
tabIndex = 1000;
$(this).find('.tbody #row_'+skey+' :input').each(
function() {
- x6inputs.initInput(this,tabIndex++,'new','rowEdit');
+ x6inputs.initInput(this,tabIndex++,'edit','rowEdit');
}
);
var string = x6inputs.jqFocusString();
@@ -1882,4 +1946,25 @@
}
}
}
+
+ /*
+ * Accept request to sort on a column. The grid makes
+ * the request because the grid is going to display it,
+ * which keeps everything in one place.
+ */
+ x6events.subscribeToEvent('uiSort_'+table,id);
+ self['receiveEvent_uiSort_'+table] = function(args) {
+ u.bb.vgfSet('skey_'+this.zTable,-1);
+ ua.json.init('x6page',this.zTable);
+ ua.json.addParm('x6plugIn','grid');
+ ua.json.addParm('x6action','refresh');
+ ua.json.addParm('sortCol',args.sortCol);
+ ua.json.addParm('sortAsc',args.sortAsc);
+ u.dialogs.pleaseWait();
+ if(ua.json.execute(true)) {
+ var html = ua.json.jdata.html['*MAIN*'];
+ $(this).find('.tbody').replaceWith(html);
+ }
+ u.dialogs.clear();
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-11-20 15:22:52
|
Revision: 895
http://andro.svn.sourceforge.net/andro/?rev=895&view=rev
Author: kendowns
Date: 2008-11-20 15:22:49 +0000 (Thu, 20 Nov 2008)
Log Message:
-----------
Daily x6 improvements.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-11-17 14:58:03 UTC (rev 894)
+++ trunk/andro/clib/x6.js 2008-11-20 15:22:49 UTC (rev 895)
@@ -1611,6 +1611,33 @@
var uiEditRow = u.p(self,'uiEditRow','');
/*
+ * A grid may be set to receive a cacheRows event.
+ * If so, it will replace its own data with the
+ * data that has been provided.
+ */
+ if(u.p(self,'xCacheRows','')=='Y') {
+ x6events.subscribeToEvent('cacheRows_'+table,id);
+
+ self['receiveEvent_cacheRows_'+table] = function(rows) {
+ // Clear current data
+ $(this).find('.tbody').html();
+ // Add new data
+ for(var x in rows) {
+ this.addRow(rows[x]);
+ }
+ }
+ }
+
+ /*
+ * Related to the above is a simple command to add a row
+ *
+ */
+ self.addRow = function(row) {
+
+ }
+
+
+ /*
* The grid is happy to display a new row for
* editing if a certain flag has been set.
* The event uiNewRow is unconditional, it means
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-01 12:32:41
|
Revision: 903
http://andro.svn.sourceforge.net/andro/?rev=903&view=rev
Author: kendowns
Date: 2008-12-01 12:32:38 +0000 (Mon, 01 Dec 2008)
Log Message:
-----------
Many major changes after a week of development.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-01 12:32:15 UTC (rev 902)
+++ trunk/andro/clib/x6.js 2008-12-01 12:32:38 UTC (rev 903)
@@ -309,10 +309,22 @@
if( u.p(this.subscribers,eventName,null)==null) {
this.subscribers[eventName] = [ ];
}
- this.subscribers[eventName].push(id);
+ if(this.subscribers[eventName].indexOf(id)==-1) {
+ this.subscribers[eventName].push(id);
+ }
//console.groupEnd();
},
/******/
+
+ unsubscribeToEvent: function(eventName,id) {
+ var subs = u.p(this.subscribers,eventName);
+ if( subs!=null) {
+ var i = this.subscribers[eventName].indexOf(id);
+ if(i >= 0) {
+ this.subscribers[eventName].splice(i,1);
+ }
+ }
+ },
/****m* events/getSubscribers
*
@@ -397,7 +409,7 @@
break;
}
}
- //console.log("fireEvent RETURNING: ",this.retvals[eventName]);
+ //console.log("fireEvent ",eventName," RETURNING: ",this.retvals[eventName]);
//console.groupEnd();
return this.retvals[eventName];
}
@@ -426,6 +438,8 @@
case 'int':
case 'numb':
case 'money':
+ //console.log("I've got int, numb, or money", value);
+ if(value=='null') return '';
//console.log("x6dd.display returning number");
return Number(value);
break;
@@ -446,19 +460,27 @@
// DOM elements with property x6plugIn=xxx.
// Invoke the constructor for each one.
init: function() {
- u.debugFlag = true;
-
+ // KFD 11/28/08. Removed this and put initialization commands
+ // into jqDocReady. Turns out each plugin init
+ // takes 5ms, but the jquery search for them
+ // takes 350ms of a second, terrible. So the
+ // PHP code is generating commands to initialize
+ // each plugin.
// Job 1: Activate all of the plugins
+ /*
for(var plugInId in x6plugins) {
$('[x6plugIn='+plugInId+']').each(function() {
if(u.p(this,'id','')=='') {
this.id = u.uniqueId();
}
+ //console.time("inititialing "+this.id);
this.zTable = u.p(this,'x6table');
//console.log("Initializing x6plugin ",this);
x6plugins[plugInId](this,this.id,this.zTable);
+ //console.timeEnd("inititialing "+this.id);
});
}
+ */
// Job 2, activate a global keyboard handler
$(document).keypress(function(e) {
@@ -481,7 +503,9 @@
},
initFocus: function() {
- $('[x6firstFocus=Y]:last').focus();
+ var first = $('[x6firstFocus=Y]:last');
+ if(first.length>0) first.focus();
+ else $('.x6main').focus();
},
// Keyboard handler
@@ -493,9 +517,6 @@
x4Keys['8'] = 'BackSpace';
x4Keys['9'] = 'Tab';
x4Keys['13'] = 'Enter';
- //x4Keys['16'] = ''; // actually Shift, but prefix will take care of it
- //x4Keys['17'] = ''; // actually Ctrl, but prefix will take care of it
- //x4Keys['18'] = ''; // actually Alt, but prefix will take care of it
x4Keys['16'] = 'Shift';
x4Keys['17'] = 'Ctrl';
x4Keys['18'] = 'Alt';
@@ -594,11 +615,11 @@
// Get the read-only decision
if(mode=='new') {
//console.log("hello, ro ins");
- input.zRO = u.p(input,'xroins','N')=='Y' ? 1: 0;
+ input.disabled = u.p(input,'xroins','N')=='Y';
}
else {
//console.log("hello, ro upd");
- input.zRO = u.p(input,'xroupd','N')=='Y' ? 1: 0;
+ input.disabled = u.p(input,'xroupd','N')=='Y';
}
// This is standard events and attributes
@@ -607,13 +628,14 @@
/* IE Madness. If no value assigned, the property
is not there, must use u.p */;
//input.zOriginalValue = input.value.trim();
+ // KFD 11/27/08, this belongs in focus...
input.zOriginalValue = u.p(input,'value','').trim();
if(!input.zRO) {
$(input)
.keyup(function(e) { x6inputs.keyUp(e,this) })
- .focus(function(e) { x6inputs.focus(e,this) })
- .blur(function(e) { x6inputs.blur(e,this) })
- .keydown(function(e) { x6inputs.keyDown(e,this) });
+ .focus(function(e) { x6inputs.focus(this) })
+ .blur(function(e) { x6inputs.blur(this) })
+ .keydown(function(e) { return x6inputs.keyDown(e,this) });
}
if(mode=='new') {
input.zNew = 1;
@@ -642,26 +664,6 @@
//console.log(e);
//console.log(inp);
- // if a numeric, filter out disallowed values
- type = u.p(inp,'xtypeid');
- //console.log(typeof(inp.value));
- switch(type) {
- case 'int':
- //console.log("int, allowing only digits");
- //console.log(inp);
- //console.log(inp.value);
- inp.value = inp.value.replace(/[^0-9]/g,'');
- break;
- case 'numb':
- case 'money':
- //console.log("numb or money, allowing only digits and period");
- inp.value = inp.value.replace(/[^0-9\.]/g,'');
- break;
- case 'date':
- //console.log("date, alowing digits, / and -");
- inp.value = inp.value.replace(/[^0-9\/\-]/g,'');
- }
-
x6inputs.setClass(inp);
//console.groupEnd("Input keyUp");
},
@@ -672,64 +674,246 @@
// current control
//
keyDown: function(e,inp) {
- if(e.keyCode!=9) return true;
- //console.group("input keyDown handler");
+ //console.group('Input keyDown ');
//console.log(e);
//console.log(inp);
+ var keyLabel=u.keyLabel(e);
+ var isTab =keyLabel=='Tab' || keyLabel=='ShiftTab';
+ var isEnter =keyLabel=='Enter' || keyLabel=='ShiftEnter';
+ var isMeta =u.keyIsMeta(e);
+ var isNav =isEnter || isTab;
+ //console.log("label ",keyLabel,' isTab ',isTab,' isEnter ',isEnter,' isMeta ',isMeta,' isNav ',isNav);
- var tg = u.p(inp,'xTabGroup','tgdefault');
- //console.log("Tab Group",tg);
+ // All meta keys return true immediately except TAB and ENTER
+ if(isMeta && !isNav) {
+ //console.log("meta key but not tab or enter, returning true");
+ //console.groupEnd();
+ return true;
+ }
- if(e.shiftKey) {
- // hitting shift-tab on the first control means
- // jump back to the last control
- var first = $('[xTabGroup='+tg+']:not([disabled]):first')[0];
- //console.log("The first is:");
- //console.log(first);
- //console.log("The input is:");
- //console.log(inp);
- if(first==inp) {
- //console.log("This is first, jumping to last");
- $('[xTabGroup='+tg+']:not([disabled]):last').focus();
- e.preventDefault();
+ // Type validation for some types, only if not TAB or ENTER
+ if(!isNav) {
+ //console.log("Not nav key, doing type validation");
+ type = u.p(inp,'xtypeid');
+ switch(type) {
+ case 'int':
+ //console.log("type validation for int");
+ if(!u.keyIsNumeric(e)) return false;
+ break;
+ case 'numb':
+ case 'money':
+ //console.log("type validation for numb/money");
+ if(!u.keyIsNumeric(e) && u.keyLabel(e)!='.') return false;
+ break;
+ case 'date':
+ //console.log("type validation for date");
+ if(!u.keyIsNumeric(e)) {
+ if(keyLabel!='-' && keyLabel!='/') return false;
+ }
}
+ //console.log("Type validation complete, returning true");
+ //console.groupEnd();
+ return true;
}
+
+
+ // This took a lot of experimentation to get right.
+ // Normally a BLUR would occur when an object loses focus
+ // -> except if the user hits ENTER, we must force validation
+ // -> except if validation enables new controls
+ //
+ // So we unconditionally fire the afterblurner to hit
+ // anything the control's special validation code might
+ // do. Then we proceed normally.
+ //
+ // Also: returning false does NOT prevent losing focus,
+ // that's we don't check the return value.
+ x6inputs.afterBlurner(inp);
+
+ // Get the first and last controls for easier
+ // logic immediately below
+ var tg = u.p(inp,'xTabGroup','tgdefault');
+ var jqString = '[xTabGroup='+tg+']:not([disabled])';
+ var jqObj = $(jqString)
+ var inpCount = jqObj.length;
+ var first = jqObj[0];
+ var last = jqObj[inpCount-1];
+
+ // If we are on first or last, Enter/Tab dichotomy does not matter,
+ // we just send focus where we want and return false to kill
+ // original behavior.
+ if(inp==first && e.shiftKey) {
+ $('[xTabGroup='+tg+']:not([disabled]):last').focus();
+ //console.log("First input, hit shift, going to last");
+ //console.groupEnd();
+ return false;
+ }
+ if(inp==last && !e.shiftKey) {
+ $('[xTabGroup='+tg+']:not([disabled]):first').focus();
+ //console.log("Last input, no shift, going to first");
+ //console.groupEnd();
+ return false;
+ }
+
+ // If they hit the TAB key, we can quit now and return
+ // true to allow default behavior. If they hit ENTER
+ // we have to work out the next control to give focus
+ // to, either forward or backward
+ if(isTab) {
+ //console.log("Tab key hit, returning true");
+ //console.groupEnd();
+ return true;
+ }
+ if(!e.shiftKey) {
+ // no shift means look for next one
+ var focusTo = false;
+ var foundMe = false;
+ $('[xTabGroup='+tg+']:not([disabled])').each(
+ function() {
+ //console.log(this.id);
+ //console.log(focusTo,foundMe);
+ if(focusTo) return;
+ if(foundMe) {
+ focusTo = this.id;
+ }
+ if(this == inp) foundMe = true;
+ }
+ );
+ if(focusTo) {
+ //console.log("Setting focus forward to ",focusTo);
+ $('#'+focusTo).focus().select();
+ }
+
+ }
else {
- // hitting tab on the last control is the only
- // thing I care about. If I'm not on the last
- // control, let the browser do it, much faster.
- var last = $('[xTabGroup='+tg+']:not([disabled]):last')[0];
- //console.log("The last is:");
- //console.log(last);
- //console.log("The input is:");
- //console.log(inp);
- if(last==inp) {
- //console.log("This is last, jumping to first");
- $('[xTabGroup='+tg+']:not([disabled]):first').focus();
- e.preventDefault();
+ // shift means look for previous one. Go forward
+ // through inputs, assuming each one is the one that
+ // will get focus. Once we find the input we are
+ // on stop doing that, and the last one assigned will
+ // be the one that gets focus.
+ var focusTo = false;
+ var foundMe = false;
+ $('[xTabGroup='+tg+']:not([disabled])').each(
+ function() {
+ if(foundMe) return;
+ if(this == inp)
+ foundMe = true;
+ else
+ focusTo = this.id;
+ }
+ );
+ if(focusTo) {
+ //console.log("Setting focus backward to ",focusTo);
+ $('#'+focusTo).focus().select();
}
}
+ //console.log("Returning True");
//console.groupEnd();
- return;
+ return true;
},
focus: function(inp) {
+ //console.group("Input focus ",inp.id);
+ //console.log("Input: ",inp);
inp.zSelected = 1;
+ inp.zOriginalValue = u.p(inp,'zOriginalValue','').trim();
+ inp.lastBlurred = '';
x6inputs.setClass(inp);
+ //console.log("Input focus DONE");
+ //console.groupEnd();
+ return true;
},
- xFocus: function(anyObject) {
- $(this).addClass('selected');
- },
+ // KFD 11/29/08, not being called anywhere?
+ //xFocus: function(anyObject) {
+ // $(this).addCla*ss('selected');
+ //},
blur: function(inp) {
+ //console.group("Input blur ",inp.id);
inp.zSelected = 0;
x6inputs.setClass(inp);
+ x6inputs.afterBlurner(inp);
+ //console.log("Input Blur DONE");
+ //console.groupEnd();
+ return true;
},
- xBlur: function(anyObject) {
- $(anyObject).removeClass('selected');
+ // KFD 11/29/08, not being called anywhere?
+ //xBlur: function(anyObject) {
+ //},
+ /*
+ * We need to route through a wrapper to afterBlur
+ * mostly to keep it from firing multiple times.
+ * Example: a blur calling alert() causes blur to fire again
+ *
+ */
+ afterBlurner: function(inp) {
+ //console.group("afterBlurner");
+ //console.log(inp);
+ if(u.p(inp,'inblur',false)) {
+ //console.log("inblur flag set, no action");
+ //console.groupEnd();
+ return false;
+ }
+ inp.inblur = true;
+ // If method does not exist forget it
+ if(!inp.afterBlur) {
+ //console.log("No afterBlur(), leaving flag set and returning");
+ //console.groupEnd();
+ return true;
+ }
+ // If value has changed, fire it
+ if(inp.lastBlurred==u.p(inp,'value','').trim()) {
+ //console.log("Input lastBlurred is current value, no action");
+ //console.groupEnd();
+ inp.inblur = false;
+ return true;
+ }
+ else {
+ // Note that returning true only means the afterBlur() will
+ // not be fired again for this value. It does not mean there
+ // is anything particularly "valid" or correct about the
+ // value.
+ if(inp.afterBlur()) {
+ //console.log("Afterblurner setting flag false, return true");
+ //console.groupEnd();
+ inp.inblur = false;
+ inp.lastBlurred = u.p(inp,'value','').trim();
+ return true;
+ }
+ else {
+ //console.log("Afterblurner setting flag false, return false");
+ //console.groupEnd();
+ inp.inblur = false;
+ return false;
+ }
+ }
},
+ enable: function(inp) {
+ if(typeof(inp)=='string') inp = u.byId(inp);
+ //console.log("Enabling input ",inp.id);
+ inp.disabled = false;
+ inp.zOriginalValue = u.p(inp,'value','');
+ this.setClass(inp);
+ },
+ disable: function(inp) {
+ if(typeof(inp)=='string') inp = u.byId(inp);
+ //console.log("Disabling input ",inp.id);
+ inp.disabled = true;
+ this.setClass(inp);
+ },
+
setClass: function(inp) {
+ // Easiest is disabled controls, remove all classes
+ if(u.p(inp,'disabled',false)) {
+ inp.className='';
+ doRow = u.p(inp,'xClassRow',0);
+ if(doRow) {
+ inp.parentNode.parentNode.className = '';
+ }
+ return;
+ }
+
ux = u.uniqueId();
//console.group("setClass for an input "+ux);
//console.log(inp);
@@ -746,13 +930,13 @@
var zSelected = u.p(inp,'zSelected',0);
var zChanged = u.p(inp,'zChanged', 0);
var zError = u.p(inp,'zError' , 0);
- var zRO = u.p(inp,'zRO' , 0);
+ //var zRO = u.p(inp,'zRO' , 0);
var zNew = u.p(inp,'zNew' , 0);
// now pick them in order of preference,
// we only pick one stem.
- if (zRO) css = 'readOnly';
- else if(zError) css = 'error';
+ //if (zRO) css = 'readOnly';
+ if(zError) css = 'error';
else if(zNew) css = 'changed';
else if(zChanged) css = 'changed';
else css = '';
@@ -763,7 +947,7 @@
//console.log("Final class is "+css);
// Now do some stuff if it is read only
- inp.disabled = zRO;
+ //inp.disabled = zRO;
//console.log("Read Only Decision is",inp.disabled);
// Flag to do the row
@@ -771,17 +955,24 @@
// Now set the class name
inp.className = css;
- if(doRow && zSelected) {
- inp.parentNode.parentNode.className = 'selected';
+ if(doRow!=0) {
+ //console.log('do row');
+ if(zSelected) {
+ inp.parentNode.parentNode.className = 'selected';
+ }
+ else {
+ inp.parentNode.parentNode.className = '';
+ }
}
- if(doRow && !zSelected) {
- inp.parentNode.parentNode.className = '';
- }
//console.groupEnd();
},
clearOut: function(inp) {
- inp.zRO = 1;
+ if(inp.zSelected==1) {
+ //console.log("In clear out, blurring ",inp);
+ inp.blur();
+ }
+ inp.disabled = true;
inp.zNew = 0;
inp.zSelected = 0;
inp.value = '';
@@ -800,6 +991,25 @@
jqFocusString: function() {
return ":input:not([disabled]):first";
+ },
+
+ obj: function(table,column) {
+ if(table ==null) table='';
+ if(column==null) column='';
+ var selector = ':input'
+ if(table!='') {
+ selector += '[xtableid='+table+']';
+ }
+ if(column!='') {
+ selector += '[xcolumnid='+column+']';
+ }
+ var jq = $(selector);
+ if(jq.length>0) {
+ return jq[0];
+ }
+ else {
+ return false;
+ }
}
}
@@ -915,12 +1125,14 @@
x6events.fireEvent('reqNewRow_'+this.zTable);
}
},
+ /*
buttonDuplicate: function(self,id,table) {
x6plugins.buttonStandard(self,'duplicate','CtrlD');
self.main = function() {
x6events.fireEvent('reqNewRow_'+this.zTable,true);
}
},
+ */
buttonRemove: function(self,id,table) {
x6plugins.buttonStandard(self,'remove','CtrlR');
self.main = function() {
@@ -1037,6 +1249,18 @@
$(self).click(function() {
if(!this.zDisabled) this.main();
});
+
+ // Make cute mouse effects on buttons
+ self.onmousedown = function() {
+ if(!this.zDisabled) {
+ $(this).addClass('button_mousedown');
+ }
+ }
+ self.onmouseup = self.onmouseout = function() {
+ if(!this.zDisabled) {
+ $(this).removeClass('button_mousedown');
+ }
+ }
}
}
@@ -1093,6 +1317,7 @@
x6plugins.tableController = function(self,id,table) {
// Initialize new properties
u.bb.vgfSet('skey_'+table,-1);
+ self.zTable = table;
self.zSortCol = false;
self.zSortAsc = false;
self.zCache = u.p(self,'xCache')=='Y' ? true : false;
@@ -1153,16 +1378,16 @@
self['receiveEvent_reqEditRow_'+table] = function(skey) {
//console.group("tableController reqEditRow "+this.zTable);
var skeynow = u.bb.vgfGet('skey_'+this.zTable);
- //if(skeynow == skey) {
- // //console.log("Request to edit same row, no action");
- //}
- //else {
+ if(skeynow == skey) {
+ //console.log("Request to edit same row, no action");
+ }
+ else {
var result = this.saveOk();
u.bb.vgfSet('lastSave_'+this.zTable,result);
if(result!='fail') {
x6events.fireEvent('uiEditRow_'+table,skey);
}
- //}
+ }
//console.log("tableController reqEditRow finished");
//console.groupEnd();
return true;
@@ -1209,7 +1434,7 @@
//console.log("Sending x4v_skey ",this.zSkey);
ua.json.init('x6page',this.zTable);
ua.json.addParm('x6action','save');
- ua.json.addParm('x4v_skey',u.bb.vgfGet('skey_'+this.zTable));
+ ua.json.addParm('x6v_skey',u.bb.vgfGet('skey_'+this.zTable));
ua.json.inputs(jq);
// Look for an "skey after" to send back
var skeyAfter = u.bb.vgfGet('skeyAfter_'+this.zTable,-1);
@@ -1271,7 +1496,7 @@
x6inputs.setClass(this);
}
);
- x6events.fireEvent('uiUndoRow_'+this.zTable);
+ x6events.fireEvent('uiUndoRow_'+this.zTable,skey);
}
//console.log("tableController reqUndoRow Finished");
//console.groupEnd();
@@ -1369,7 +1594,7 @@
//console.log("tableController bbRow, no row found, fetching");
ua.json.init('x6page',this.zTable);
ua.json.addParm('x6action','fetchRow');
- ua.json.addParm('x4w_skey',skey);
+ ua.json.addParm('x6w_skey',skey);
if(ua.json.execute(true)) {
u.bb.vgfSet('dbRow_'+this.zTable,a.data.row);
}
@@ -1427,6 +1652,17 @@
******
*/
x6plugins.detailDisplay = function(self,id,table) {
+ self.zTable = table;
+
+ // If we are supposed to start out disabled, do it
+ if(u.p(self,'xInitDisabled','N')=='Y') {
+ $(self).find(":input").each(
+ function() {
+ x6inputs.disable(this);
+ }
+ );
+ }
+
// detail receives a request to go to a mode which
// is unconditional, it will do what it is told
x6events.subscribeToEvent('uiEditRow_'+table,id);
@@ -1465,6 +1701,22 @@
//console.log("detailDisplay uiRowSaved FINISHED");
//console.groupEnd();
}
+
+ /*
+ * A detail always subscribes to uiUndoRow, and disables
+ * and clears all controls.
+ *
+ */
+ x6events.subscribeToEvent('uiUndoRow_'+table,id);
+ self['receiveEvent_uiUndoRow_'+table] = function(skey) {
+ $(this).find(":input").each(
+ function() {
+ x6inputs.clearOut(this);
+ }
+ );
+ u.bb.vgfSet('skey_'+this.zTable,-1);
+ }
+
/*
* A uiDelRow clears all inputs
@@ -1473,12 +1725,7 @@
self['receiveEvent_uiDelRow_'+table] = function(skey) {
//console.group("detailDisplay uiDelRow",skey);
$(this).find(':input').each(function() {
- this.value='';
- this.zOriginalValue = '';
- this.zChanged = 0;
- this.zActive = 0;
- this.zRo = 1;
- x6inputs.setClass(this);
+ x6inputs.clearOut(this);
});
x6events.fireEvent('buttonsOff_'+this.zTable);
//console.log("detailDisplay uiDelRow FINISHED");
@@ -1529,16 +1776,15 @@
var ro = u.p(this,'xroupd','N');
}
if(ro=='Y') {
- this.zRO = 1;
this.disabled = true;
}
else {
- this.zRO = 0;
this.disabled = false;
}
x6inputs.setClass(this);
});
- $(this).find(':input:not(.readOnly):first').focus();
+ var jqString = x6inputs.jqFocusString();
+ $(this).find(jqString).focus();
// Now that all displays are done, if we have a tab
// selector then select it
@@ -1602,6 +1848,10 @@
******
*/
x6plugins.x6tabDiv = function(self,id,table) {
+ self.zTable = table;
+ self.x6profile = u.p(self,'x6profile','none');
+ self.kbOnEdit = ['x6tabDiv','twosides'].indexOf(self.x6profile)>=0;
+
/*
* These two will tell us down below if the grid
* displays inputs for new rows and allows
@@ -1609,7 +1859,7 @@
*/
var uiNewRow = u.p(self,'uiNewRow' ,'');
var uiEditRow = u.p(self,'uiEditRow','');
-
+
/*
* A grid may be set to receive a cacheRows event.
* If so, it will replace its own data with the
@@ -1622,32 +1872,28 @@
// Clear current data
$(this).find('.tbody').html();
// Add new data
- for(var x in rows) {
- this.addRow(rows[x]);
- }
+ //for(var x in rows) {
+ // this.addRow(rows[x]);
+ //}
}
}
/*
- * Related to the above is a simple command to add a row
- *
- */
- self.addRow = function(row) {
-
- }
-
-
- /*
* The grid is happy to display a new row for
* editing if a certain flag has been set.
* The event uiNewRow is unconditional, it means
* all prerequisites have been met and the grid
* should proceed forthwith.
*/
- if(uiNewRow=='inline') {
- x6events.subscribeToEvent('uiNewRow_'+table,id);
-
+ x6events.subscribeToEvent('uiNewRow_'+table,id);
+ if(uiNewRow!='inline') {
+ // If not inline, it always stops responding on a new row
self['receiveEvent_uiNewRow_'+table] = function() {
+ this.keyboardOff();
+ }
+ }
+ else {
+ self['receiveEvent_uiNewRow_'+table] = function() {
//console.group("tabDiv uiNewRow "+this.zTable);
var skey = u.bb.vgfGet('skey_'+this.zTable,-1);
@@ -1676,27 +1922,6 @@
* inputs that have been provided by the PHP code,
* and get them all initialized and ready to go.
*/
- /* Don't work in IE
- var newRow = new jsHtml('div');
- newRow.hp.id = 'row_0';
- newRow.hp.style = 'display: none;';
- var numbers = [ 'int', 'numb', 'money' ];
- for (var idx in this.zColsInfo) {
- var colInfo = this.zColsInfo[idx];
- if(colInfo.column_id == '') continue;
-
- var innerDiv = newRow.h('div');
- innerDiv.hp.style= "width: "+colInfo.width+"px;";
- innerDiv.hp.gColumn = idx;
- if(numbers.indexOf(colInfo.type_id)>=0) {
- innerDiv.hp.style+="text-align: right";
- }
- var id = '#wrapper_'+this.zTable+'_'+colInfo.column_id;
- var newInput = $(id).html();
- //console.log("column: ",colInfo.column_id);
- innerDiv.innerHtml = newInput;
- }
- */
var newRow = "<div id='row_0' style='display:none'>";
var numbers = [ 'int', 'numb', 'money' ];
for (var idx in this.zColsInfo) {
@@ -1749,9 +1974,10 @@
*/
tabIndex = 1000;
$(this).find(':input').each(
- function() {
+ function() {
x6inputs.initInput(this,tabIndex++,'new','rowNew');
this.setAttribute('xTabGroup','rowEdit');
+ this.setAttribute('xClassRow','0');
}
);
var grid = this;
@@ -1764,22 +1990,27 @@
// Send a message and get lost
u.bb.vgfSet('skey_'+this.zTable,0);
x6events.fireEvent('buttonsOn_'+this.zTable);
+ this.keyboardOff();
//console.log('New row created, ready to edit');
//console.groupEnd();
return true;
}
}
-
+
+
/*
- * The grid is happy to display an existing row
- * for editing if the flag has been set. This
- * is an unconditional event, it assumes all is
- * well and nothing stands in the way of editing.
+ * Always subscribe to an editrow command. If in edit
+ * mode the handler makes inputs and stuff. If not,
+ * it just turns off the keyboard.
*/
- if(uiEditRow=='inline') {
- x6events.subscribeToEvent('uiEditRow_'+table,id);
-
+ x6events.subscribeToEvent('uiEditRow_'+table,id);
+ if(uiEditRow!='inline') {
self['receiveEvent_uiEditRow_'+table] = function(skey) {
+ this.keyboardOff();
+ }
+ }
+ else {
+ self['receiveEvent_uiEditRow_'+table] = function(skey) {
//console.group("tabDiv uiEditRow "+this.zTable);
if( $(this).find('#row_'+skey).length == 0) {
@@ -1813,15 +2044,18 @@
var colnum = u.p(this,'gColumn');
var colid = ...
[truncated message content] |
|
From: <ken...@us...> - 2008-12-08 17:01:24
|
Revision: 917
http://andro.svn.sourceforge.net/andro/?rev=917&view=rev
Author: kendowns
Date: 2008-12-08 17:01:21 +0000 (Mon, 08 Dec 2008)
Log Message:
-----------
Many major changes after hack-a-thon
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-08 17:00:56 UTC (rev 916)
+++ trunk/andro/clib/x6.js 2008-12-08 17:01:21 UTC (rev 917)
@@ -35,12 +35,12 @@
Beanshell files show the jEdit commands for turning logging
on and off by commenting and uncommenting the relevant lines.
- If you want to do it manually, just replace all "console."
+ If you want to do it manually, just replace all "//console."
with "//console." or vice-versa.
# Beanshell: Turn logging off by commenting out lines
- SearchAndReplace.setSearchString("console.");
- SearchAndReplace.setReplaceString("console.");
+ SearchAndReplace.setSearchString("//console.");
+ SearchAndReplace.setReplaceString("//console.");
SearchAndReplace.setBeanShellReplace(false);
SearchAndReplace.setIgnoreCase(true);
SearchAndReplace.setRegexp(false);
@@ -48,8 +48,8 @@
SearchAndReplace.replaceAll(view);
# Beanshell: Turn logging on by uncommenting the lines.
- SearchAndReplace.setSearchString("console.");
- SearchAndReplace.setReplaceString("console.");
+ SearchAndReplace.setSearchString("//console.");
+ SearchAndReplace.setReplaceString("//console.");
SearchAndReplace.setBeanShellReplace(false);
SearchAndReplace.setIgnoreCase(true);
SearchAndReplace.setRegexp(false);
@@ -463,32 +463,13 @@
// DOM elements with property x6plugIn=xxx.
// Invoke the constructor for each one.
init: function() {
- // KFD 11/28/08. Removed this and put initialization commands
- // into jqDocReady. Turns out each plugin init
- // takes 5ms, but the jquery search for them
- // takes 350ms of a second, terrible. So the
- // PHP code is generating commands to initialize
- // each plugin.
- // Job 1: Activate all of the plugins
- /*
- for(var plugInId in x6plugins) {
- $('[x6plugIn='+plugInId+']').each(function() {
- if(u.p(this,'id','')=='') {
- this.id = u.uniqueId();
- }
- //console.time("inititialing "+this.id);
- this.zTable = u.p(this,'x6table');
- //console.log("Initializing x6plugin ",this);
- x6plugins[plugInId](this,this.id,this.zTable);
- //console.timeEnd("inititialing "+this.id);
- });
- }
- */
-
- // Job 2, activate a global keyboard handler
+ // Activate a global keyboard handler
+ // SEE ALSO: input.keyDown(), it must also pass some
+ // events to keyDispatcher that don't go to
+ // the document.keypress from an input
$(document).keypress(function(e) {
//console.group("Document Keypress");
- //console.log(e);
+ //console.log("keypress ",e);
var retval= x6.keyDispatcher(e);
//console.groupEnd();
return retval;
@@ -508,6 +489,7 @@
initFocus: function() {
//var str = '[x6firstFocus=Y]:not([disabled]):reallyvisible:first';
var str = 'input:not([disabled]):reallyvisible:first';
+ //var first = $('input:not([disabled])').isVisible().find(':first');
var first = $(str);
if(first.length>0) first.focus();
else $('.x6main').focus();
@@ -515,73 +497,6 @@
// Keyboard handler
keyDispatcher: function(e) {
- /*
- var x = e.keyCode;
-
- // First make a big list of codes and look for the event
- var x4Keys = { };
- x4Keys['8'] = 'BackSpace';
- x4Keys['9'] = 'Tab';
- x4Keys['13'] = 'Enter';
- x4Keys['16'] = 'Shift';
- x4Keys['17'] = 'Ctrl';
- x4Keys['18'] = 'Alt';
- x4Keys['20'] = 'CapsLock';
- x4Keys['27'] = 'Esc';
- x4Keys['33'] = 'PageUp';
- x4Keys['34'] = 'PageDown';
- x4Keys['35'] = 'End';
- x4Keys['36'] = 'Home';
- x4Keys['37'] = 'LeftArrow';
- x4Keys['38'] = 'UpArrow';
- x4Keys['39'] = 'RightArrow';
- x4Keys['40'] = 'DownArrow';
- x4Keys['45'] = 'Insert';
- x4Keys['46'] = 'Delete';
- x4Keys['112']= 'F1' ;
- x4Keys['113']= 'F2' ;
- x4Keys['114']= 'F3' ;
- x4Keys['115']= 'F4' ;
- x4Keys['116']= 'F5' ;
- x4Keys['117']= 'F6' ;
- x4Keys['118']= 'F7' ;
- x4Keys['119']= 'F8' ;
- x4Keys['120']= 'F9' ;
- x4Keys['121']= 'F10';
- x4Keys['122']= 'F11';
- x4Keys['123']= 'F12';
-
- // If they did not hit a control key of some sort, look
- // next for letters
- var retval = '';
- if(typeof(x4Keys[x])!='undefined') {
- retval = x4Keys[x];
- }
- else {
- var letters =
- [ 'A', 'B', 'C', 'D', 'E', 'F', 'G',
- 'H', 'I', 'J', 'K', 'L', 'M', 'N',
- 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
- 'V', 'W', 'X', 'Y', 'Z' ];
- var numbers = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ];
- if(e.charCode >= 65 && e.charCode <= 90) {
- retval = letters[e.charCode - 65];
- }
- else if(e.charCode >= 97 && e.charCode <= 121) {
- retval = letters[e.charCode - 97];
- }
- else if(e.charCode >= 48 && e.charCode <= 57) {
- retval = numbers[e.charCode - 48];
- }
- }
-
- // otherwise put on any prefixes and return
- if(e.ctrlKey) retval = 'Ctrl' + retval;
- // KFD 8/4/08, this never worked, removed.
- if(e.altKey) retval = 'Alt' + retval;
- if(e.shiftKey) retval = 'Shift' + retval;
- */
-
var retval = u.keyLabel(e);
// Make list of keys to stop no matter what
@@ -614,57 +529,6 @@
\* **************************************************************** */
var x6inputs = {
- // This routine takes an input that has no x6 event
- // handlers and adds all of the event handlers to it
- initInput: function(input,tabIndex,mode,tabGroup) {
- //console.group("Initializing Input");
- //console.log("tabindex, mode, tabgroup: ",tabIndex,mode,tabGroup);
- //console.log(input);
-
- // Get the read-only decision
- if(mode=='new') {
- //console.log("hello, ro ins");
- input.disabled = u.p(input,'xroins','N')=='Y';
- }
- else {
- //console.log("hello, ro upd");
- input.disabled = u.p(input,'xroupd','N')=='Y';
- }
-
- // This is standard events and attributes
- input.setAttribute('xTabGroup',tabGroup);
- input.setAttribute('tabIndex' ,tabIndex);
- /* IE Madness. If no value assigned, the property
- is not there, must use u.p */;
- //input.zOriginalValue = input.value.trim();
- // KFD 11/27/08, this belongs in focus...
- input.zOriginalValue = u.p(input,'value','').trim();
- if(!input.zRO) {
- $(input)
- .keyup(function(e) { x6inputs.keyUp(e,this) })
- .focus(function(e) { x6inputs.focus(this) })
- .blur(function(e) { x6inputs.blur(this) })
- .keydown(function(e) { return x6inputs.keyDown(e,this) });
- }
- if(mode=='new') {
- input.zNew = 1;
- }
- x6inputs.setClass(input);
-
- // KFD 11/1/08, EXPERIMENTAL use of jquery.maskedinput
- //if(u.p(input,'xinputmask','')!='') {
- // $(input).mask(u.p(input,'xinputmask'));
- //}
-
- // This is important, it says that this is an
- // active input. This distinguishes it from possible
- // hidden inputs that were used as a clone source
- // that have many of the same properties.
- input.zActive = 1;
-
- //console.groupEnd();
- },
-
// Key up is used to look for changed values because
// you do not see an input's new value until the keyup
// event. You do not see it in keypress or keydown.
@@ -684,7 +548,6 @@
//
keyDown: function(e,inp) {
//console.group('Input keyDown ');
- //console.log(e);
//console.log(inp);
var keyLabel=u.keyLabel(e);
var isTab =keyLabel=='Tab' || keyLabel=='ShiftTab';
@@ -695,7 +558,35 @@
// All meta keys return true immediately except TAB and ENTER
if(isMeta && !isNav) {
- //console.log("meta key but not tab or enter, returning true");
+ //console.log(keyLabel);
+ var handUpList = ['UpArrow','DownArrow','PageUp','PageDown'];
+ if(handUpList.indexOf(keyLabel)>=0) {
+ //console.log("Weird key that we pass up to doc-level keyPress");
+ var retval= x6.keyDispatcher(e);
+ //console.groupEnd();
+ return retval;
+ }
+ else if(keyLabel=='CtrlLeftArrow') {
+ this.firstInput(inp);
+ }
+ else if(keyLabel=='CtrlRightArrow') {
+ this.lastInput(inp);
+ }
+ else if(keyLabel=='Home') {
+ if(inp.selectionStart == 0 && inp.selectionEnd==0)
+ this.firstInput(inp);
+ }
+ else if(keyLabel=='End') {
+ //console.log(inp);
+ var ss = inp.selectionStart;
+ var se = inp.selectionEnd;
+ var ln = inp.value.toString().trim().length;
+ //console.log(ss,se,ln);
+ if(ss == se && se == ln) this.lastInput(inp);
+ }
+ else {
+ //console.log("meta but not nav, ret true");
+ }
//console.groupEnd();
return true;
}
@@ -998,6 +889,15 @@
}
},
+ firstInput: function(inp) {
+ var xtg = u.p(inp,'xTabGroup','tgdefault');
+ $(":input[xtabgroup="+xtg+"]:not([disabled]):first").focus();
+ },
+ lastInput: function(inp) {
+ var xtg = u.p(inp,'xTabGroup','tgdefault');
+ $(":input[xtabgroup="+xtg+"]:not([disabled]):last").focus();
+ },
+
jqFocusString: function() {
return ":input:not([disabled]):first";
},
@@ -1057,14 +957,14 @@
}
},
*/
- buttonRemove: function(self,id,table) {
- x6plugins.buttonStandard(self,'remove','CtrlR');
+ buttonDelete: function(self,id,table) {
+ x6plugins.buttonStandard(self,'delete','CtrlD');
self.main = function() {
x6events.fireEvent('reqDelRow_'+this.zTable);
}
},
- buttonAbandon: function(self,id,table) {
- x6plugins.buttonStandard(self,'abandon','CtrlT');
+ buttonCancel: function(self,id,table) {
+ x6plugins.buttonStandard(self,'cancel','Esc');
self.main = function() {
if(confirm("Abandon all changes?")) {
x6events.fireEvent('reqUndoRow_'+this.zTable);
@@ -1139,15 +1039,15 @@
self.zKey = key;
// Respond to an enable event
- x6events.subscribeToEvent('enable_'+action,self.id);
- self['receiveEvent_enable_'+action] = function() {
+ x6events.subscribeToEvent('enable_'+action+'_'+self.zTable,self.id);
+ self['receiveEvent_enable_'+action+'_'+self.zTable] = function() {
this.className = 'button';
this.zDisabled = false;
}
// Respond to an disable event
- x6events.subscribeToEvent('disable_'+action,self.id);
- self['receiveEvent_disable_'+action] = function() {
+ x6events.subscribeToEvent('disable_'+action+'_'+self.zTable,self.id);
+ self['receiveEvent_disable_'+action+'_'+self.zTable] = function() {
this.className = 'button_disabled';
this.zDisabled = true;
}
@@ -1536,15 +1436,15 @@
*/
x6events.subscribeToEvent('buttonsOn_'+table,id);
self['receiveEvent_buttonsOn_'+table] = function() {
- x6events.fireEvent('enable_save');
- x6events.fireEvent('enable_abandon');
- x6events.fireEvent('enable_remove');
+ x6events.fireEvent('enable_save_' +this.zTable);
+ x6events.fireEvent('enable_abandon_'+this.zTable);
+ x6events.fireEvent('enable_remove_' +this.zTable);
}
x6events.subscribeToEvent('buttonsOff_'+table,id);
self['receiveEvent_buttonsOff_'+table] = function() {
- x6events.fireEvent('disable_save');
- x6events.fireEvent('disable_abandon');
- x6events.fireEvent('disable_remove');
+ x6events.fireEvent('disable_save_' +this.zTable);
+ x6events.fireEvent('disable_abandon_'+this.zTable);
+ x6events.fireEvent('disable_remove_' +this.zTable);
}
}
@@ -1810,7 +1710,7 @@
* should proceed forthwith.
*/
x6events.subscribeToEvent('uiNewRow_'+table,id);
- if(uiNewRow!='inline') {
+ if(uiNewRow!='Y') {
// If not inline, it always stops responding on a new row
self['receiveEvent_uiNewRow_'+table] = function() {
this.keyboardOff();
@@ -1897,10 +1797,10 @@
* row visible and editable
*/
tabIndex = 1000;
+ var grid = this;
$(this).find(':input').each(
function() {
- x6inputs.initInput(this,tabIndex++,'new','rowNew');
- this.setAttribute('xTabGroup','rowEdit');
+ grid.initInput(this,tabIndex++,'new','rowNew');
this.setAttribute('xClassRow','0');
}
);
@@ -1920,6 +1820,39 @@
return true;
}
}
+
+
+ self.initInput = function(input,tabIndex,mode,tabGroup) {
+ //console.group("Initializing Input");
+ //console.log("tabindex, mode, tabgroup: ",tabIndex,mode,tabGroup);
+ //console.log(input);
+
+ // Get the read-only decision
+ if(mode=='new') {
+ //console.log("hello, ro ins");
+ input.disabled = u.p(input,'xroins','N')=='Y';
+ }
+ else {
+ //console.log("hello, ro upd");
+ input.disabled = u.p(input,'xroupd','N')=='Y';
+ }
+
+ // This is standard events and attributes
+ input.setAttribute('xTabGroup',tabGroup);
+ input.setAttribute('tabIndex' ,tabIndex);
+ input.zOriginalValue = u.p(input,'value','').trim();
+ if(mode=='new') {
+ input.zNew = 1;
+ }
+ x6inputs.setClass(input);
+
+ // This is important, it says that this is an
+ // active input. This distinguishes it from possible
+ // hidden inputs that were used as a clone source
+ // that have many of the same properties.
+ input.zActive = 1;
+ //console.groupEnd();
+ }
/*
@@ -1928,9 +1861,9 @@
* it just turns off the keyboard.
*/
x6events.subscribeToEvent('uiEditRow_'+table,id);
- if(uiEditRow!='inline') {
+ if(uiEditRow!='Y') {
self['receiveEvent_uiEditRow_'+table] = function(skey) {
- this.keyboardOff();
+ //this.keyboardOff();
}
}
else {
@@ -1987,17 +1920,18 @@
}
);
tabIndex = 1000;
+ var grid = this;
$(this).find('.tbody #row_'+skey+' :input').each(
function() {
+ grid.initInput(this,tabIndex++,'edit','rowEdit');
this.setAttribute('xClassRow',0);
- x6inputs.initInput(this,tabIndex++,'edit','rowEdit');
}
);
var string = x6inputs.jqFocusString();
$(this).find('.tbody #row_'+skey).addClass('selected');
$(this).find('.tbody #row_'+skey+' '+string).focus();
x6events.fireEvent('buttonsOn_'+this.zTable);
- this.keyboardOff();
+ //this.keyboardOff();
u.bb.vgfSet('skey_'+this.zTable,skey);
//console.log('uiEditRow Completed, returning true');
//console.groupEnd();
@@ -2061,9 +1995,10 @@
* Undo Row: the table controller has already reset
* any inputs, we will just remove them
*/
- if(uiEditRow=='inline' || uiNewRow=='inline') {
+ if(uiEditRow=='Y' || uiNewRow=='Y') {
x6events.subscribeToEvent('uiUndoRow_'+table,id);
self['receiveEvent_uiUndoRow_'+table] = function(skey) {
+ x6events.fireEvent('buttonsOff_'+this.zTable);
this.removeInputs();
$(this).find("#row_"+skey).mouseover();
u.bb.vgfSet('skey_'+this.zTable,-1);
@@ -2266,7 +2201,7 @@
* If a grid is displaying inputs, it may also have
* to display errors.
*/
- if(uiEditRow=='inline' || uiNewRow=='inline') {
+ if(uiEditRow=='Y' || uiNewRow=='Y') {
x6events.subscribeToEvent('uiShowErrors_'+table,id);
self['receiveEvent_uiShowErrors_'+table] = function(errors) {
//console.group("tabDiv uiShowErrors");
@@ -2290,33 +2225,18 @@
}
/*
- * Keyboard handling. At very
- * least there are always 3 we accept: arrow keys and
- * ENTER key. These are not automatically subscribed,
- * they must be turned on and off according to context.
+ * Keyboard handling: row navigation
*/
- // First keyboard event, keydown
self.receiveEvent_key_UpArrow = function(e) {
//console.group("tabDiv key_UpArrow");
- var jqRows = $(this).find('.hilight').prev();
- if(jqRows.length==0) {
- //console.log("going for first row");
- $(this).find('.tbody div:first').addClass('hilight');
+ var jqCurrent = this.jqCurrentRow();
+ var jqRowPrev = $(jqCurrent).prev();
+ if(jqCurrent.length==0) {
+ this.goRowTop();
}
- else {
- // before doing anything, figure how many rows below
- var rowsBelow = $(this).find('.hilight').nextAll().length;
- var rowsLimit = Number(u.p(this,'xRowsVisible')) / 2;
-
- //console.log("Going for previous row");
- $(this).find('.tbody div.hilight').removeClass('hilight')
- .prev().addClass('hilight');
- if(rowsBelow >= rowsLimit) {
- var tbody = $(this).find('.tbody');
- var shNow = tbody.scrollTop();
- var shNew = Number(u.p(this,'cssLineHeight'));
- tbody.scrollTop(shNow - (shNew-2));
- }
+ else if(jqRowPrev.length!=0) {
+ this.goRowJq(jqRowPrev);
+ this.scrollMove(-1);
}
x6events.retvals['key_UpArrow'] =false;
//console.log("tabDiv key_UpArrow finished");
@@ -2324,48 +2244,170 @@
}
self.receiveEvent_key_DownArrow = function(e) {
//console.group("tabDiv key_DownArrow");
- var jqRowNext = $(this).find('.hilight').next();
- var jqRowPrev = $(this).find('.hilight').prev();
- if(jqRowNext.length==0 && jqRowPrev.length==0) {
- //console.log("going for first row");
- $(this).find('.tbody div:first').addClass('hilight');
+ //console.log(e);
+ var jqCurrent = this.jqCurrentRow();
+ var jqRowNext = $(jqCurrent).next();
+ if(jqCurrent.length==0) {
+ this.goRowTop();
}
else if(jqRowNext.length!=0) {
+ this.goRowJq(jqRowNext);
+ this.scrollMove(1);
+ }
+ x6events.retvals['key_DownArrow'] =false;
+ //console.log("tabDiv key_DownArrow finished");
+ //console.groupEnd();
+ }
+ self.receiveEvent_key_PageUp = function(e) {
+ //console.group("tabDiv key_DownArrow");
+ var jqCurrent = this.jqCurrentRow();
+ var jqRowPrev = $(jqCurrent).prevAll();
+ if(jqCurrent.length==0) {
+ this.goRowTop();
+ }
+ else if(jqRowPrev.length!=0) {
+ var cntAbove = jqRowPrev.length;
+ var cntJump = Number(u.p(this,'xRowsVisible')) - 2;
+
+ // Figure out how far to go up, then figure the row
+ var rowsChange = cntAbove < cntJump ? cntAbove : cntJump;
+ var newRow = jqRowPrev[ rowsChange - 1 ];
+ this.goRowJq($(newRow));
+ this.scrollMove(-rowsChange);
+ }
+ x6events.retvals['key_PageUp'] =false;
+ //console.log("tabDiv key_DownArrow finished");
+ //console.groupEnd();
+ }
+ self.receiveEvent_key_PageDown = function(e) {
+ //console.group("tabDiv key_DownArrow");
+ var jqCurrent = this.jqCurrentRow();
+ var jqRowNext = $(jqCurrent).nextAll();
+ if(jqCurrent.length==0) {
+ this.goRowTop();
+ }
+ else if(jqRowNext.length!=0) {
// before doing anything, figure how many rows above
- var rowsAbove = $(this).find('.hilight').prevAll().length;
- var rowsLimit = Number(u.p(this,'xRowsVisible')) / 2;
+ var cntBelow = jqRowNext.length;
+ var cntJump = Number(u.p(this,'xRowsVisible')) - 2;
- //console.log("going for next row");
- $(this).find('.hilight').removeClass('hilight')
- .next().addClass('hilight');
- if(rowsAbove >= rowsLimit) {
- var tbody = $(this).find('.tbody');
- var shNow = tbody.scrollTop();
- var shNew = Number(u.p(this,'cssLineHeight'));
- tbody.scrollTop(shNow + (shNew -2 ));
- }
+ // Figure out how far to go up, then figure the row
+ var rowsChange = cntBelow < cntJump ? cntBelow : cntJump;
+ var newRow = jqRowNext[ rowsChange - 1 ];
+ this.goRowJq($(newRow));
+ this.scrollMove(rowsChange);
}
- x6events.retvals['key_DownArrow'] =false;
+ x6events.retvals['key_PageDown'] =false;
//console.log("tabDiv key_DownArrow finished");
//console.groupEnd();
}
+ self.receiveEvent_key_CtrlHome = function(e) {
+ this.goRowTop();
+ x6events.retvals['key_CtrlHome'] =false;
+ }
+ self.receiveEvent_key_CtrlEnd = function(e) {
+ this.goRowJq( $(this).find('.tbody > div:last') );
+ var rowHeight = Number(u.p(this,'cssLineHeight'));
+ var rowCount = $(this).find('.tbody > div').length;
+ $(this).find('.tbody').scrollTop(rowHeight * rowCount);
+ }
self.receiveEvent_key_Enter = function(e) {
//console.group("tabDiv key_Enter - clicking hilighted rows");
$(this).find('.tbody div.hilight').click();
//console.groupEnd();
}
+
+ /*
+ * Routines to move pick a row and scroll
+ *
+ */
+ self.jqCurrentRow = function() {
+ var jq = $(this).find('.selected');
+ if(jq.length > 0) return jq;
+ var jq = $(this).find('.hilight');
+ if(jq.length > 0) return jq;
+ return $([]);
+
+ }
+ self.goRowBySkey = function(skey) {
+ //console.log('goRowBySkey ',skey);
+ if( u.p(this,'uiEditRow','')=='Y') {
+ //console.log("We can edit, firing reqEditRow");
+ x6events.fireEvent('reqEditRow_'+this.zTable,skey);
+ }
+ else {
+ //console.log("We do not edit, hilighting");
+ $(this).find('.hilight').removeClass('.hilight');
+ $(this).find('#row_'+skey).addClass('.hilight');
+ }
+ }
+ self.goRow = function(ordinal) {
+ var row = $(this).find('.tbody > div')[ordinal];
+ var skey= row.id.slice(4);
+ //console.log("goRow for ",ordinal,' has picked skey ',skey);
+ this.goRowBySkey(skey);
+ }
+ self.goRowJq = function(jqRow) {
+ var skey = jqRow[0].id.slice(4);
+ //console.log("goRow by jQuery object ");
+ //console.log(jqRow);
+ //console.log(skey);
+ this.goRowBySkey(skey);
+ }
+ self.goRowTop = function() {
+ this.goRow(0);
+ $(this).find('.tbody').scrollTop(0);
+ }
+ self.scrollMove = function(change) {
+ // Get all of the numbers we need
+ var jqRow = this.jqCurrentRow();
+ var cntAbove = $(jqRow).prevAll().length;
+ var cntBelow = $(jqRow).nextAll().length;
+ var cntAll = $(this).find('.tbody > div').length;
+ var cntVisible= Number(u.p(this,'xRowsVisible'));
+ var cssHeight = Number(u.p(this,'cssLineHeight'));
+ //console.log(change,cntAbove,cntBelow,cntAll,cntVisible,cssHeight);
+
+ var stAdjust = 0;
+ if(change > 0) {
+ if(cntAbove > (cntVisible/2)) {
+ var stAdjust = change * (cssHeight-2);
+ }
+ }
+ else {
+ if(cntBelow > (cntVisible/2)) {
+ var stAdjust = change * (cssHeight-2);
+ }
+ }
+ if(stAdjust!=0) {
+ //console.log(stAdjust);
+ var stNow = $(this).find('.tbody').scrollTop();
+ $(this).find('.tbody').scrollTop(stNow + stAdjust);
+ }
+
+ }
+ /*
+ * This is the list of the keys that we wrote handlers
+ * for above. They have to sometimes be turned off
+ * and on
+ */
+ self.keyList = [
+ 'PageUp', 'PageDown', 'CtrlHome', 'CtrlEnd'
+ ,'UpArrow', 'DownArrow', 'Enter'
+ ];
self.keyboardOn = function() {
- //console.log("Turning on keyboard events ",this.id);
- x6events.subscribeToEvent('key_UpArrow',id);
- x6events.subscribeToEvent('key_DownArrow',id);
- x6events.subscribeToEvent('key_Enter',id);
+ for(var key in this.keyList) {
+ var keyLabel = this.keyList[key];
+ x6events.subscribeToEvent('key_'+keyLabel,id);
+ }
$(this).focus();
}
self.keyboardOff = function() {
- x6events.unsubscribeToEvent('key_UpArrow',id);
- x6events.unsubscribeToEvent('key_DownArrow',id);
- x6events.unsubscribeToEvent('key_Enter',id);
+ for(var key in this.keyList) {
+ var keyLabel = this.keyList[key];
+ x6events.unsubscribeToEvent('key_'+keyLabel,id);
+ }
}
if(u.p(self,'xInitKeyboard','N')=='Y') self.keyboardOn();
@@ -2570,13 +2612,14 @@
for(var x = offset; x<(offset+count); x++) {
x6events.subscribeToEvent('key_Ctrl'+x.toString(),self.id);
self['receiveEvent_key_Ctrl'+x.toString()] = function(key) {
- console.time("tabs key");
- console.time("checking for visible");
+ //console.time("tabs key");
+ //console.time("checking for visible");
// Abort if he is not really visible, this is the
// easiest way to do this, and we don't have to
// keep track of whether or not it is visible.
if($(this).find(":reallyvisible").length==0) return;
- console.timeEnd("checking for visible");
+ //if($(this).isVisible().length==0) return;
+ //console.timeEnd("checking for visible");
// get the offset, the keystroke,
// and calculate the index.
@@ -2585,7 +2628,7 @@
var index = (key - offset);
var str = '#'+this.id+' > ul';
$(str).tabs('select',index);
- console.timeEnd("tabs key");
+ //console.timeEnd("tabs key");
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2009-01-23 19:09:20
|
Revision: 1135
http://andro.svn.sourceforge.net/andro/?rev=1135&view=rev
Author: kendowns
Date: 2009-01-23 19:09:10 +0000 (Fri, 23 Jan 2009)
Log Message:
-----------
removed some stray console.log commands, modified tableController.reqEditRow so that it always fires uiEditRow
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2009-01-22 20:13:22 UTC (rev 1134)
+++ trunk/andro/clib/x6.js 2009-01-23 19:09:10 UTC (rev 1135)
@@ -4100,9 +4100,6 @@
}
x6events.subscribeToEvent('buttonsEdit_'+table,id);
self['receiveEvent_buttonsEdit_'+table] = function(turnOn) {
- console.log('buttonsedit ',table);
- console.log(turnOn);
- console.log($(this).prop('permupd','N'));
if(turnOn) {
if($(this).prop('permupd','N')=='Y') {
this.className = 'button';
@@ -4310,17 +4307,22 @@
self['receiveEvent_reqEditRow_'+table] = function(skey) {
x6.console.group("tableController reqEditRow "+this.zTable+", "+skey);
var skeynow = this.zSkey;
- if(skeynow == skey) {
- x6.console.log("Request to edit same row, no action");
- }
- else {
+ // KFD 1/23/09. Big change. Table Controller must not
+ // decide what to do, must let the UI elements
+ // decide, because they may have to change
+ // tabs, set focus, etc.
+ //if(skeynow == skey) {
+ // x6.console.log("Request to edit same row, no action");
+ //}
+ //else {
var result = this.saveOk();
x6bb.fwSet('lastSave_'+this.zTable,result);
if(result!='fail') {
x6events.fireEvent('uiEditRow_'+this.zTable,skey);
this.zSkey = skey;
}
- }
+ //}
+ // KFD 1/23/09 (END)
x6.console.groupEnd();
return true;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2009-01-28 19:39:14
|
Revision: 1167
http://andro.svn.sourceforge.net/andro/?rev=1167&view=rev
Author: kendowns
Date: 2009-01-28 19:39:11 +0000 (Wed, 28 Jan 2009)
Log Message:
-----------
Several Changes:
1) When user hits ESC, if there is a widget id='x6exit' value 'Y', the window will close. This is good for having custom buttons on detail screens that send the user to a custom screen. When they are done they just hit ESC and they pop back to the original.
2) Fixed bug in conventional profile when editing children -- pk values of parents were not getting into the insert commands.
3) Cleaned up some event handling on tabShow to use the 'objectFocus' event.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2009-01-27 21:53:09 UTC (rev 1166)
+++ trunk/andro/clib/x6.js 2009-01-28 19:39:11 UTC (rev 1167)
@@ -722,18 +722,23 @@
var exitApproved = x6bb.fwGet('exitApproved',false);
x6.console.log("Key dispatch, ESC, exitapproved: ",exitApproved);
if(exitApproved) {
- x6.console.log("exit for ESC was approved, going to menu");
- setTimeout(
- function() {
- var x6page_prior=x6.p(x6.byId('x6page'),'value');
- var x6mod_prior =x6.p(x6.byId('x6module'),'value');
- var str = '?x6page=menu'
- +'&x6page_prior='+x6page_prior
- +'&x6mod_prior='+x6mod_prior;
- window.location.replace(str);
- }
- ,10
- );
+ x6.console.log("exit for ESC was approved");
+ if($('#x6exit').val()=='Y') {
+ window.close();
+ }
+ else {
+ setTimeout(
+ function() {
+ var x6page_prior=x6.p(x6.byId('x6page'),'value');
+ var x6mod_prior =x6.p(x6.byId('x6module'),'value');
+ var str = '?x6page=menu'
+ +'&x6page_prior='+x6page_prior
+ +'&x6mod_prior='+x6mod_prior;
+ window.location.replace(str);
+ }
+ ,10
+ );
+ }
}
}
else {
@@ -4317,22 +4322,12 @@
self['receiveEvent_reqEditRow_'+table] = function(skey) {
x6.console.group("tableController reqEditRow "+this.zTable+", "+skey);
var skeynow = this.zSkey;
- // KFD 1/23/09. Big change. Table Controller must not
- // decide what to do, must let the UI elements
- // decide, because they may have to change
- // tabs, set focus, etc.
- //if(skeynow == skey) {
- // x6.console.log("Request to edit same row, no action");
- //}
- //else {
- var result = this.saveOk();
- x6bb.fwSet('lastSave_'+this.zTable,result);
- if(result!='fail') {
- x6events.fireEvent('uiEditRow_'+this.zTable,skey);
- this.zSkey = skey;
- }
- //}
- // KFD 1/23/09 (END)
+ var result = this.saveOk();
+ x6bb.fwSet('lastSave_'+this.zTable,result);
+ if(result!='fail') {
+ x6events.fireEvent('uiEditRow_'+this.zTable,skey);
+ this.zSkey = skey;
+ }
x6.console.groupEnd();
return true;
}
@@ -4432,6 +4427,16 @@
x6.json.addParm('x6action','save');
x6.json.addParm('x6v_skey',this.zSkey);
x6.json.inputs(jq);
+
+ // If we have a parent assigned, add that and the skey
+ var tp = $(this).prop('x6tablepar','');
+ if(tp != '') {
+ var skeypar = x6bb.fwGet('skey_'+tp+'_'+this.zTable);
+ x6.console.log("Setting parent table skey: "+tp+" "+skeypar);
+ x6.json.addParm('tableIdPar',tp);
+ x6.json.addParm('skeyPar',skeypar);
+ }
+
// Look for an "skey after" to send back
var queuepos = x6bb.fwGet('queuepos_'+this.zTable,false);
if(queuepos) {
@@ -4506,6 +4511,7 @@
x6.json.addParm('json',1);
if(x6.json.execute()) {
x6events.fireEvent('uiDelRow_'+table,skey);
+ this.zSkey = -1;
}
}
}
@@ -5060,6 +5066,11 @@
if(id!=this.id) {
this.keyboardOff();
x6inputs.objectFocusBlur(this.id);
+
+ if(this.x6profile=='grid') {
+ x6events.fireEvent('buttonsNew_'+this.zTable,false);
+ x6events.fireEvent('buttonsEdit_'+this.zTable,false);
+ }
}
// If it IS us, turn everything on, and set
// the bulletin board. But if we already have
@@ -5069,10 +5080,12 @@
x6bb.fwSet('objectFocus',id);
this.keyboardOn();
- x6events.fireEvent('buttonsNew_'+this.zTable,true);
if(this.x6profile == 'grid') {
x6events.fireEvent('key_DownArrow','DownArrow');
+ if($(this).prop('uiEditRow','N')=='Y') {
+ x6events.fireEvent('buttonsNew_'+this.zTable,true);
+ }
}
if(this.x6profile == 'conventional') {
x6inputs.objectFocusFocus(this.id,':input[id^=search]');
@@ -5201,7 +5214,7 @@
// Send a message and get lost
this.zSkey = 0;
- x6events.fireEvent('buttonsOnEdit_'+this.zTable);
+ x6events.fireEvent('buttonsEdit_'+this.zTable,true);
x6grid.removeHighlight(this.zTable);
x6.console.log('New row created, ready to edit');
x6.console.groupEnd();
@@ -5774,8 +5787,13 @@
self.goRow = function(ordinal) {
var row = $(this).find('.tbody > div')[ordinal];
var skey= this.skeyForRow(row);
- x6.console.log("goRow for ",ordinal,' has picked skey ',skey);
- this.goRowBySkey(skey);
+ if(skey==undefined || skey=='') {
+ x6.console.log('goRow for '+ordinal+' found no skey, no action');
+ }
+ else {
+ x6.console.log("goRow for ",ordinal,' has picked skey ',skey);
+ this.goRowBySkey(skey);
+ }
}
self.goRowJq = function(jqRow) {
var skey = this.skeyForRow(jqRow[0]);
@@ -5985,65 +6003,51 @@
// IE/Firefox Event handling. This event comes from
// jQuery so we can trust it is ok.
tabsShow: function(tabsUl,event,ui) {
- x6.console.group("x6tabs tabsShow");
+ x6.console.group("x6tabs tabsShow "+tabsUl.id+", "+ui.tab.text);
var tabs = tabsUl;
var profile = x6.p(tabs,'x6profile','');
- // A "kids" profile must do slideup, and get busy turning
- // buttons on and off for other tabs.
+ // A "kids" profile must do slideup, and get
+ // busy setting object focus
if(profile=='kids') {
// disable all other tabs until we are finished, this is
// the easiest way to prevent user from clicking on some
// other tab while processing is going on.
tabs.disableAll([ui.index]);
- // First job for kids is to turn parent stuff on/off
+ // If we set objectfocus to '--null--', we turn off events
+ // for all objects, which is good, user can't go clicking
+ // things during animations. But if they clicked 'hide'
+ // we turn the parent back on.
var tablePar = x6.p(tabs,'x6parentTable');
if(ui.index > 0) {
- x6events.fireEvent('buttonsOff_'+tablePar,true);
+ x6events.fireEvent('objectFocus','--null--');
}
else {
- x6events.fireEvent('buttonsOn_'+tablePar,true);
+ x6events.fireEvent('objectFocus','ddisp_'+tablePar);
}
- // Next job is to turn previous tab's buttons on/off.
- // Find the first item with a tableid property and
- // assume that is the culprit.
- var previousTabId = x6.p(tabs,'zCurrentId','');
- if(previousTabId != '') {
- var jqTable = $('#'+previousTabId+' [xtableid]:first');
- var oldTable = x6.p(jqTable[0],'xTableId','');
- x6events.fireEvent('buttonsOff_'+oldTable,true);
- $('#'+previousTabId+' div[x6plugin=x6grid]').each(
- function() { this.keyboardOff(); }
- );
- }
-
var topPane = x6.p(tabs,'x6slideUp');
var tpi = x6.p(tabs,'x6slideUpInner');
x6tabs.slideUp(tabsUl,event,ui,topPane,tpi);
}
- /*
- * Nice little trick, always set focus to first item
- *
- */
- var id = $(ui.panel).attr('x6ObjectFocusId');
- if( id != '') {
- x6events.fireEvent('objectFocus',id);
- }
else {
- // this is a fallback thing, you should really
- // assign an object in the tab to get focus.
- var str = '#' + ui.panel.id;
- str+=' :input:not([disabled]):first';
- x6.jqSetFocus(str);
+ // Set focus to the first object if it has been named
+ var id = $(ui.panel).attr('x6ObjectFocusId');
+ if( id != '') {
+ x6events.fireEvent('objectFocus',id);
+ }
+ else {
+ // this is a fallback thing, you should really
+ // assign an object in the tab to get focus.
+ var str = '#' + ui.panel.id;
+ str+=' :input:not([disabled]):first';
+ x6.jqSetFocus(str);
+ }
}
- /*
- * Save the id and index of the newly shown tab
- *
- */
+ // Save some state information
tabs.zCurrentId = ui.panel.id;
tabs.zCurrentIndex = ui.index;
x6.console.groupEnd();
@@ -6055,7 +6059,7 @@
var currentChild = obj.currentChild
var newChild = ui.panel.id;
- // if UI.index = 0, they clicked hide. Make the
+ // if UI.index = 0, they clicked hide.
if(ui.index==0) {
if(currentChild!='*') {
var newHeight = $('#'+topPane).height()+350;
@@ -6132,7 +6136,8 @@
var skeyDid = x6bb.fwGet('skey_'+tablePar+'_'+table,0);
if(skeyDid==skeyPar) {
tabsUl.enableAll();
- x6events.fireEvent('buttonsOn_'+table,true);
+ x6events.fireEvent('objectFocus','grid_'+table);
+ //x6events.fireEvent('buttonsOn_'+table,true);
}
else {
var json = new x6JSON( 'x6page' ,table );
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2009-02-20 13:28:31
|
Revision: 1276
http://andro.svn.sourceforge.net/andro/?rev=1276&view=rev
Author: kendowns
Date: 2009-02-20 13:28:30 +0000 (Fri, 20 Feb 2009)
Log Message:
-----------
Sourceforge Bug 2619913
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2009-02-20 13:26:44 UTC (rev 1275)
+++ trunk/andro/clib/x6.js 2009-02-20 13:28:30 UTC (rev 1276)
@@ -4864,12 +4864,16 @@
// Alternate method, find inputs with xdefsrc, which
// tells us where to pull defaults from
+ console.log(row);
$(this).find(':input[xdefsrc]').each(
function() {
var info = $(this).prop('xdefsrc').split('.');
var row = x6bb.fwGet('dbRow_'+info[0]);
- var val = row[info[1]];
- $(this).val(val);
+ if(row) {
+ console.log(row);
+ var val = row[info[1]];
+ $(this).val(val);
+ }
}
);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2009-03-06 15:58:08
|
Revision: 1304
http://andro.svn.sourceforge.net/andro/?rev=1304&view=rev
Author: kendowns
Date: 2009-03-06 15:58:06 +0000 (Fri, 06 Mar 2009)
Log Message:
-----------
Sourceforge 2668591, multiple child detail edits were stepping on each other.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2009-03-06 15:21:53 UTC (rev 1303)
+++ trunk/andro/clib/x6.js 2009-03-06 15:58:06 UTC (rev 1304)
@@ -6656,7 +6656,7 @@
// start by making everybody inside the modal
// invisible, then make the one we are interested
// in visible later on
- $('#x6modal div.x6modal').css('display:none');
+ $('#x6modal > div').css('display','none');
// Turn scrolling off for the body
$('body')
@@ -6678,6 +6678,10 @@
.css('display','block')
.css('width','')
.css('height','')
+
+ // Now make the particular display visible
+ $('#'+id).css('display','');
+
var mh = $('#x6modal').height();
var mw = $('#x6modal').width();
var ww = $(window).width();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2009-03-06 16:58:21
|
Revision: 1305
http://andro.svn.sourceforge.net/andro/?rev=1305&view=rev
Author: kendowns
Date: 2009-03-06 16:58:18 +0000 (Fri, 06 Mar 2009)
Log Message:
-----------
Sourceforge 2668122, auto-hide of children on new parent detail row was a little jumbled.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2009-03-06 15:58:06 UTC (rev 1304)
+++ trunk/andro/clib/x6.js 2009-03-06 16:58:18 UTC (rev 1305)
@@ -4845,13 +4845,11 @@
// Alternate method, find inputs with xdefsrc, which
// tells us where to pull defaults from
- console.log(row);
$(this).find(':input[xdefsrc]').each(
function() {
var info = $(this).prop('xdefsrc').split('.');
var row = x6bb.fwGet('dbRow_'+info[0]);
if(row) {
- console.log(row);
var val = row[info[1]];
$(this).val(val);
}
@@ -6086,48 +6084,50 @@
// Sliding tabs around works much better if we first
// slide up the inner content, then slide everything
// else down.
- var newHeight = $('#'+topPane).height()+350;
- var newHeightI= $('#'+topPaneI).height()+350;
- $('#'+currentChild).slideUp(200
- ,function() {
- // Wait 1/10 of a second and start slidin
- // the top-outer container down
- setTimeout(
- function() {
- $('#'+topPane).animate(
- {height: newHeight}
- ,spd
- );
- }
- ,100
- );
- // Wait another 1/10 of a second and start sliding
- // the top-inner container down. Do all wrap-up
- // when that is finished.
- setTimeout(
- function() {
- var pt
- = 'ddisp_'
- + $(tabsUl).prop('x6parenttable');
- $('#'+topPaneI).animate(
- {height: newHeightI}
- ,spd
- ,null
- ,function() {
- $(this).css('overflow-y','scroll');
- obj.currentChild = '*';
- tabsUl.enableAll();
- x6events.fireEvent(
- 'objectFocus'
- ,pt
- );
- }
- );
- }
- ,200
- );
- }
- );
+ setTimeout(function() {
+ var newHeight = $('#'+topPane).height()+350;
+ var newHeightI= $('#'+topPaneI).height()+350;
+ $('#'+currentChild).slideUp(200
+ ,function() {
+ // Wait 1/10 of a second and start slidin
+ // the top-outer container down
+ setTimeout(
+ function() {
+ $('#'+topPane).animate(
+ {height: newHeight}
+ ,spd
+ );
+ }
+ ,100
+ );
+ // Wait another 1/10 of a second and start sliding
+ // the top-inner container down. Do all wrap-up
+ // when that is finished.
+ setTimeout(
+ function() {
+ var pt
+ = 'ddisp_'
+ + $(tabsUl).prop('x6parenttable');
+ $('#'+topPaneI).animate(
+ {height: newHeightI}
+ ,spd
+ ,null
+ ,function() {
+ $(this).css('overflow-y','scroll');
+ obj.currentChild = '*';
+ tabsUl.enableAll();
+ x6events.fireEvent(
+ 'objectFocus'
+ ,pt
+ );
+ }
+ );
+ }
+ ,200
+ );
+ }
+ );
+ },10);
return true;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2009-04-04 13:11:31
|
Revision: 1333
http://andro.svn.sourceforge.net/andro/?rev=1333&view=rev
Author: kendowns
Date: 2009-04-04 13:11:28 +0000 (Sat, 04 Apr 2009)
Log Message:
-----------
Sourceforge 2706256
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2009-04-04 12:48:56 UTC (rev 1332)
+++ trunk/andro/clib/x6.js 2009-04-04 13:11:28 UTC (rev 1333)
@@ -6762,6 +6762,8 @@
$('#x6modalblock').animate({opacity:0},'fast',null
,function() {
$(this).css('display','none');
+ // KFD 4/4/09 Sourceforge 2706256
+ $('body').css('overflow','auto');
x6events.priorFocus();
}
);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-09 13:44:06
|
Revision: 924
http://andro.svn.sourceforge.net/andro/?rev=924&view=rev
Author: kendowns
Date: 2008-12-09 13:44:04 +0000 (Tue, 09 Dec 2008)
Log Message:
-----------
Daily programming changes
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-09 13:43:10 UTC (rev 923)
+++ trunk/andro/clib/x6.js 2008-12-09 13:44:04 UTC (rev 924)
@@ -649,6 +649,11 @@
return false;
}
if(inp==last && !e.shiftKey) {
+ //if(u.p(inp,'inGrid',false)) {
+ // x6events.fireEvent('key_DownArrow');
+ // return;
+ //}
+
$('[xTabGroup='+tg+']:not([disabled]):first').focus();
//console.log("Last input, no shift, going to first");
//console.groupEnd();
@@ -949,14 +954,12 @@
x6events.fireEvent('reqNewRow_'+this.zTable);
}
},
- /*
- buttonDuplicate: function(self,id,table) {
- x6plugins.buttonStandard(self,'duplicate','CtrlD');
+ buttonInsert: function(self,id,table) {
+ x6plugins.buttonStandard(self,'ins','CtrlI');
self.main = function() {
x6events.fireEvent('reqNewRow_'+this.zTable,true);
}
},
- */
buttonDelete: function(self,id,table) {
x6plugins.buttonStandard(self,'delete','CtrlD');
self.main = function() {
@@ -1179,13 +1182,13 @@
*
*/
x6events.subscribeToEvent('reqNewRow_' +table,id);
- self['receiveEvent_reqNewRow_'+table] = function(dupe) {
+ self['receiveEvent_reqNewRow_'+table] = function(tabDivBefore) {
//console.group("tableController reqNewRow "+this.zTable);
var result = this.saveOk();
u.bb.vgfSet('lastSave_'+this.zTable,result);
if(result!='fail') {
- x6events.fireEvent('uiNewRow_'+table);
+ x6events.fireEvent('uiNewRow_'+table,tabDivBefore);
}
//console.groupEnd();
}
@@ -1261,9 +1264,13 @@
ua.json.addParm('x6v_skey',u.bb.vgfGet('skey_'+this.zTable));
ua.json.inputs(jq);
// Look for an "skey after" to send back
- var skeyAfter = u.bb.vgfGet('skeyAfter_'+this.zTable,-1);
- if(skeyAfter!=-1) {
- ua.json.addParm('skeyAfter',skeyAfter);
+ var queuepos = u.bb.vgfGet('queuepos_'+this.zTable,false);
+ if(queuepos) {
+ var skeyAfter = u.bb.vgfGet('skeyAfter_' +this.zTable,-1);
+ var skeyBefore= u.bb.vgfGet('skeyBefore_'+this.zTable,-1);
+ ua.json.addParm('queuepos' ,queuepos);
+ ua.json.addParm('skeyAfter' ,skeyAfter);
+ ua.json.addParm('skeyBefore',skeyBefore);
}
if(ua.json.execute()) {
var retval = 'success';
@@ -1437,14 +1444,14 @@
x6events.subscribeToEvent('buttonsOn_'+table,id);
self['receiveEvent_buttonsOn_'+table] = function() {
x6events.fireEvent('enable_save_' +this.zTable);
- x6events.fireEvent('enable_abandon_'+this.zTable);
- x6events.fireEvent('enable_remove_' +this.zTable);
+ x6events.fireEvent('enable_cancel_' +this.zTable);
+ x6events.fireEvent('enable_delete_' +this.zTable);
}
x6events.subscribeToEvent('buttonsOff_'+table,id);
self['receiveEvent_buttonsOff_'+table] = function() {
x6events.fireEvent('disable_save_' +this.zTable);
- x6events.fireEvent('disable_abandon_'+this.zTable);
- x6events.fireEvent('disable_remove_' +this.zTable);
+ x6events.fireEvent('disable_cancel_' +this.zTable);
+ x6events.fireEvent('disable_delete_' +this.zTable);
}
}
@@ -1504,9 +1511,10 @@
}
// Detail receives an addRow event and interprets it
- // as a goMode
+ // as a goMode. The parameter is intended only for
+ // grids, a detail display ignores it.
x6events.subscribeToEvent('uiNewRow_'+table,id);
- self['receiveEvent_uiNewRow_'+table] = function(row) {
+ self['receiveEvent_uiNewRow_'+table] = function(tabDivBefore) {
//console.group("detailDisplay uiNewRow");
this.displayRow('new',{});
//console.log("detailDisplay uiNewRow FINISHED");
@@ -1645,6 +1653,25 @@
}
}
+x6tabDiv = {
+ mouseEnabled: true,
+
+ mouseDisable: function() {
+ this.mouseEnabled = false;
+ $('body').css('cursor','url(clib/mouseOff.png), default');
+ $(document).one('mousemove',function() {
+ x6tabDiv.mouseEnabled = true;
+ $('body').css('cursor','');
+ });
+ },
+
+ mouseover: function(rowDiv) {
+ if(!this.mouseEnabled) return false;
+
+ $(rowDiv).siblings('.hilight').removeClass('hilight');
+ $('#'+rowDiv.id+':not(.selected)').addClass('hilight');
+ }
+}
/***im* x6plugins/tabDiv
*
@@ -1711,13 +1738,15 @@
*/
x6events.subscribeToEvent('uiNewRow_'+table,id);
if(uiNewRow!='Y') {
- // If not inline, it always stops responding on a new row
+ // If the grid itself does not display the row, then it
+ // stops responding to keyboard events while somebody
+ // else is displaying the new row.
self['receiveEvent_uiNewRow_'+table] = function() {
this.keyboardOff();
}
}
else {
- self['receiveEvent_uiNewRow_'+table] = function() {
+ self['receiveEvent_uiNewRow_'+table] = function(tabDivBefore) {
//console.group("tabDiv uiNewRow "+this.zTable);
var skey = u.bb.vgfGet('skey_'+this.zTable,-1);
@@ -1767,30 +1796,49 @@
/*
- * Kind of a big deal. If the grid has the
- * flag xInsertAfter set to "Y", we must slip the
- * new row in after the current, and trap the
- * skey value of the current
+ * Now figure out where to put the row. [New] always
+ * goes after current row, and [Insert] passes the
+ * tabDivBefore flag that says go before the current
+ * row. If there is no current row, [Insert] goes at
+ * the top and [New] goes at the bottom.
*/
- var iAfter = false;
- if(u.p(this,'xInsertAfter','N')=='Y') {
- if(skey>0) {
- iAfter = skey;
+ // First work out current row, if there is one
+ var iRelative = false;
+ if(skey!=0) {
+ iRelative = skey;
+ if(tabDivBefore) {
+ u.bb.vgfSet('skeyBefore_'+this.zTable,skey);
+ }
+ else {
u.bb.vgfSet('skeyAfter_'+this.zTable,skey);
}
+ var jqRow = $('#row_'+skey);
+ }
+ else {
+ u.bb.vgfSet('skeyBefore_'+this.zTable,-1);
+ u.bb.vgfSet('skeyAfter_'+this.zTable, -1);
+ var jqRow = this.jqCurrentRow();
+ }
+
+ // Now go either before or after the row we found, or at
+ // top or bottom as the case may be
+ if(jqRow.length==0) {
+ if(tabDivBefore) {
+ $(this).find('.tbody').prepend(newRow);
+ }
else {
- u.bb.vgfSet('skeyAfter_'+this.zTable,0);
+ $(this).find('.tbody').append(newRow);
}
}
- if(iAfter) {
- //$(this).find('#row_'+iAfter).after(newRow.bufferedRender());
- $(this).find('#row_'+iAfter).after(newRow);
- }
else {
- //$(this).find('.tbody').prepend(newRow.bufferedRender());
- $(this).find('.tbody').prepend(newRow);
- u.bb.vgfSet('skeyAfter_'+this.zTable,-1);
+ if(tabDivBefore) {
+ $(jqRow).before(newRow);
+ }
+ else {
+ $(jqRow).after(newRow);
+ }
}
+
/*
* Now do everything required to make the
@@ -1815,6 +1863,8 @@
u.bb.vgfSet('skey_'+this.zTable,0);
x6events.fireEvent('buttonsOn_'+this.zTable);
this.keyboardOff();
+ $(this).find('.tbody > div.hilight').removeClass('hilight');
+ x6tabDiv.mouseDisable();
//console.log('New row created, ready to edit');
//console.groupEnd();
return true;
@@ -1916,7 +1966,10 @@
//console.log(id,curval);
this.innerHTML = u.byId(id).innerHTML;
- $(this).find(":input")[0].value=curval;
+ $(this).find(":input").each(function() {
+ this.value=curval;
+ this.inGrid = true;
+ });
}
);
tabIndex = 1000;
@@ -1930,6 +1983,8 @@
var string = x6inputs.jqFocusString();
$(this).find('.tbody #row_'+skey).addClass('selected');
$(this).find('.tbody #row_'+skey+' '+string).focus();
+ $(this).find('.tbody > div.hilight').removeClass('hilight');
+ x6tabDiv.mouseDisable();
x6events.fireEvent('buttonsOn_'+this.zTable);
//this.keyboardOff();
u.bb.vgfSet('skey_'+this.zTable,skey);
@@ -1961,11 +2016,13 @@
$(this).find("#row_"+skey+" div").each(
function() {
var inp = $(this).find(":input")[0];
- var val = inp.value;
- var col = u.p(inp,'xColumnId');
- var typeid = grid.zColsById[col].type_id;
- //console.log(val);
- this.innerHTML = x6dd.display(typeid,val,' ');
+ if(inp != null) {
+ var val = inp.value;
+ var col = u.p(inp,'xColumnId');
+ var typeid = grid.zColsById[col].type_id;
+ //console.log(val);
+ this.innerHTML = x6dd.display(typeid,val,' ');
+ }
}
);
@@ -2000,7 +2057,19 @@
self['receiveEvent_uiUndoRow_'+table] = function(skey) {
x6events.fireEvent('buttonsOff_'+this.zTable);
this.removeInputs();
- $(this).find("#row_"+skey).mouseover();
+ if(skey==0) {
+ var iBefore = u.bb.vgfGet('skeyBefore_'+this.zTable,-1);
+ var iAfter = u.bb.vgfGet('skeyAfter_' +this.zTable,-1);
+ if(iBefore!=-1) {
+ x6events.fireEvent('reqEditRow_'+this.zTable,iBefore);
+ }
+ else if(iAfter!=-1) {
+ x6events.fireEvent('reqEditRow_'+this.zTable,iAfter);
+ }
+ }
+ else {
+ $(this).find("#row_"+skey).mouseover();
+ }
u.bb.vgfSet('skey_'+this.zTable,-1);
}
}
@@ -2118,12 +2187,7 @@
var table = this.zTable;
$(this).find('#row_'+skey)
.mouseover(
- function() {
- $(this).siblings('.hilight').removeClass('hilight');
- if(!$(this).hasClass('selected')) {
- $(this).addClass('hilight');
- }
- }
+ function() { x6tabDiv.mouseover(this) }
)
.click(
function() {
@@ -2238,6 +2302,12 @@
this.goRowJq(jqRowPrev);
this.scrollMove(-1);
}
+ else {
+ // KFD 12/8/08, if new rows are inline, do it
+ if(u.p(this,'uiNewRow','N')=='Y') {
+ x6events.fireEvent('reqNewRow_'+this.zTable,true);
+ }
+ }
x6events.retvals['key_UpArrow'] =false;
//console.log("tabDiv key_UpArrow finished");
//console.groupEnd();
@@ -2254,6 +2324,12 @@
this.goRowJq(jqRowNext);
this.scrollMove(1);
}
+ else {
+ // KFD 12/8/08, if new rows are inline, do it
+ if(u.p(this,'uiNewRow','N')=='Y') {
+ x6events.fireEvent('reqNewRow_'+this.zTable);
+ }
+ }
x6events.retvals['key_DownArrow'] =false;
//console.log("tabDiv key_DownArrow finished");
//console.groupEnd();
@@ -2309,7 +2385,9 @@
this.goRowJq( $(this).find('.tbody > div:last') );
var rowHeight = Number(u.p(this,'cssLineHeight'));
var rowCount = $(this).find('.tbody > div').length;
- $(this).find('.tbody').scrollTop(rowHeight * rowCount);
+ //$(this).find('.tbody').scrollTop(rowHeight * rowCount);
+ var stNew = rowHeight * rowCount;
+ $(this).find('.tbody').animate({scrollTop:stNew},400);
}
self.receiveEvent_key_Enter = function(e) {
//console.group("tabDiv key_Enter - clicking hilighted rows");
@@ -2356,7 +2434,8 @@
}
self.goRowTop = function() {
this.goRow(0);
- $(this).find('.tbody').scrollTop(0);
+ //$(this).find('.tbody').scrollTop(0);
+ $(this).find('.tbody').animate({scrollTop: 0},400);
}
self.scrollMove = function(change) {
// Get all of the numbers we need
@@ -2382,7 +2461,9 @@
if(stAdjust!=0) {
//console.log(stAdjust);
var stNow = $(this).find('.tbody').scrollTop();
- $(this).find('.tbody').scrollTop(stNow + stAdjust);
+ var stNew = stNow + stAdjust;
+ //$(this).find('.tbody').scrollTop(stNow + stAdjust);
+ $(this).find('.tbody').animate({scrollTop:stNew},100);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-10 03:51:44
|
Revision: 930
http://andro.svn.sourceforge.net/andro/?rev=930&view=rev
Author: kendowns
Date: 2008-12-10 03:51:40 +0000 (Wed, 10 Dec 2008)
Log Message:
-----------
Many changes after hack-a-thon, all on the grid.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-10 02:29:59 UTC (rev 929)
+++ trunk/andro/clib/x6.js 2008-12-10 03:51:40 UTC (rev 930)
@@ -432,22 +432,17 @@
// KFD 11/13/08. Generic display routine
display: function(typeid,value,nullDisplay) {
if(nullDisplay==null) nullDisplay = '';
- //console.log("x6dd.display parms: ",typeid,value,nullDisplay);
if(value==null || value.toString().trim()=='') {
- //console.log("x6dd.display returning empty string: ",nullDisplay);
return nullDisplay;
}
switch(typeid) {
case 'int':
case 'numb':
case 'money':
- //console.log("I've got int, numb, or money", value);
if(value=='null') return '';
- //console.log("x6dd.display returning number");
return Number(value);
break;
default:
- //console.log("x6dd.display parms: ",typeid,value);
return value;
}
}
@@ -813,7 +808,7 @@
if(u.p(inp,'disabled',false)) {
inp.className='';
doRow = u.p(inp,'xClassRow',0);
- if(doRow) {
+ if(doRow!=0) {
inp.parentNode.parentNode.className = '';
}
return;
@@ -1381,11 +1376,11 @@
}
// Flip all icons to both
- $('[xChGroup='+xChGroup+']').html('⇔');
+ //$('[xChGroup='+xChGroup+']').html('⇔');
// Flip just this icon to up or down
var icon = this.zSortAsc ? '⇓' : '⇑';
- $('[xChGroup='+xChGroup+'][xColumn='+xColumn+']').html(icon);
+ //$('[xChGroup='+xChGroup+'][xColumn='+xColumn+']').html(icon);
// Make the request to the server
var args2 = { sortCol: this.zSortCol, sortAsc: this.zSortAsc };
@@ -1665,11 +1660,27 @@
});
},
+ removeHighlight: function(table) {
+ var rowNow = u.bb.vgfGet('highlight_'+table,'');
+ if(rowNow!='') $('#'+rowNow).removeClass('hilight');
+ u.bb.vgfSet('highlight_'+table,'');
+ this.mouseDisable();
+ },
+
mouseover: function(rowDiv) {
if(!this.mouseEnabled) return false;
+ var pieces = rowDiv.id.split('_');
- $(rowDiv).siblings('.hilight').removeClass('hilight');
- $('#'+rowDiv.id+':not(.selected)').addClass('hilight');
+ var rowNow = u.bb.vgfGet('highlight_'+pieces[0],'');
+ if(rowNow!='') u.byId(rowNow).className = '';
+ var row = u.byId(rowDiv.id);
+ if(row.id != 'selected') {
+ u.byId(rowDiv.id).className = 'hilight';
+ u.bb.vgfSet('highlight_'+pieces[0],rowDiv.id);
+ }
+
+ //$(rowDiv).siblings('.hilight').removeClass('hilight');
+ //$('#'+rowDiv.id+':not(.selected)').addClass('hilight');
}
}
@@ -1716,6 +1727,7 @@
* If so, it will replace its own data with the
* data that has been provided.
*/
+ /* SUSPICIOUS, probably do not need this
if(u.p(self,'xCacheRows','')=='Y') {
x6events.subscribeToEvent('cacheRows_'+table,id);
@@ -1728,6 +1740,15 @@
//}
}
}
+ */
+
+ self.rowId = function(skey,noPound) {
+ return (noPound==null ? '#' : '')+this.zTable+'_'+skey;
+ }
+ self.skeyForRow = function(row) {
+ var pieces = row.id.split('_');
+ return pieces[1];
+ }
/*
* The grid is happy to display a new row for
@@ -1748,6 +1769,7 @@
else {
self['receiveEvent_uiNewRow_'+table] = function(tabDivBefore) {
//console.group("tabDiv uiNewRow "+this.zTable);
+ //console.time("tabDiv uiNewRow");
var skey = u.bb.vgfGet('skey_'+this.zTable,-1);
/*
@@ -1755,7 +1777,7 @@
* focus on it.
*/
if(skey==0 && u.bb.vgfGet('lastSave_'+this.zTable)=='noaction') {
- $(this).find("#row_0 :input:first:not([disabled])").focus();
+ $(this.rowId(0)+" :input:first:not([disabled])").focus();
//console.log("On an empty new row, setting focus");
//console.groupEnd();
return;
@@ -1775,7 +1797,10 @@
* inputs that have been provided by the PHP code,
* and get them all initialized and ready to go.
*/
- var newRow = "<div id='row_0' style='display:none'>";
+ var newRow =
+ "<div id='"+this.zTable+"_0' "
+ +" class='selected' "
+ +" style='display:none'>";
var numbers = [ 'int', 'numb', 'money' ];
for (var idx in this.zColsInfo) {
var colInfo = this.zColsInfo[idx];
@@ -1808,11 +1833,14 @@
iRelative = skey;
if(tabDivBefore) {
u.bb.vgfSet('skeyBefore_'+this.zTable,skey);
+ u.bb.vgfSet('skeyAfter_' +this.zTable,-1);
}
else {
- u.bb.vgfSet('skeyAfter_'+this.zTable,skey);
+ u.bb.vgfSet('skeyAfter_' +this.zTable,skey);
+ u.bb.vgfSet('skeyBefore_'+this.zTable,-1);
}
- var jqRow = $('#row_'+skey);
+ //var jqRow = $('#row_'+skey);
+ var jqRow = $(this.rowId(skey));
}
else {
u.bb.vgfSet('skeyBefore_'+this.zTable,-1);
@@ -1824,17 +1852,21 @@
// top or bottom as the case may be
if(jqRow.length==0) {
if(tabDivBefore) {
+ //console.log("body prepend");
$(this).find('.tbody').prepend(newRow);
}
else {
+ //console.log("body append");
$(this).find('.tbody').append(newRow);
}
}
else {
if(tabDivBefore) {
+ //console.log("before this row: ",jqRow);
$(jqRow).before(newRow);
}
else {
+ //console.log("after this row: ",jqRow);
$(jqRow).after(newRow);
}
}
@@ -1846,14 +1878,15 @@
*/
tabIndex = 1000;
var grid = this;
- $(this).find(':input').each(
+ //$(this).find('#row_0 :input').each(
+ $(this.rowId(0)+' :input').each(
function() {
+ this.setAttribute('xClassRow','0');
grid.initInput(this,tabIndex++,'new','rowNew');
- this.setAttribute('xClassRow','0');
}
);
- var grid = this;
- $(this).find('#row_0').fadeIn('fast'
+ //$(this).find('#row_0').fadeIn('fast'
+ $(this.rowId(0)).fadeIn('fast'
,function() {
x6inputs.findFocus( this );
}
@@ -1862,10 +1895,12 @@
// Send a message and get lost
u.bb.vgfSet('skey_'+this.zTable,0);
x6events.fireEvent('buttonsOn_'+this.zTable);
- this.keyboardOff();
- $(this).find('.tbody > div.hilight').removeClass('hilight');
- x6tabDiv.mouseDisable();
+ //console.time("remove highlight");
+ //$(this).find('.tbody > div.hilight').removeClass('hilight');
+ x6tabDiv.removeHighlight(this.zTable);
+ //console.timeEnd('remove highlight');
//console.log('New row created, ready to edit');
+ //console.timeEnd("tabDiv uiNewRow");
//console.groupEnd();
return true;
}
@@ -1899,7 +1934,7 @@
// This is important, it says that this is an
// active input. This distinguishes it from possible
// hidden inputs that were used as a clone source
- // that have many of the same properties.
+ // that have many or all of the same properties.
input.zActive = 1;
//console.groupEnd();
}
@@ -1913,14 +1948,15 @@
x6events.subscribeToEvent('uiEditRow_'+table,id);
if(uiEditRow!='Y') {
self['receiveEvent_uiEditRow_'+table] = function(skey) {
- //this.keyboardOff();
+ this.keyboardOff();
}
}
else {
self['receiveEvent_uiEditRow_'+table] = function(skey) {
//console.group("tabDiv uiEditRow "+this.zTable);
- if( $(this).find('#row_'+skey).length == 0) {
+ if(u.byId(this.rowId(skey,false))==null) {
+ //if( $(this).find('#row_'+skey).length == 0) {
//console.log("We don't have that row, cannot edit");
//console.groupEnd();
return;
@@ -1940,51 +1976,50 @@
if(u.bb.vgfGet('skey_'+this.zTable)>=0) {
this.removeInputs();
}
-
+
+ // Set this before adding inputs. If you
+ // do it afterward we get "jumpies" as the
+ // border/padding/margin adjusts.
+ //$(this).find('.tbody #row_'+skey)[0].className='selected';
+ //console.log(this.rowId(skey));
+ var rowId = this.rowId(skey,true);
+ u.byId(rowId).className='selected';
+
//console.log("Putting inputs into div cells");
- grid = this;
- $(this).find('.tbody #row_'+skey+' div').each(
+ var grid = this;
+ var tabIndex = 1000;
+ var focus=false;
+ //$(this).find('#row_'+skey+' div').each(
+ //console.log(this.rowId(skey)+' div');
+ $(this.rowId(skey)+' div').each(
function() {
+ var div = this;
// Work up to figuring out the name of the
// id that holds the hidden input, then
// grab the input and put it in.
- var colnum = u.p(this,'gColumn');
+ var colnum = u.p(div,'gColumn');
var colid = grid.zColsInfo[colnum].column_id;
var id = 'wrapper_'+grid.zTable+'_'+colid;
//console.log(id);
// Current Value
- // KFD 11/13/08, special exception for
// KFD 11/29/08, use special html conversion
- var curval = this.innerHTML.htmlEdit();
- //if(this.innerHTML.trim()==' ') {
- // var curval = '';
- //}
- //else {
- // var curval = this.innerHTML;
- //}
- //console.log(id,curval);
+ var curval = div.innerHTML.htmlEdit();
- this.innerHTML = u.byId(id).innerHTML;
- $(this).find(":input").each(function() {
- this.value=curval;
- this.inGrid = true;
- });
+ div.innerHTML = u.byId(id).innerHTML;
+ var inp = div.lastChild;
+ inp.value = curval;
+ inp.inGrid = true;
+ inp.setAttribute('xClassRow',0);
+ grid.initInput(inp,tabIndex++,'edit','rowEdit');
+ if(!inp.disabled && !focus) {
+ inp.focus();
+ focus=true;
+ }
}
);
- tabIndex = 1000;
- var grid = this;
- $(this).find('.tbody #row_'+skey+' :input').each(
- function() {
- grid.initInput(this,tabIndex++,'edit','rowEdit');
- this.setAttribute('xClassRow',0);
- }
- );
- var string = x6inputs.jqFocusString();
- $(this).find('.tbody #row_'+skey).addClass('selected');
- $(this).find('.tbody #row_'+skey+' '+string).focus();
- $(this).find('.tbody > div.hilight').removeClass('hilight');
- x6tabDiv.mouseDisable();
+
+ x6tabDiv.removeHighlight(this.zTable);
x6events.fireEvent('buttonsOn_'+this.zTable);
//this.keyboardOff();
u.bb.vgfSet('skey_'+this.zTable,skey);
@@ -1994,7 +2029,6 @@
}
}
-
/*
* A grid may need to convert inputs back into display
* elements. This routine is unconditionally created
@@ -2003,19 +2037,28 @@
*/
self.removeInputs = function() {
//console.group("tabDiv removeInputs");
- if( $(this).find(':input').length==0 ) {
+ var skey = u.bb.vgfGet('skey_'+this.zTable);
+
+ //if( $(this).find('#row_'+skey+' :input').length==0 ) {
+ if( $(this.rowId(skey)+' :input').length==0 ) {
//console.log("no inputs, doing nothing");
//console.groupEnd();
return;
}
+
+ // Remove the "selected" class from the inputs row,
+ // it does not belong there anymore.
+ u.byId(this.rowId(skey,true)).className = '';
- var skey = u.bb.vgfGet('skey_'+this.zTable);
//console.log("skey is ",skey);
var grid = this;
- $(this).find("#row_"+skey).removeClass('selected');
- $(this).find("#row_"+skey+" div").each(
+ //$(this).find("#row_"+skey).removeClass('selected').find("div").each(
+ //if( $(this.rowId(skey)+' :input').length==0 ) {
+ //$(this).find("#row_"+skey+" div").each(
+ $(this.rowId(skey)+' div').each(
function() {
- var inp = $(this).find(":input")[0];
+ var inp = this.firstChild;
+ //var inp = $(this).find(":input")[0];
if(inp != null) {
var val = inp.value;
var col = u.p(inp,'xColumnId');
@@ -2031,7 +2074,7 @@
if(skey==0) {
if(u.bb.vgfGet('lastSave_'+this.zTable)=='noaction') {
//console.log("No action on last save, removing row ",skey);
- $(this).find("#row_0").fadeOut(
+ $(this.rowId(0)).fadeOut(
function() { $(this).remove() }
);
}
@@ -2046,8 +2089,6 @@
return true;
}
-
-
/*
* Undo Row: the table controller has already reset
* any inputs, we will just remove them
@@ -2055,22 +2096,33 @@
if(uiEditRow=='Y' || uiNewRow=='Y') {
x6events.subscribeToEvent('uiUndoRow_'+table,id);
self['receiveEvent_uiUndoRow_'+table] = function(skey) {
- x6events.fireEvent('buttonsOff_'+this.zTable);
- this.removeInputs();
- if(skey==0) {
+ //console.group('tabDiv uiUndoRow ',skey);
+ if(skey!=0) {
+ //console.log("Skey is not zero, resetting values");
+ //$(this).find('#row_'+skey+' :input').each(
+ $(this.rowId(skey)+' :input').each(
+ function() {
+ this.value = this.zOriginalValue;
+ x6inputs.setClass(this);
+ }
+ );
+ }
+ else {
+ //console.log("Skey is zero, removing row");
+ this.removeInputs();
var iBefore = u.bb.vgfGet('skeyBefore_'+this.zTable,-1);
var iAfter = u.bb.vgfGet('skeyAfter_' +this.zTable,-1);
- if(iBefore!=-1) {
- x6events.fireEvent('reqEditRow_'+this.zTable,iBefore);
+ ////console.log(iBefore,iAfter);
+ if (iBefore!=-1) skeyNew = iBefore;
+ else if(iAfter !=-1) skeyNew = iAfter;
+ else skeyNew = -1;
+ if(skeyNew!=-1){
+ //console.log("Picked this row to edit: ",skeyNew);
+ x6events.fireEvent('reqEditRow_'+this.zTable,skeyNew);
+ //$(this).find('#row_'+skeyNew).mouseover();
}
- else if(iAfter!=-1) {
- x6events.fireEvent('reqEditRow_'+this.zTable,iAfter);
- }
}
- else {
- $(this).find("#row_"+skey).mouseover();
- }
- u.bb.vgfSet('skey_'+this.zTable,-1);
+ //console.groupEnd();
}
}
else if(self.kbOnEdit) {
@@ -2080,8 +2132,6 @@
}
}
-
-
/*
* A grid must always have a facility to receive
* new values from any source. The code is smart
@@ -2094,10 +2144,13 @@
//console.group("tabDiv uiRowSaved: "+this.zTable);
// Replace the input values with server returned values
skey = u.bb.vgfGet('skey_'+this.zTable);
- if( $(this).find("#row_"+skey+" :input").length > 0) {
+ //if( $(this).find("#row_"+skey+" :input").length > 0) {
+ if( $(this.rowId(skey)+' :input').length > 0) {
//console.log($(this).find("#row_"+skey+" :input"));
//console.log("found inputs, going rowSavedEdit");
this.uiRowSavedEdit(row);
+ var skeyNew = skey==0 ? row.skey : skey;
+ x6events.fireEvent('reqEditRow_'+this.zTable,skeyNew);
}
else {
//console.log("no inputs, going rowSavedNoEdit");
@@ -2113,7 +2166,8 @@
self.uiRowSavedEdit = function(row) {
var skey = u.bb.vgfGet('skey_'+this.zTable);
var grid = this;
- $(this).find("#row_"+skey+" :input").each(
+ //$(this).find("#row_"+skey+" :input").each(
+ $(this.rowId(skey)+" :input").each(
function() {
var col = u.p(this,'xColumnId');
var typeid = grid.zColsById[col].type_id;
@@ -2123,22 +2177,24 @@
}
);
this.removeInputs();
- x6events.fireEvent('buttonsOff_'+this.zTable);
+ //x6events.fireEvent('buttonsOff_'+this.zTable);
u.bb.vgfSet('skey_'+this.zTable,-1);
// If this was a new row, set it up
if(skey==0) {
//console.log("Was new row, setting up the row for editing");
table = this.zTable;
+ /*
$(this).find("#row_0").each(
function() {
this.id = 'row_'+row.skey;
}
);
+ */
+ u.byId(this.zTable+'_0').id = this.zTable+'_'+row.skey;
this.initRow(row.skey);
+
}
- $(this).find('#row_'+row.skey).mouseover();
-
}
self.uiRowSavedNoEdit = function(row) {
@@ -2146,7 +2202,8 @@
// If a new row has been saved and we don't
// have it, create it now
- if($(this).find('.tbody #row_'+skey).length==0) {
+ //if($(this).find('.tbody #row_'+skey).length==0) {
+ if($(this.rowId(skey)).length==0) {
var newRow = new jsHtml('div');
newRow.hp.id = 'row_'+skey;
newRow.hp.style = 'display: none;';
@@ -2167,14 +2224,16 @@
}
$(this).find('.tbody').prepend(newRow.bufferedRender());
this.initRow(skey);
- $(this).find("#row_"+skey).fadeIn();
+ $(this.rowId(skey)).fadeIn();
}
else {
for(var idx in this.zColsInfo) {
var col = this.zColsInfo[idx].column_id;
if(col!='') {
- var str="#row_"+skey+" div[gColumn="+idx+"]";
- $(this).find(str).html(row[col]);
+ //var str="#row_"+skey+" div[gColumn="+idx+"]";
+ var str=this.rowId(skey)+" div[gColumn="+idx+"]";
+ //$(this).find(str).html(row[col]);
+ $(str).html(row[col]);
}
}
}
@@ -2185,7 +2244,8 @@
// This code also exists in androLib.php
// addRow method of the tabDiv class
var table = this.zTable;
- $(this).find('#row_'+skey)
+ //$(this).find('#row_'+skey)
+ $(this.rowId(skey))
.mouseover(
function() { x6tabDiv.mouseover(this) }
)
@@ -2208,6 +2268,7 @@
self['receiveEvent_uiDelRow_'+table] = function() {
//console.group("tabDiv uiDelRow "+this.zTable);
skey = u.bb.vgfGet('skey_'+this.zTable);
+ //console.log("current skey ",skey);
if(this.kbOnEdit) {
this.keyboardOn();
@@ -2221,12 +2282,12 @@
if(skey!=-1) {
var hilightRow = false;
//console.log("Determining row to highlight afer removing");
- var jqCandidate = $(this).find('#row_'+skey).next();
+ var jqCandidate = $(this.rowId(skey)).next();
if(jqCandidate.length>0) {
var hilightRow = jqCandidate;
}
else {
- var jqCandidate = $(this).find('#row_'+skey).prev();
+ var jqCandidate = $(this.rowId(skey)).prev();
if(jqCandidate.length>0) {
var hilightRow = jqCandidate;
}
@@ -2237,12 +2298,12 @@
//console.log("No row, ignoring");
return;
}
- else if(this.zSkey==0) {
+ else if(skey==0) {
//console.log("on a new row, firing cancelEdit command");
x6events.fireEvent('cancelEdit_'+this.zTable);
}
else {
- $(this).find("#row_"+skey).fadeOut(
+ $(this.rowId(skey)).fadeOut(
function() {
$(this).remove();
}
@@ -2255,7 +2316,8 @@
}
else {
//console.log("Will hilight this row: ",hilightRow);
- $(hilightRow).mouseover();
+ var skey = this.skeyForRow(hilightRow[0]);
+ x6events.fireEvent('reqEditRow_'+this.zTable,skey);
}
//console.log("uiDelRow finished");
//console.groupEnd();
@@ -2296,15 +2358,18 @@
var jqCurrent = this.jqCurrentRow();
var jqRowPrev = $(jqCurrent).prev();
if(jqCurrent.length==0) {
+ //console.log("current is zero, going to top");
this.goRowTop();
}
else if(jqRowPrev.length!=0) {
+ //console.log("there is a previous, going to that");
this.goRowJq(jqRowPrev);
this.scrollMove(-1);
}
else {
// KFD 12/8/08, if new rows are inline, do it
if(u.p(this,'uiNewRow','N')=='Y') {
+ //console.log("requesting new row, forcing insert before");
x6events.fireEvent('reqNewRow_'+this.zTable,true);
}
}
@@ -2385,13 +2450,15 @@
this.goRowJq( $(this).find('.tbody > div:last') );
var rowHeight = Number(u.p(this,'cssLineHeight'));
var rowCount = $(this).find('.tbody > div').length;
- //$(this).find('.tbody').scrollTop(rowHeight * rowCount);
var stNew = rowHeight * rowCount;
$(this).find('.tbody').animate({scrollTop:stNew},400);
}
self.receiveEvent_key_Enter = function(e) {
//console.group("tabDiv key_Enter - clicking hilighted rows");
$(this).find('.tbody div.hilight').click();
+ //var jqRow = $(this).find('div.hilight')[0];
+ //var skey = this.skeyForRow(jqRow);
+ //x6events.fireEvent('reqEditRow_'+this.zTable,skey);
//console.groupEnd();
}
@@ -2400,12 +2467,7 @@
*
*/
self.jqCurrentRow = function() {
- var jq = $(this).find('.selected');
- if(jq.length > 0) return jq;
- var jq = $(this).find('.hilight');
- if(jq.length > 0) return jq;
- return $([]);
-
+ return $(this).find('.selected');
}
self.goRowBySkey = function(skey) {
//console.log('goRowBySkey ',skey);
@@ -2421,12 +2483,12 @@
}
self.goRow = function(ordinal) {
var row = $(this).find('.tbody > div')[ordinal];
- var skey= row.id.slice(4);
+ var skey= this.skeyForRow(row);
//console.log("goRow for ",ordinal,' has picked skey ',skey);
this.goRowBySkey(skey);
}
self.goRowJq = function(jqRow) {
- var skey = jqRow[0].id.slice(4);
+ var skey = this.skeyForRow(jqRow[0]);
//console.log("goRow by jQuery object ");
//console.log(jqRow);
//console.log(skey);
@@ -2442,30 +2504,40 @@
var jqRow = this.jqCurrentRow();
var cntAbove = $(jqRow).prevAll().length;
var cntBelow = $(jqRow).nextAll().length;
- var cntAll = $(this).find('.tbody > div').length;
+ var cntAll = cntAbove + cntBelow + 1;
var cntVisible= Number(u.p(this,'xRowsVisible'));
- var cssHeight = Number(u.p(this,'cssLineHeight'));
- //console.log(change,cntAbove,cntBelow,cntAll,cntVisible,cssHeight);
+ var cssHeight = Number(u.p(this,'cssLineHeight')) - 2;
+ var scrollNow = $(this).find('.tbody').scrollTop();
+ var limitBot = cntVisible - 2;
+ var limitTop = 3;
- var stAdjust = 0;
+ // Work out where the last row was, by first working out
+ // where the current row is and then going backward.
+ var rowRaw = (cntAbove + 1);
+ var rowReal= rowRaw - (scrollNow / cssHeight);
+
+ // Work out what we should adjust.
+ var stAdjust = false;
if(change > 0) {
- if(cntAbove > (cntVisible/2)) {
- var stAdjust = change * (cssHeight-2);
+ // We are going down. If the new position would be
+ // beyond
+ if(rowReal > limitBot) {
+ var rowsAdjust = rowReal - limitBot;
+ stAdjust = rowsAdjust * cssHeight;
}
}
else {
- if(cntBelow > (cntVisible/2)) {
- var stAdjust = change * (cssHeight-2);
+ if(rowReal < limitTop) {
+ var rowsAdjust = rowReal - limitTop;
+ stAdjust = rowsAdjust * cssHeight;
}
}
if(stAdjust!=0) {
//console.log(stAdjust);
- var stNow = $(this).find('.tbody').scrollTop();
- var stNew = stNow + stAdjust;
+ var stNew = scrollNow + stAdjust;
//$(this).find('.tbody').scrollTop(stNow + stAdjust);
- $(this).find('.tbody').animate({scrollTop:stNew},100);
+ $(this).find('.tbody').animate({scrollTop:stNew},200);
}
-
}
/*
@@ -2478,19 +2550,29 @@
,'UpArrow', 'DownArrow', 'Enter'
];
self.keyboardOn = function() {
+ if(this.keyboardStatus=='On') return;
for(var key in this.keyList) {
var keyLabel = this.keyList[key];
x6events.subscribeToEvent('key_'+keyLabel,id);
}
+ this.keyboardStatus = 'On';
$(this).focus();
}
self.keyboardOff = function() {
+ if(this.keyboardStatus=='Off') return;
for(var key in this.keyList) {
var keyLabel = this.keyList[key];
x6events.unsubscribeToEvent('key_'+keyLabel,id);
}
+ this.keyboardStatus = 'Off';
}
- if(u.p(self,'xInitKeyboard','N')=='Y') self.keyboardOn();
+ this.keyboardStatus = 'Off'
+ if(u.p(self,'xInitKeyboard','N')=='Y') {
+ self.keyboardOn();
+ if(uiEditRow=='Y') {
+ x6events.fireEvent('key_DownArrow');
+ }
+ }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-11 21:26:15
|
Revision: 944
http://andro.svn.sourceforge.net/andro/?rev=944&view=rev
Author: kendowns
Date: 2008-12-11 21:26:05 +0000 (Thu, 11 Dec 2008)
Log Message:
-----------
Created drop-down system.
1) CBOOL and GENDER columns use the new drop-down w/fixed values
2) Put x6all="Y" onto a table. Fk's to that table now display all rows w/o fetching from server.
3) Original x2/x4 "androSelect" now implemented to dynamically fetch rows as user types in values.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-11 21:23:55 UTC (rev 943)
+++ trunk/andro/clib/x6.js 2008-12-11 21:26:05 UTC (rev 944)
@@ -567,6 +567,16 @@
else if(keyLabel=='CtrlRightArrow') {
this.lastInput(inp);
}
+ else if(keyLabel=='ShiftDownArrow') {
+ if(u.p(inp,'x6select','N')=='Y') {
+ x6inputs.x6select.display(inp,'Down');
+ }
+ }
+ else if(keyLabel=='ShiftUpArrow') {
+ if(u.p(inp,'x6select','N')=='Y') {
+ x6inputs.x6select.display(inp,'Up');
+ }
+ }
else if(keyLabel=='Home') {
if(inp.selectionStart == 0 && inp.selectionEnd==0)
this.firstInput(inp);
@@ -588,7 +598,7 @@
// Type validation for some types, only if not TAB or ENTER
if(!isNav) {
- //console.log("Not nav key, doing type validation");
+ console.log("Not nav key, doing type validation");
type = u.p(inp,'xtypeid');
switch(type) {
case 'int':
@@ -605,26 +615,68 @@
if(!u.keyIsNumeric(e)) {
if(keyLabel!='-' && keyLabel!='/') return false;
}
+ break;
+ case 'gender':
+ if(['M','F','U','H'].indexOf(keyLabel.toUpperCase())==-1) {
+ return false;
+ }
+ break;
+ case 'cbool':
+ if(['Y','N'].indexOf(keyLabel.toUpperCase())==-1) {
+ return false;
+ }
+ break;
}
+
+ // Next possibility is a lookup that requires a
+ // fetch from the server.
+ if(u.p(inp,'x6select','N')=='Y' && u.p(inp,'xValues',null)==null) {
+ // Generate the value to send back
+ var val = inp.value;
+ var val = val.slice(0,inp.selectionStart)
+ +keyLabel
+ +val.slice(inp.selectionEnd);
+ //console.log("current value: ",inp.value)
+ //console.log("sel start: ",inp.selectionStart)
+ //console.log("sel end: ",inp.selectionEnd)
+ //console.log("computed value:",val);
+ json = new androJSON('x6page',u.p(inp,'x6seltab'));
+ json.addParm('x6select','Y');
+ json.addParm('gpletters',val);
+ json.execute(true);
+ x6inputs.x6select.display(inp);
+ x6inputs.x6select.displayDynamic(inp,ua.data.x6select);
+ }
+
//console.log("Type validation complete, returning true");
//console.groupEnd();
return true;
}
+ // If this input has an open x6select (SELECT replacement)
+ // then ask it for the value.
+ //
+ // Do this *before* the afterBlurner command below, so that
+ // the value is set when afterBlurner fires.
+ if(u.p(inp,'x6select','N')=='Y') {
+ x6inputs.x6select.assignToMe(inp);
+ }
// This took a lot of experimentation to get right.
// Normally a BLUR would occur when an object loses focus
- // -> except if the user hits ENTER, we must force validation
- // -> except if validation enables new controls
+ // -> except if the user hits ENTER, we must force processing
+ // -> except if processing enables new inputs
//
// So we unconditionally fire the afterblurner to hit
- // anything the control's special validation code might
+ // anything the control's special processing code might
// do. Then we proceed normally.
//
// Also: returning false does NOT prevent losing focus,
- // that's we don't check the return value.
+ // that's we don't check the return value. We are not
+ // *validating*, we are *processing*.
x6inputs.afterBlurner(inp);
+
// Get the first and last controls for easier
// logic immediately below
var tg = u.p(inp,'xTabGroup','tgdefault');
@@ -733,6 +785,7 @@
inp.zSelected = 0;
x6inputs.setClass(inp);
x6inputs.afterBlurner(inp);
+ x6inputs.x6select.hide();
//console.log("Input Blur DONE");
//console.groupEnd();
return true;
@@ -919,6 +972,232 @@
else {
return false;
}
+ },
+
+ ddClick: function(button) {
+ var id = u.p(button,'xInputId');
+ var inp = $('[zActive]#'+id)[0];
+ this.x6select.display(inp);
+ },
+
+ x6select: {
+ dynRowCount: 15,
+ div: false,
+
+ hide: function() {
+ $(".x6select").remove();
+ this.tbody=false;
+ this.div = false;
+ },
+
+ assignToMe: function(inp) {
+ if(this.div) {
+ var row = $('.x6select tr.hilight');
+ if(row.length > 0) {
+ inp.value = row[0].firstChild.innerHTML;
+ }
+ }
+ },
+
+ display: function(input,fromKeyboard) {
+ if(fromKeyboard!=null) {
+ if(this.div && this.div.style.display=='block') {
+ return this.moveUpOrDown(fromKeyboard);
+ }
+ }
+
+ if(!this.div) {
+ this.div = document.createElement('DIV');
+ this.div.style.display = 'none';
+ this.div.style.position = 'absolute';
+ this.div.style.backgroundColor = 'white';
+ this.div.style.overflow = 'hidden';
+ this.div.style.border ="1px solid black";
+ var lineHeight = $(input).height();
+ this.lineHeight = lineHeight;
+ this.div.style.lineHeight = lineHeight+"px";
+ this.div.style.cursor = 'pointer';
+ this.div.style.zIndex = 1000;
+ this.div.className = 'x6select';
+
+ // Work out minimum width as the input plus the button
+ var jqButton = $('[xInputId='+input.id+']');
+ if(jqButton.length==0) {
+ var minwidth = 10;
+ }
+ else {
+ var minwidth
+ = ($(jqButton).offset().left - $(input).offset().left)
+ + $(jqButton).width();
+ }
+ this.div.style.minWidth = minwidth + "px";
+
+ // Put in the titles. This is also where we
+ // work out the height of the drop-down
+ this.div.innerHTML = this.displayTitles(input);
+
+ // Put in the div, and do the mouse events
+ document.body.appendChild(this.div);
+
+ // This is for optimization, allows us to avoid
+ // repeatedly making jquery calls for this object
+ this.tbody = $('.x6select tbody')[0];
+
+ // special routine to populate with fixed
+ // values on a pre-populated attribute. If none
+ // are there it does nothing.
+ this.displayFixed(input);
+
+ }
+ // If it is invisible, position it and then make it visible
+ if(this.div.style.display=='none') {
+ var position = $(input).offset();
+ var postop = position.top -1;
+ var poslft = position.left;
+ this.div.style.top = (postop + input.offsetHeight +1) + "px";
+ this.div.style.left = poslft + "px";
+ this.div.style.display = 'block';
+ this.mouseEvents(input);
+ }
+
+ if(fromKeyboard != null) {
+ this.moveUpOrDown(fromKeyboard);
+ }
+ },
+
+ displayTitles: function(input) {
+ // If still here, we have values and descriptions
+ var retval = '<table><thead><tr>';
+ var descs = u.p(input,'xTitles').split('|');
+ for(var idx in descs) {
+ retval+='<th>'+descs[idx]+'</th>';
+ }
+ retval+='<th> ';
+
+ // Now work out the height. If static, go by
+ // the number of rows, otherwise set it to 16, which
+ // is 15 for data and one for titles.
+ if(u.p(input,'x6rowCount',null)!=null) {
+ var rowCount = Number(u.p(input,'x6rowCount'));
+ }
+ else {
+ var rowCount = this.dynRowCount;
+ }
+ this.div.style.height = ((this.lineHeight+3)*(rowCount+1))+"px";
+ // ...and the height of the body
+ var h = (this.lineHeight + 3)*rowCount;
+
+ // Now put out an empty body
+ retval+='</thead>'
+ +'<tbody style="height: '+h+'px; max-height: '+h+'px; '
+ +' overflow-y:scroll">'
+ +'</tbody></table>';
+ return retval;
+ },
+
+ displayFixed: function(input) {
+ var svals = u.p(input,'xValues','');
+ if(svals.trim()=='') return;
+
+ console.log(svals);
+ retval = '';
+ var rows = svals.split('||');
+ for(var idx in rows) {
+ retval += '<tr>';
+ var values = rows[idx].split('|');
+ for(var idx2 in values) {
+ retval+= '<td>'+values[idx2];
+ }
+ }
+ console.log(retval);
+ this.tbody.innerHTML = retval;
+ },
+
+ displayDynamic: function(input,rows) {
+ retval = ''
+ if(rows.length==0) {
+ this.tbody.innerHTML = '';
+ return;
+ }
+ for(var idx in rows) {
+ retval += '<tr>';
+ var values = rows[idx];
+ for(var idx2 in values) {
+ retval+= '<td>'+values[idx2];
+ }
+ }
+ var lh = this.lineHeight + 3;
+ if(rows.length < this.dynRowCount) {
+ this.div.style.height = lh*(rows.length+1) + "px";
+ this.tbody.style.height = lh*rows.length + "px";
+ }
+ else {
+ this.div.style.height = lh*(this.dynRowCount+1) + "px";
+ this.tbody.style.height = lh*this.dynRowCount + "px";
+ }
+ this.tbody.innerHTML = retval;
+ this.mouseEvents(input);
+ },
+
+ mouseEvents: function(input) {
+ $('.x6select td')
+ .each(
+ function() {
+ this.input = input;
+ }
+ )
+ .mouseover(
+ function() {
+ var rowNow = $('.x6select tr.hilight');
+ if(rowNow.length > 0) {
+ if(rowNow[0] == this.parentNode) return;
+ }
+ $('.x6select tr.hilight').removeClass('hilight');
+ $(this.parentNode).addClass('hilight');
+ }
+ )
+ .mousedown(
+ function(e) {
+ this.input.value = this.parentNode.firstChild.innerHTML;
+ x6inputs.x6select.hide();
+ setTimeout(function() {$(this.input).focus();},100);
+ e.stopPropagation();
+ return false;
+ }
+ );
+ },
+
+ moveUpOrDown: function(direction) {
+ // get current row
+ var rowNow = $('.x6select tr.hilight:visible');
+ var jqBody = $('.x6select tbody');
+ if(rowNow.length==0) {
+ $(jqBody[0].firstChild).addClass('hilight');
+ }
+ else {
+ if(direction == 'Up') {
+ var candidate = $(rowNow).prev();
+ console.log("Up candidate ",candidate);
+ var rowsBelow = $(rowNow).nextAll().length;
+ if(rowsBelow > 5) {
+ var stNow = $('.x6select tbody').scrollTop();
+ $(jqBody).scrollTop(stNow - ( this.lineHeight + 3));
+ }
+ }
+ else {
+ var candidate = $(rowNow).next();
+ console.log("Down candidate ",candidate);
+ var rowsAbove = $(rowNow).prevAll().length;
+ if(rowsAbove > 5) {
+ var stNow = $('.x6select tbody').scrollTop();
+ $(jqBody).scrollTop(stNow + this.lineHeight + 3);
+ }
+ }
+ console.log("row now ",rowNow);
+ console.log(direction);
+ if (candidate.length > 0) $(candidate[0].firstChild).mouseover();
+ }
+ }
}
}
@@ -1669,6 +1948,8 @@
mouseover: function(rowDiv) {
if(!this.mouseEnabled) return false;
+ if(!rowDiv.id) return false;
+ if(rowDiv.className=='selected') return false;
var pieces = rowDiv.id.split('_');
var rowNow = u.bb.vgfGet('highlight_'+pieces[0],'');
@@ -1931,6 +2212,20 @@
}
x6inputs.setClass(input);
+ // An 'x6select' control replaces HTML Select. We add
+ // a little button off to the right of the input.
+ if(u.p(input,'x6select','N')=='Y') {
+ var str= '<span '
+ + 'class="button" '
+ + 'xInputId="'+input.id+'" '
+ + 'onmousedown = "this.className = '+"'button_mousedown'"+'" '
+ + 'onmouseup = "this.className = '+"'button'"+'" '
+ + 'onmouseout = "this.className = '+"'button'"+'" '
+ + 'onclick="x6inputs.ddClick(this)">'
+ + ' ↓ </span>';
+ $(input).after(str);
+ }
+
// This is important, it says that this is an
// active input. This distinguishes it from possible
// hidden inputs that were used as a clone source
@@ -2046,6 +2341,9 @@
return;
}
+ // KFD 12/10/08, hide any dropdowns
+ x6inputs.x6select.hide();
+
// Remove the "selected" class from the inputs row,
// it does not belong there anymore.
u.byId(this.rowId(skey,true)).className = '';
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-19 14:41:50
|
Revision: 957
http://andro.svn.sourceforge.net/andro/?rev=957&view=rev
Author: kendowns
Date: 2008-12-19 14:41:46 +0000 (Fri, 19 Dec 2008)
Log Message:
-----------
Release 1 Candidate!!!
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-19 14:41:11 UTC (rev 956)
+++ trunk/andro/clib/x6.js 2008-12-19 14:41:46 UTC (rev 957)
@@ -57,162 +57,7 @@
SearchAndReplace.replaceAll(view);
\* ================================================================== */
-/****O* Javascript-API/jsHtml
-*
-* NAME
-* Javascript-API.jsHtml
-*
-* FUNCTION
-* The javascript function jsHtml is a constructor
-* function for a new HTML node. It is considerably
-* faster and easier than document.createElement() and
-* node.appendChild.
-*
-* This function works almost exactly the same way as the
-* PHP function html(), except that it works in the
-* browser.
-*
-* The resulting object is considerably simpler than the
-* HTML nodes you can create in PHP, and is designed
-* only for basic tasks. There are no shortcuts for
-* creating complex entities, those must be coded by
-* hand.
-*
-* You can pass the innerHTML in as the second parameter,
-* or you can set it directly by assigning the innerHtml
-* property of the object.
-*
-* INPUTS
-* * string - a valid (x)html tag name like 'div' or 'span'
-* * string - (optional) the value of innerHtml
-*
-* EXAMPLE
-* Use the Javascript "new" operator with this function.
-* <script>
-* var div = new jsHtml('div','Hello, I am a div!');
-* div.hp.style = 'width: 300px';
-* var html = div.bufferedRender();
-* $( -- some jquery selector -- ).append(html);
-* </script>
-*
-******
-*/
-function jsHtml(tag,innerHtml) {
- this.tag = tag;
- this.children = [ ];
- this.hp = { };
-
- /****O* jsHtml/innerHtml
- *
- * NAME
- * jsHtml.innerHtml
- *
- * FUNCTION
- * The javascript property innerHtml holds the innerHTML
- * of an HTML node created by jsHtml(). You can pass in
- * the innerHtml as the second parameter to jsHtml, or
- * you can set this property directly.
- *
- * EXAMPLE
- * Use the Javascript "new" operator with this function.
- * <script>
- * var div = new jsHtml('div');
- * div.innerHtml = 'I set this on the 2nd line!';
- * var html = div.bufferedRender();
- * $( -- some jquery selector -- ).append(html);
- * </script>
- *
- ******
- */
- this.innerHtml = innerHtml ? innerHtml : '';
-
- /****O* jsHtml/addChild
- *
- * NAME
- * jsHtml.addChild
- *
- * FUNCTION
- * The javascript method addChild adds one HTML node as
- * a child to another. Both nodes must have been
- * created by using the jsHtml() constructor function.
- *
- * EXAMPLE
- * Use the Javascript "new" operator with this function.
- * <script>
- * var div = new jsHtml('div');
- * var span = new jsHtml('span','A span in a div!');
- * div.addChild(span);
- * var html = div.bufferedRender();
- * $( -- some jquery selector -- ).append(html);
- * </script>
- *
- ******
- */
- this.addChild = function(child) {
- this.children.push(child);
- }
- /******/
-
- /****O* jsHtml/h
- *
- * NAME
- * jsHtml.h
- *
- * FUNCTION
- * The javascript method h creates a new HTML node and
- * makes it a child of the current node. This is a
- * shortcut for having to call jsHtml and then
- * addChild.
- *
- * EXAMPLE
- * Use the Javascript "new" operator with this function.
- * <script>
- * var div = new jsHtml('div');
- * var span = div.h('span','Hello!');
- * var html = div.bufferedRender();
- * $( -- some jquery selector -- ).append(html);
- * </script>
- *
- ******
- */
- this.h = function(tag,innerHtml) {
- var newNode = new jsHtml(tag,innerHtml);
- this.addChild(newNode);
- return newNode;
- }
- /******/
-
- /****O* jsHtml/bufferedRender
- *
- * NAME
- * jsHtml.bufferedRender
- *
- * FUNCTION
- * The javascript method bufferedRender returns a string
- * of HTML for a node created with jsHtml. It sets all
- * properties, and recursively runs through all children.
- * The innerHtml, if it is present, goes out last.
- *
- * SOURCE
- */
- this.bufferedRender = function() {
- var html = '<' + this.tag;
- for(var attName in this.hp) {
- html+=' '+attName+'="'+this.hp[attName]+'"';
- }
- html+=">";
- for(var idx in this.children) {
- html+=this.children[idx].bufferedRender();
- }
- html+=this.innerHtml;
- html+='</'+this.tag+'>';
- return html;
- }
- /******/
-
-}
-
-
+
/****O* Javascript-API/x6events
*
* NAME
@@ -398,16 +243,18 @@
continue;
}
- // First possibility is a generic nofity handler
+ // Look for the method to receive the event
var retval = false;
var method = 'receiveEvent_'+eventName;
if(typeof(subscriber[method])=='function') {
retval = subscriber[method](arguments);
+ //console.log(id,eventName,retval);
}
else {
u.error("Subscriber has no method: ",method);
}
if(retval==false) {
+ //console.log('id returned false, setting false');
this.retvals[eventName] = false;
break;
}
@@ -469,6 +316,9 @@
//console.groupEnd();
return retval;
});
+
+ // Put little buttons next to stuff
+ $(':input').each(function() { x6inputs.x6select.addButton(this); });
},
// Initialize an object that has been sent from the server
@@ -497,6 +347,21 @@
// Make list of keys to stop no matter what
var stopThem = [ 'CtrlF5', 'F10' ];
+ var noPropagate = [
+ 'CtrlS', 'CtrlN', 'CtrlI', 'CtrlD',
+ 'CtrlL', 'CtrlO', 'CtrlW', 'CtrlP',
+ 'CtrlQ', 'CtrlR', 'CtrlU', 'CtrlK',
+ 'CtrlY'
+ ];
+
+ // Set a flag now. If user hit ESC, we are trying
+ // to exit the screen, unless somebody tells us we
+ // cannot do so.
+ if(retval=='Esc') {
+ //console.log("Esc key pressed, pre-seting exitApproved=true");
+ u.bb.vgfSet('exitApproved',true);
+ }
+
// Now we have a complete key label, fire the event
//console.log("In x6.keyDispatch, code and event follow");
//console.log(retval);
@@ -506,14 +371,40 @@
e.stopPropagation();
return false;
}
- else if (!x6events.fireEvent('key_'+retval,retval)) {
- //console.log("x6.keyDispatch: handler returned false, stopping propagation.");
- e.stopPropagation();
- return false;
- }
else {
- //console.log("x6.keyDispatch: handler returned true, continuing propagation.");
- return true;
+ var eventRetVal = x6events.fireEvent('key_'+retval,retval);
+ // ESC key is special, we need to know the retval
+ // for that, because if it came back true we will exit,
+ // but otherwise we cannot.
+ if(retval=='Esc') {
+ var exitApproved = u.bb.vgfGet('exitApproved',false);
+ //console.log("Key dispatch, ESC, exitapproved: ",exitApproved);
+ if(exitApproved) {
+ //console.log("exit for ESC was approved, going to menu");
+ setTimeout(
+ function() {
+ var x6page_prior=u.p(u.byId('x6page'),'value');
+ var x6mod_prior =u.p(u.byId('x6module'),'value');
+ var str = '?x6page=menu'
+ +'&x6page_prior='+x6page_prior
+ +'&x6mod_prior='+x6mod_prior;
+ window.location.replace(str);
+ }
+ ,10
+ );
+ }
+ }
+ else {
+ // All othere keys in the no-propagate list are
+ // stopped here.
+ if(noPropagate.indexOf(retval)>=0) {
+ e.stopPropagation();
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
}
}
}
@@ -553,11 +444,25 @@
// All meta keys return true immediately except TAB and ENTER
if(isMeta && !isNav) {
- //console.log(keyLabel);
+ //console.log("input keydown key: ",keyLabel);
var handUpList = ['UpArrow','DownArrow','PageUp','PageDown'];
if(handUpList.indexOf(keyLabel)>=0) {
- //console.log("Weird key that we pass up to doc-level keyPress");
- var retval= x6.keyDispatcher(e);
+ // An explicit flag can prevent handing events up
+ if(u.p(inp,'xNoPassup','N')=='N') {
+ // If there is an open x6select, do not hand up
+ if(x6inputs.x6select.div) {
+ if(keyLabel == 'DownArrow') {
+ x6inputs.x6select.display(inp,'Down');
+ }
+ if(keyLabel == 'UpArrow' ) {
+ x6inputs.x6select.display(inp,'Up');
+ }
+ }
+ else {
+ //console.log("Weird key that we pass up to doc-level keyPress");
+ var retval= x6.keyDispatcher(e);
+ }
+ }
//console.groupEnd();
return retval;
}
@@ -598,7 +503,7 @@
// Type validation for some types, only if not TAB or ENTER
if(!isNav) {
- console.log("Not nav key, doing type validation");
+ //console.log("Not nav key, doing type validation");
type = u.p(inp,'xtypeid');
switch(type) {
case 'int':
@@ -644,7 +549,7 @@
json.addParm('x6select','Y');
json.addParm('gpletters',val);
json.execute(true);
- x6inputs.x6select.display(inp);
+ //x6inputs.x6select.display(inp);
x6inputs.x6select.displayDynamic(inp,ua.data.x6select);
}
@@ -660,6 +565,7 @@
// the value is set when afterBlurner fires.
if(u.p(inp,'x6select','N')=='Y') {
x6inputs.x6select.assignToMe(inp);
+ x6inputs.x6select.hide();
}
// This took a lot of experimentation to get right.
@@ -681,26 +587,24 @@
// logic immediately below
var tg = u.p(inp,'xTabGroup','tgdefault');
var jqString = '[xTabGroup='+tg+']:not([disabled])';
- var jqObj = $(jqString)
+ var jqObj = $(jqString);
var inpCount = jqObj.length;
var first = jqObj[0];
var last = jqObj[inpCount-1];
+
// If we are on first or last, Enter/Tab dichotomy does not matter,
// we just send focus where we want and return false to kill
// original behavior.
if(inp==first && e.shiftKey) {
- $('[xTabGroup='+tg+']:not([disabled]):last').focus();
+ var str ='[xTabGroup='+tg+']:not([disabled]):last';
+ //console.log(str);
+ $(str).focus();
//console.log("First input, hit shift, going to last");
//console.groupEnd();
return false;
}
if(inp==last && !e.shiftKey) {
- //if(u.p(inp,'inGrid',false)) {
- // x6events.fireEvent('key_DownArrow');
- // return;
- //}
-
$('[xTabGroup='+tg+']:not([disabled]):first').focus();
//console.log("Last input, no shift, going to first");
//console.groupEnd();
@@ -733,7 +637,7 @@
);
if(focusTo) {
//console.log("Setting focus forward to ",focusTo);
- $('#'+focusTo).focus().select();
+ $('[zActive]#'+focusTo).focus().select();
}
}
@@ -756,7 +660,7 @@
);
if(focusTo) {
//console.log("Setting focus backward to ",focusTo);
- $('#'+focusTo).focus().select();
+ $('[zActive]#'+focusTo).focus().select();
}
}
//console.log("Returning True");
@@ -767,10 +671,14 @@
focus: function(inp) {
//console.group("Input focus ",inp.id);
//console.log("Input: ",inp);
+ this.x6select.checkForMe(inp);
inp.zSelected = 1;
inp.zOriginalValue = u.p(inp,'zOriginalValue','').trim();
inp.lastBlurred = '';
x6inputs.setClass(inp);
+ if(u.p(inp,'zNew',0)==0) {
+ u.bb.vgfSet('lastFocus_'+u.p(inp,'xTableId'),inp.id);
+ }
//console.log("Input focus DONE");
//console.groupEnd();
return true;
@@ -976,18 +884,38 @@
ddClick: function(button) {
var id = u.p(button,'xInputId');
- var inp = $('[zActive]#'+id)[0];
+ var inp = $('#'+id)[0];
this.x6select.display(inp);
},
x6select: {
+ input: false,
dynRowCount: 15,
- div: false,
+ div: false,
+ addButton: function(input) {
+ if(u.p(input,'x6select','N')=='Y') {
+ var str= '<span '
+ + 'class="button" '
+ + 'xInputId="'+input.id+'" '
+ + 'onmousedown = "this.className = '+"'button_mousedown'"+'" '
+ + 'onmouseup = "this.className = '+"'button'"+'" '
+ + 'onmouseout = "this.className = '+"'button'"+'" '
+ + 'onclick="x6inputs.ddClick(this)">'
+ + ' ↓ </span>';
+ $(input).after(str);
+ }
+ },
+
+ checkForMe: function(input) {
+ if(this.input != input) this.hide();
+ },
+
hide: function() {
$(".x6select").remove();
this.tbody=false;
- this.div = false;
+ this.div =false;
+ this.input=false;
},
assignToMe: function(inp) {
@@ -1007,6 +935,7 @@
}
if(!this.div) {
+ this.input = input;
this.div = document.createElement('DIV');
this.div.style.display = 'none';
this.div.style.position = 'absolute';
@@ -1063,6 +992,9 @@
if(fromKeyboard != null) {
this.moveUpOrDown(fromKeyboard);
}
+ else {
+ $(input).focus();
+ }
},
displayTitles: function(input) {
@@ -1099,7 +1031,7 @@
var svals = u.p(input,'xValues','');
if(svals.trim()=='') return;
- console.log(svals);
+ //console.log(svals);
retval = '';
var rows = svals.split('||');
for(var idx in rows) {
@@ -1109,16 +1041,27 @@
retval+= '<td>'+values[idx2];
}
}
- console.log(retval);
+ //console.log(retval);
this.tbody.innerHTML = retval;
},
displayDynamic: function(input,rows) {
+ // Begin by determining if we will show or hide
retval = ''
if(rows.length==0) {
- this.tbody.innerHTML = '';
+ this.hide();
+ //this.tbody.innerHTML = '';
return;
}
+ this.display(input);
+
+ // Find out if there is a currently selected row
+ var curVal = '';
+ var jqCandidate = $(this.tbody).find("tr.hilight td:first");
+ if(jqCandidate.length > 0 ) {
+ curVal = jqCandidate[0].innerHTML;
+ }
+
for(var idx in rows) {
retval += '<tr>';
var values = rows[idx];
@@ -1135,8 +1078,23 @@
this.div.style.height = lh*(this.dynRowCount+1) + "px";
this.tbody.style.height = lh*this.dynRowCount + "px";
}
+
this.tbody.innerHTML = retval;
this.mouseEvents(input);
+
+ // Now determine if we will highlight a row
+ var doFirst = true;
+ if(curVal!='') {
+ var jqCandidate = $(this.tbody).find('td:contains('+curVal+')');
+ if(jqCandidate.length > 0) {
+ $(jqCandidate).mouseover();
+ doFirst = false;
+ }
+ }
+ if(doFirst) {
+ window.x = this.tbody;
+ $(this.tbody).find('td:first').mouseover();
+ }
},
mouseEvents: function(input) {
@@ -1177,7 +1135,7 @@
else {
if(direction == 'Up') {
var candidate = $(rowNow).prev();
- console.log("Up candidate ",candidate);
+ //console.log("Up candidate ",candidate);
var rowsBelow = $(rowNow).nextAll().length;
if(rowsBelow > 5) {
var stNow = $('.x6select tbody').scrollTop();
@@ -1186,15 +1144,15 @@
}
else {
var candidate = $(rowNow).next();
- console.log("Down candidate ",candidate);
+ //console.log("Down candidate ",candidate);
var rowsAbove = $(rowNow).prevAll().length;
if(rowsAbove > 5) {
var stNow = $('.x6select tbody').scrollTop();
$(jqBody).scrollTop(stNow + this.lineHeight + 3);
}
}
- console.log("row now ",rowNow);
- console.log(direction);
+ //console.log("row now ",rowNow);
+ //console.log(direction);
if (candidate.length > 0) $(candidate[0].firstChild).mouseover();
}
}
@@ -1225,33 +1183,31 @@
buttonNew: function(self,id,table) {
x6plugins.buttonStandard(self,'new','CtrlN');
self.main = function() {
- x6events.fireEvent('reqNewRow_'+this.zTable);
+ return x6events.fireEvent('reqNewRow_'+this.zTable);
}
},
buttonInsert: function(self,id,table) {
x6plugins.buttonStandard(self,'ins','CtrlI');
self.main = function() {
- x6events.fireEvent('reqNewRow_'+this.zTable,true);
+ return x6events.fireEvent('reqNewRow_'+this.zTable,true);
}
},
buttonDelete: function(self,id,table) {
x6plugins.buttonStandard(self,'delete','CtrlD');
self.main = function() {
- x6events.fireEvent('reqDelRow_'+this.zTable);
+ return x6events.fireEvent('reqDelRow_'+this.zTable);
}
},
buttonCancel: function(self,id,table) {
x6plugins.buttonStandard(self,'cancel','Esc');
self.main = function() {
- if(confirm("Abandon all changes?")) {
- x6events.fireEvent('reqUndoRow_'+this.zTable);
- }
+ x6events.fireEvent('reqUndoRow_'+this.zTable);
}
},
buttonSave: function(self,id,table) {
x6plugins.buttonStandard(self,'save','CtrlS');
self.main = function() {
- x6events.fireEvent('reqSaveRow_'+this.zTable);
+ return x6events.fireEvent('reqSaveRow_'+this.zTable);
}
},
/****m* x6plugins/buttonStandard
@@ -1343,7 +1299,9 @@
if(!this.zDisabled) this.main();
// if a key event is received, we *always* stop
// propagation
- x6events.retvals['key_'+this.zKey] = false;
+ // KFD 12/15/08, EXPERIMENTAL. Do not do this here,
+ // handle it in the top-level controller
+ //x6events.retvals['key_'+this.zKey] = false;
}
// finally of course set the onclick method
@@ -1462,7 +1420,7 @@
var result = this.saveOk();
u.bb.vgfSet('lastSave_'+this.zTable,result);
if(result!='fail') {
- x6events.fireEvent('uiNewRow_'+table,tabDivBefore);
+ x6events.fireEvent('uiNewRow_'+this.zTable,tabDivBefore);
}
//console.groupEnd();
}
@@ -1486,7 +1444,7 @@
var result = this.saveOk();
u.bb.vgfSet('lastSave_'+this.zTable,result);
if(result!='fail') {
- x6events.fireEvent('uiEditRow_'+table,skey);
+ x6events.fireEvent('uiEditRow_'+this.zTable,skey);
}
}
//console.log("tableController reqEditRow finished");
@@ -1526,10 +1484,16 @@
// Only attempt a save if something changed
if(cntChg == 0) {
- //console.log("no changes, not trying to save");
var retval = 'noaction';
+ var skeynow=u.bb.vgfGet('skey_'+this.zTable)
+ if(skeynow==0) {
+ //console.log(" ---- was editing new row, exit denied ---- ");
+ u.bb.vgfSet('exitApproved',false);
+ }
}
else {
+ //console.log(" ---- There were changes, not approving exit ----");
+ u.bb.vgfSet('exitApproved',false);
//console.log("attempting database save");
//console.log("Sending x4v_skey ",this.zSkey);
@@ -1713,20 +1677,46 @@
/*
* Two requests, one to turn on editing-mode buttons,
- * another to turn them off.
+ * another to turn them off. Third to turn on just new/ins
*/
x6events.subscribeToEvent('buttonsOn_'+table,id);
- self['receiveEvent_buttonsOn_'+table] = function() {
- x6events.fireEvent('enable_save_' +this.zTable);
- x6events.fireEvent('enable_cancel_' +this.zTable);
- x6events.fireEvent('enable_delete_' +this.zTable);
+ self['receiveEvent_buttonsOn_'+table] = function(forceAll) {
+ /*
+ * If another table has its buttons on, they
+ * must be turned off.
+ */
+ var buttonsTable = u.bb.vgfGet('buttonsTable','');
+ if(buttonsTable!='' && buttonsTable != this.zTable) {
+ x6events.fireEvent('buttonsOff_'+buttonsTable);
+ }
+
+ // Now only turn buttons on if we have an skey
+ var skey = u.bb.vgfGet('skey_'+this.zTable);
+ //console.log("current skey is ",skey);
+ x6events.fireEvent('enable_new_' +this.zTable);
+ x6events.fireEvent('enable_ins_' +this.zTable);
+ if(skey >= 0) {
+ x6events.fireEvent('enable_save_' +this.zTable);
+ x6events.fireEvent('enable_cancel_' +this.zTable);
+ x6events.fireEvent('enable_delete_' +this.zTable);
+ }
+ u.bb.vgfSet('buttonsTable',this.zTable);
}
x6events.subscribeToEvent('buttonsOff_'+table,id);
- self['receiveEvent_buttonsOff_'+table] = function() {
+ self['receiveEvent_buttonsOff_'+table] = function(forceAll) {
+ if(forceAll) {
+ x6events.fireEvent('disable_new_' +this.zTable);
+ x6events.fireEvent('disable_ins_' +this.zTable);
+ }
x6events.fireEvent('disable_save_' +this.zTable);
x6events.fireEvent('disable_cancel_' +this.zTable);
x6events.fireEvent('disable_delete_' +this.zTable);
}
+ x6events.subscribeToEvent('buttonsNew_'+table,id);
+ self['receiveEvent_buttonsNew_'+table] = function() {
+ x6events.fireEvent('enable_new_' +this.zTable);
+ x6events.fireEvent('enable_ins_' +this.zTable);
+ }
}
@@ -1780,6 +1770,9 @@
// Branch out to display in edit mode
this.displayRow('edit',row);
+ x6events.fireEvent('uiHideKids_'+this.zTable,this.zTable);
+ x6events.fireEvent('uiEnableKids_'+this.zTable,this.zTable);
+
//console.log("detailDisplay uiEditRow FINISHED");
//console.groupEnd();
}
@@ -1791,6 +1784,11 @@
self['receiveEvent_uiNewRow_'+table] = function(tabDivBefore) {
//console.group("detailDisplay uiNewRow");
this.displayRow('new',{});
+
+ // KFD 12/18/08. Fire an event to disable kid tabs
+ x6events.fireEvent('uiHideKids_'+this.zTable,this.zTable);
+ x6events.fireEvent('uiDisableKids_'+this.zTable,this.zTable);
+
//console.log("detailDisplay uiNewRow FINISHED");
//console.groupEnd();
}
@@ -1821,6 +1819,8 @@
}
);
u.bb.vgfSet('skey_'+this.zTable,-1);
+ x6events.fireEvent('uiHideKids_'+this.zTable,this.zTable);
+ x6events.fireEvent('uiDisableKids_'+this.zTable,this.zTable);
}
@@ -1834,6 +1834,8 @@
x6inputs.clearOut(this);
});
x6events.fireEvent('buttonsOff_'+this.zTable);
+ x6events.fireEvent('uiHideKids_'+this.zTable,this.zTable);
+ x6events.fireEvent('uiDisableKids_'+this.zTable,this.zTable);
//console.log("detailDisplay uiDelRow FINISHED");
//console.groupEnd();
}
@@ -1953,7 +1955,7 @@
var pieces = rowDiv.id.split('_');
var rowNow = u.bb.vgfGet('highlight_'+pieces[0],'');
- if(rowNow!='') u.byId(rowNow).className = '';
+ if(rowNow!='' && u.byId(rowNow)!=null) u.byId(rowNow).className = '';
var row = u.byId(rowDiv.id);
if(row.id != 'selected') {
u.byId(rowDiv.id).className = 'hilight';
@@ -1995,6 +1997,7 @@
self.x6profile = u.p(self,'x6profile','none');
self.kbOnEdit = ['x6tabDiv','twosides'].indexOf(self.x6profile)>=0;
+
/*
* These two will tell us down below if the grid
* displays inputs for new rows and allows
@@ -2027,8 +2030,10 @@
return (noPound==null ? '#' : '')+this.zTable+'_'+skey;
}
self.skeyForRow = function(row) {
- var pieces = row.id.split('_');
- return pieces[1];
+ if(typeof(row)!='undefined') {
+ var pieces = row.id.split('_');
+ return pieces[1];
+ }
}
/*
@@ -2063,7 +2068,7 @@
//console.groupEnd();
return;
}
-
+
/*
* If editing some other row, we know it was saved
* and is ok, convert it back to display
@@ -2073,32 +2078,14 @@
}
/*
- * This is the major UI stuff. We need to slip a
- * row into the grid, clone some of the invisible
- * inputs that have been provided by the PHP code,
- * and get them all initialized and ready to go.
+ * Pull the empty row and replace all of the values.
*/
- var newRow =
- "<div id='"+this.zTable+"_0' "
- +" class='selected' "
- +" style='display:none'>";
- var numbers = [ 'int', 'numb', 'money' ];
- for (var idx in this.zColsInfo) {
- var colInfo = this.zColsInfo[idx];
- if(colInfo.column_id == '') continue;
-
- newRow+= "<div gColumn = '"+idx+"'"
- +" style='width: "+colInfo.width+"px;";
- if(numbers.indexOf(colInfo.type_id)>=0) {
- newRow+="text-align: right;";
- }
- newRow+="'>";
- var id = '#wrapper_'+this.zTable+'_'+colInfo.column_id;
- var newInput = $(id).html();
- //console.log("column: ",colInfo.column_id);
- newRow+=newInput+"</div>";
+ var html = "<div id='"+this.zTable+"_0' style='display:none'>"
+ + this.zRowEditHtml
+ + "</div>";
+ for(var idx in this.zColsById) {
+ html = html.replace('*VALUE_'+idx+'*','');
}
- newRow+="</div>";
/*
@@ -2134,38 +2121,30 @@
if(jqRow.length==0) {
if(tabDivBefore) {
//console.log("body prepend");
- $(this).find('.tbody').prepend(newRow);
+ $(this).find('.tbody').prepend(html);
}
else {
//console.log("body append");
- $(this).find('.tbody').append(newRow);
+ $(this).find('.tbody').append(html);
}
}
else {
if(tabDivBefore) {
//console.log("before this row: ",jqRow);
- $(jqRow).before(newRow);
+ $(jqRow).before(html);
}
else {
//console.log("after this row: ",jqRow);
- $(jqRow).after(newRow);
+ $(jqRow).after(html);
}
...
[truncated message content] |
|
From: <ken...@us...> - 2008-12-21 02:09:49
|
Revision: 977
http://andro.svn.sourceforge.net/andro/?rev=977&view=rev
Author: kendowns
Date: 2008-12-21 02:09:46 +0000 (Sun, 21 Dec 2008)
Log Message:
-----------
Accept notifications to turn off keyboard events for modal dialogs. Experimental, not sure how this is going to play out yet.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-21 02:08:47 UTC (rev 976)
+++ trunk/andro/clib/x6.js 2008-12-21 02:09:46 UTC (rev 977)
@@ -106,6 +106,14 @@
******
*/
subscribers: { },
+
+ eventsDisabled: false,
+ disableEvents: function() {
+ this.eventsDisabled = true;
+ },
+ enableEvents: function() {
+ this.eventsDisabled = false;
+ },
/****m* x6events/subscribeToEvent
*
@@ -226,6 +234,8 @@
*/
retvals: { },
fireEvent: function(eventName,arguments) {
+ if(this.eventsDisabled) return;
+
//console.group("fireEvent "+eventName);
//console.log('arguments: ',arguments);
// Find out if anybody is listening for this event
@@ -301,6 +311,11 @@
\* **************************************************************** */
var x6 = {
+ // A list of keyboard events that is allowed when a modal
+ // dialog is up. False means allow all, an array would list
+ // what is allowed, and an empty array allows none.
+ dialogsAllow: false,
+
// Find all plugins in the x6plugins object. Find all
// DOM elements with property x6plugIn=xxx.
// Invoke the constructor for each one.
@@ -333,7 +348,7 @@
initFocus: function() {
//var str = '[x6firstFocus=Y]:not([disabled]):reallyvisible:first';
- var str = 'input:not([disabled]):reallyvisible:first';
+ var str = 'input:not([disabled]):first';
//var first = $('input:not([disabled])').isVisible().find(':first');
var first = $(str);
if(first.length>0) first.focus();
@@ -344,6 +359,15 @@
keyDispatcher: function(e) {
var retval = u.keyLabel(e);
+ // Possible trapping because of modal dialogs
+ if(typeof(x6.dialogsAllow)=='object') {
+ if(x6.dialogsAllow.indexOf(retval) == -1) {
+ e.stopPropagation();
+ return false;
+ }
+ }
+
+
// Make list of keys to stop no matter what
var stopThem = [ 'CtrlF5', 'F10' ];
@@ -2912,6 +2936,7 @@
// even if the server does not return anything,
// because we initialized to an empty object.
$(this).find(".tbody").replaceWith(html);
+ $(this).find('.tbody div:first').mouseover();
}
}
delete json;
@@ -3187,7 +3212,7 @@
self['receiveEvent_key_Ctrl'+x.toString()] = function(key) {
//return;
//console.time("tabs key");
- console.time("checking for visible");
+ //console.time("checking for visible");
// Abort if he is not really visible, this is the
// easiest way to do this, and we don't have to
// keep track of whether or not it is visible.
@@ -3207,7 +3232,7 @@
return;
}
}
- console.timeEnd("checking for visible");
+ //console.timeEnd("checking for visible");
// get the offset, the keystroke,
// and calculate the index.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-24 04:01:38
|
Revision: 992
http://andro.svn.sourceforge.net/andro/?rev=992&view=rev
Author: kendowns
Date: 2008-12-24 04:01:30 +0000 (Wed, 24 Dec 2008)
Log Message:
-----------
Bunch of changes for logging and support for androPage
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-24 04:01:09 UTC (rev 991)
+++ trunk/andro/clib/x6.js 2008-12-24 04:01:30 UTC (rev 992)
@@ -19,45 +19,7 @@
or visit http://www.gnu.org/licenses/gpl.html
\* ================================================================== */
-/* ================================================================== *\
-
- Debugging using Firebug.
-
- This file is full of commands that make use of firebugs
- very nice console facilities. The up-side is that we get very
- thorough event tracing when needed. The down-side is that they
- do not work at all on Internet Explorer and severely slow you
- down while running.
-
- Therefore, it is desirable to be able to turn them off andon
- from time to time. The best thing to do is comment them all
- out completely, but that can be tedious. The following two
- Beanshell files show the jEdit commands for turning logging
- on and off by commenting and uncommenting the relevant lines.
-
- If you want to do it manually, just replace all "//console."
- with "//console." or vice-versa.
-
- # Beanshell: Turn logging off by commenting out lines
- SearchAndReplace.setSearchString("//console.");
- SearchAndReplace.setReplaceString("//console.");
- SearchAndReplace.setBeanShellReplace(false);
- SearchAndReplace.setIgnoreCase(true);
- SearchAndReplace.setRegexp(false);
- SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
- SearchAndReplace.replaceAll(view);
-
- # Beanshell: Turn logging on by uncommenting the lines.
- SearchAndReplace.setSearchString("//console.");
- SearchAndReplace.setReplaceString("//console.");
- SearchAndReplace.setBeanShellReplace(false);
- SearchAndReplace.setIgnoreCase(true);
- SearchAndReplace.setRegexp(false);
- SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
- SearchAndReplace.replaceAll(view);
-\* ================================================================== */
-
-
+
/****O* Javascript-API/x6events
*
* NAME
@@ -144,9 +106,9 @@
* SOURCE
*/
subscribeToEvent: function(eventName,id) {
- //console.group("subscribeToEvent "+eventName);
- //console.log("event name: ",eventName)
- //console.log("id subscbr: ",id);
+ x6.console.group("subscribeToEvent "+eventName);
+ x6.console.log("event name: ",eventName)
+ x6.console.log("id subscbr: ",id);
if(id=='undefined') {
u.error('x6events.subscribeToEvent. Second parameter '
+' undefined. First parameter: '+eventName
@@ -168,7 +130,7 @@
if(this.subscribers[eventName].indexOf(id)==-1) {
this.subscribers[eventName].push(id);
}
- //console.groupEnd();
+ x6.console.groupEnd();
},
/******/
@@ -236,8 +198,8 @@
fireEvent: function(eventName,arguments) {
if(this.eventsDisabled) return;
- //console.group("fireEvent "+eventName);
- //console.log('arguments: ',arguments);
+ x6.console.group("fireEvent "+eventName);
+ x6.console.log('arguments: ',arguments);
// Find out if anybody is listening for this event
var subscribers = this.getSubscribers(eventName);
@@ -246,7 +208,7 @@
this.retvals[eventName] = true;
for(var x in subscribers) {
var id = subscribers[x];
- //console.log("subscriber: ",id);
+ x6.console.log("subscriber: ",id);
var subscriber = u.byId(id);
if(subscriber==null) {
u.error("There is no object with that ID, cannot dispatch");
@@ -258,19 +220,19 @@
var method = 'receiveEvent_'+eventName;
if(typeof(subscriber[method])=='function') {
retval = subscriber[method](arguments);
- //console.log(id,eventName,retval);
+ x6.console.log(id,eventName,retval);
}
else {
u.error("Subscriber has no method: ",method);
}
if(retval==false) {
- //console.log('id returned false, setting false');
+ x6.console.log('id returned false, setting false');
this.retvals[eventName] = false;
break;
}
}
- //console.log("fireEvent ",eventName," RETURNING: ",this.retvals[eventName]);
- //console.groupEnd();
+ x6.console.log("fireEvent ",eventName," RETURNING: ",this.retvals[eventName]);
+ x6.console.groupEnd();
return this.retvals[eventName];
}
}
@@ -325,10 +287,10 @@
// events to keyDispatcher that don't go to
// the document.keypress from an input
$(document).keypress(function(e) {
- //console.group("Document Keypress");
- //console.log("keypress ",e);
+ x6.console.group("Document Keypress");
+ x6.console.log("keypress ",e);
var retval= x6.keyDispatcher(e);
- //console.groupEnd();
+ x6.console.groupEnd();
return retval;
});
@@ -341,14 +303,14 @@
var obj = u.byId(id);
var pin = u.p(obj,'x6plugin');
obj.zTable = u.p(obj,'x6table');
- //console.log(pin,obj.zTable);
- //console.log(obj);
+ x6.console.log(pin,obj.zTable);
+ x6.console.log(obj);
x6plugins[pin](obj,obj.id,obj.zTable);
},
initFocus: function() {
//var str = '[x6firstFocus=Y]:not([disabled]):reallyvisible:first';
- var str = 'input:not([disabled]):first';
+ var str = ':input:not([disabled]):first';
//var first = $('input:not([disabled])').isVisible().find(':first');
var first = $(str);
if(first.length>0) first.focus();
@@ -358,6 +320,7 @@
// Keyboard handler
keyDispatcher: function(e) {
var retval = u.keyLabel(e);
+ x6.console.log(retval);
// Possible trapping because of modal dialogs
if(typeof(x6.dialogsAllow)=='object') {
@@ -382,16 +345,16 @@
// to exit the screen, unless somebody tells us we
// cannot do so.
if(retval=='Esc') {
- //console.log("Esc key pressed, pre-seting exitApproved=true");
+ x6.console.log("Esc key pressed, pre-seting exitApproved=true");
u.bb.vgfSet('exitApproved',true);
}
// Now we have a complete key label, fire the event
- //console.log("In x6.keyDispatch, code and event follow");
- //console.log(retval);
- //console.log(e);
+ x6.console.log("In x6.keyDispatch, code and event follow");
+ x6.console.log(retval);
+ x6.console.log(e);
if(stopThem.indexOf(retval)>0) {
- //console.log("x6.keyDispatch: key is in force stop list, stopping propagation.");
+ x6.console.log("x6.keyDispatch: key is in force stop list, stopping propagation.");
e.stopPropagation();
return false;
}
@@ -402,9 +365,9 @@
// but otherwise we cannot.
if(retval=='Esc') {
var exitApproved = u.bb.vgfGet('exitApproved',false);
- //console.log("Key dispatch, ESC, exitapproved: ",exitApproved);
+ x6.console.log("Key dispatch, ESC, exitapproved: ",exitApproved);
if(exitApproved) {
- //console.log("exit for ESC was approved, going to menu");
+ x6.console.log("exit for ESC was approved, going to menu");
setTimeout(
function() {
var x6page_prior=u.p(u.byId('x6page'),'value');
@@ -430,11 +393,168 @@
}
}
}
- }
+ },
+
+ /*
+ * The console object starts out with do-nothing functions.
+ * These are replaced if the console object exists.
+ */
+ console: {
+ enabled: false,
+ enableLog: false,
+ enableWarn: false,
+ enableInfo: false,
+ enableError: false,
+ enableTime: false,
+ enableGroup: false,
+ enableProfile: false,
+ enableOutline: function() {
+ this.enableTime = true;
+ this.enableGroup = true;
+ this.enableProfile=true;
+ },
+ enableAll: function() {
+ this.enableLog = true;
+ this.enableWarn = true;
+ this.enableInfo = true;
+ this.enableError = true;
+ this.enableTime = true;
+ this.enableGroup = true;
+ this.enableProfile=true;
+ },
+ disableAll: function() {
+ this.enableLog = false;
+ this.enableWarn = false;
+ this.enableInfo = false;
+ this.enableError = false;
+ this.enableTime = false;
+ this.enableGroup = false;
+ this.enableProfile=false;
+ },
+ indent: '',
+ log: function(args) { },
+ warn: function(args) { },
+ info: function(args) { },
+ error: function(args) { },
+ time: function(args) { },
+ timeEnd: function(args) { },
+ group: function(args) { },
+ groupEnd:function(args) { },
+ _log: function(x1,x2,x3,x4,x5,x6,x7) {
+ if(typeof(x2)=='undefined')
+ console.log(x1);
+ else if (typeof(x3)=='undefined')
+ console.log(x1,x2);
+ else if (typeof(x4)=='undefined')
+ console.log(x1,x2,x3);
+ else if (typeof(x5)=='undefined')
+ console.log(x1,x2,x3,x4);
+ else if (typeof(x6)=='undefined')
+ console.log(x1,x2,x3,x4,x5);
+ else if (typeof(x7)=='undefined')
+ console.log(x1,x2,x3,x4,x5,x6);
+ else
+ console.log(x1,x2,x3,x4,x5,x6,x7);
+ },
+ }
}
/* **************************************************************** *\
+ Run-time creation of specialized functions on
+ the x6.console object. These are cross-compatible between
+ firebug and
+
+\* **************************************************************** */
+if(typeof(console)!='undefined') {
+
+ // Firebug defines "x6.console.group", but blackbird does
+ // not. So if we cannot find x6.console.group we create
+ // functions that do indenting instead.
+ //
+ if(typeof(x6.console.group)=='undefined') {
+ x6.console.group = function(x) {
+ if(!this.groupEnable) return;
+ this._log(x);
+ this.indent+=' ';
+ }
+ x6.console.groupEnd = function(x) {
+ if(!this.groupEnable) return;
+ this._log(x);
+ if(this.indent.length > 0) {
+ if(this.indent.length==2) {
+ this.indent = '';
+ }
+ else {
+ this.indent = this.indent.slice(0,this.indent.length-2);
+ }
+ }
+ }
+
+
+
+ }
+
+ if(true) {
+ x6.console.log = function(x1,x2,x3,x4,x5,x6,x7) {
+ if(this.enableLog) {
+ this._log(this.indent+x1,x2,x3,x4,x5,x6,x7);
+ }
+ }
+ x6.console.warn = function(x) {
+ if(this.enableWarn) console.warn(this.indent+x);
+ }
+ x6.console.info = function(x) {
+ if(this.enableInfo) console.info(this.indent+x);
+ }
+ x6.console.error = function(x) {
+ if(this.enableError) console.error(this.indent+x);
+ }
+
+
+ if(typeof(console.time)!='undefined') {
+ x6.console.time = function(x) {
+ if(this.enableTime) console.time(this.indent+x);
+ }
+ x6.console.timeEnd = function(str) {
+ if(this.enableTime) console.timeEnd(this.indent+x);
+ }
+ }
+ }
+ else {
+ x6.console.log = function(x) {
+ if(this.enableLog) console.log(x);
+ }
+ x6.console.warn = function(x) {
+ if(this.enableWarn) console.warn(x);
+ }
+ x6.console.info = function(x) {
+ if(this.enableInfo) console.info(x);
+ }
+ x6.console.error = function(x) {
+ if(this.enableError) console.error(x);
+ }
+ x6.console.group = function(x) {
+ if(this.enableGroup) console.group(x);
+ }
+ x6.console.groupEnd = function(x) {
+ if(this.enableGroup) console.groupEnd(x);
+ }
+ if(typeof(console.time)!='undefined') {
+ x6.console.time = function(x) {
+ if(this.enableTime) console.time(x);
+ }
+ x6.console.timeEnd = function(str) {
+ if(this.enableTime) console.timeEnd(x);
+ }
+ }
+ }
+}
+x6.console.enableAll();
+
+
+/* **************************************************************** *\
+
Universal x6 input keyup handler
\* **************************************************************** */
@@ -443,12 +563,12 @@
// you do not see an input's new value until the keyup
// event. You do not see it in keypress or keydown.
keyUp: function(e,inp) {
- //console.group("Input keyUp");
- //console.log(e);
- //console.log(inp);
+ x6.x6.console.group("Input keyUp");
+ x6.console.log(e);
+ x6.console.log(inp);
x6inputs.setClass(inp);
- //console.groupEnd("Input keyUp");
+ x6.console.groupEnd("Input keyUp");
},
// Keydown is used only for tab or shift tab, to enforce
@@ -457,18 +577,18 @@
// current control
//
keyDown: function(e,inp) {
- //console.group('Input keyDown ');
- //console.log(inp);
+ x6.console.group('Input keyDown ');
+ x6.console.log(inp);
var keyLabel=u.keyLabel(e);
var isTab =keyLabel=='Tab' || keyLabel=='ShiftTab';
var isEnter =keyLabel=='Enter' || keyLabel=='ShiftEnter';
var isMeta =u.keyIsMeta(e);
var isNav =isEnter || isTab;
- //console.log("label ",keyLabel,' isTab ',isTab,' isEnter ',isEnter,' isMeta ',isMeta,' isNav ',isNav);
+ x6.console.log("label ",keyLabel,' isTab ',isTab,' isEnter ',isEnter,' isMeta ',isMeta,' isNav ',isNav);
// All meta keys return true immediately except TAB and ENTER
if(isMeta && !isNav) {
- //console.log("input keydown key: ",keyLabel);
+ x6.console.log("input keydown key: ",keyLabel);
var handUpList = ['UpArrow','DownArrow','PageUp','PageDown'];
if(handUpList.indexOf(keyLabel)>=0) {
// An explicit flag can prevent handing events up
@@ -483,11 +603,11 @@
}
}
else {
- //console.log("Weird key that we pass up to doc-level keyPress");
+ x6.console.log("Weird key that we pass up to doc-level keyPress");
var retval= x6.keyDispatcher(e);
}
}
- //console.groupEnd();
+ x6.console.groupEnd();
return retval;
}
else if(keyLabel=='CtrlLeftArrow') {
@@ -511,36 +631,36 @@
this.firstInput(inp);
}
else if(keyLabel=='End') {
- //console.log(inp);
+ x6.console.log(inp);
var ss = inp.selectionStart;
var se = inp.selectionEnd;
var ln = inp.value.toString().trim().length;
- //console.log(ss,se,ln);
+ x6.console.log(ss,se,ln);
if(ss == se && se == ln) this.lastInput(inp);
}
else {
- //console.log("meta but not nav, ret true");
+ x6.console.log("meta but not nav, ret true");
}
- //console.groupEnd();
+ x6.console.groupEnd();
return true;
}
// Type validation for some types, only if not TAB or ENTER
if(!isNav) {
- //console.log("Not nav key, doing type validation");
+ x6.console.log("Not nav key, doing type validation");
type = u.p(inp,'xtypeid');
switch(type) {
case 'int':
- //console.log("type validation for int");
+ x6.console.log("type validation for int");
if(!u.keyIsNumeric(e)) return false;
break;
case 'numb':
case 'money':
- //console.log("type validation for numb/money");
+ x6.console.log("type validation for numb/money");
if(!u.keyIsNumeric(e) && u.keyLabel(e)!='.') return false;
break;
case 'date':
- //console.log("type validation for date");
+ x6.console.log("type validation for date");
if(!u.keyIsNumeric(e)) {
if(keyLabel!='-' && keyLabel!='/') return false;
}
@@ -565,10 +685,10 @@
var val = val.slice(0,inp.selectionStart)
+keyLabel
+val.slice(inp.selectionEnd);
- //console.log("current value: ",inp.value)
- //console.log("sel start: ",inp.selectionStart)
- //console.log("sel end: ",inp.selectionEnd)
- //console.log("computed value:",val);
+ x6.console.log("current value: ",inp.value)
+ x6.console.log("sel start: ",inp.selectionStart)
+ x6.console.log("sel end: ",inp.selectionEnd)
+ x6.console.log("computed value:",val);
json = new androJSON('x6page',u.p(inp,'x6seltab'));
json.addParm('x6select','Y');
json.addParm('gpletters',val);
@@ -577,8 +697,8 @@
x6inputs.x6select.displayDynamic(inp,ua.data.x6select);
}
- //console.log("Type validation complete, returning true");
- //console.groupEnd();
+ x6.console.log("Type validation complete, returning true");
+ x6.console.groupEnd();
return true;
}
@@ -622,16 +742,16 @@
// original behavior.
if(inp==first && e.shiftKey) {
var str ='[xTabGroup='+tg+']:not([disabled]):last';
- //console.log(str);
+ x6.console.log(str);
$(str).focus();
- //console.log("First input, hit shift, going to last");
- //console.groupEnd();
+ x6.console.log("First input, hit shift, going to last");
+ x6.console.groupEnd();
return false;
}
if(inp==last && !e.shiftKey) {
$('[xTabGroup='+tg+']:not([disabled]):first').focus();
- //console.log("Last input, no shift, going to first");
- //console.groupEnd();
+ x6.console.log("Last input, no shift, going to first");
+ x6.console.groupEnd();
return false;
}
@@ -640,8 +760,8 @@
// we have to work out the next control to give focus
// to, either forward or backward
if(isTab) {
- //console.log("Tab key hit, returning true");
- //console.groupEnd();
+ x6.console.log("Tab key hit, returning true");
+ x6.console.groupEnd();
return true;
}
if(!e.shiftKey) {
@@ -650,8 +770,8 @@
var foundMe = false;
$('[xTabGroup='+tg+']:not([disabled])').each(
function() {
- //console.log(this.id);
- //console.log(focusTo,foundMe);
+ x6.console.log(this.id);
+ x6.console.log(focusTo,foundMe);
if(focusTo) return;
if(foundMe) {
focusTo = this.id;
@@ -660,7 +780,7 @@
}
);
if(focusTo) {
- //console.log("Setting focus forward to ",focusTo);
+ x6.console.log("Setting focus forward to ",focusTo);
$('[zActive]#'+focusTo).focus().select();
}
@@ -683,18 +803,18 @@
}
);
if(focusTo) {
- //console.log("Setting focus backward to ",focusTo);
+ x6.console.log("Setting focus backward to ",focusTo);
$('[zActive]#'+focusTo).focus().select();
}
}
- //console.log("Returning True");
- //console.groupEnd();
+ x6.console.log("Returning True");
+ x6.console.groupEnd();
return true;
},
focus: function(inp) {
- //console.group("Input focus ",inp.id);
- //console.log("Input: ",inp);
+ x6.console.group("Input focus ",inp.id);
+ x6.console.log("Input: ",inp);
this.x6select.checkForMe(inp);
inp.zSelected = 1;
inp.zOriginalValue = u.p(inp,'zOriginalValue','').trim();
@@ -703,8 +823,8 @@
if(u.p(inp,'zNew',0)==0) {
u.bb.vgfSet('lastFocus_'+u.p(inp,'xTableId'),inp.id);
}
- //console.log("Input focus DONE");
- //console.groupEnd();
+ x6.console.log("Input focus DONE");
+ x6.console.groupEnd();
return true;
},
// KFD 11/29/08, not being called anywhere?
@@ -713,13 +833,13 @@
//},
blur: function(inp) {
- //console.group("Input blur ",inp.id);
+ x6.console.group("Input blur ",inp.id);
inp.zSelected = 0;
x6inputs.setClass(inp);
x6inputs.afterBlurner(inp);
x6inputs.x6select.hide();
- //console.log("Input Blur DONE");
- //console.groupEnd();
+ x6.console.log("Input Blur DONE");
+ x6.console.groupEnd();
return true;
},
// KFD 11/29/08, not being called anywhere?
@@ -732,24 +852,24 @@
*
*/
afterBlurner: function(inp) {
- //console.group("afterBlurner");
- //console.log(inp);
+ x6.console.group("afterBlurner");
+ x6.console.log(inp);
if(u.p(inp,'inblur',false)) {
- //console.log("inblur flag set, no action");
- //console.groupEnd();
+ x6.console.log("inblur flag set, no action");
+ x6.console.groupEnd();
return false;
}
inp.inblur = true;
// If method does not exist forget it
if(!inp.afterBlur) {
- //console.log("No afterBlur(), leaving flag set and returning");
- //console.groupEnd();
+ x6.console.log("No afterBlur(), leaving flag set and returning");
+ x6.console.groupEnd();
return true;
}
// If value has changed, fire it
if(inp.lastBlurred==u.p(inp,'value','').trim()) {
- //console.log("Input lastBlurred is current value, no action");
- //console.groupEnd();
+ x6.console.log("Input lastBlurred is current value, no action");
+ x6.console.groupEnd();
inp.inblur = false;
return true;
}
@@ -759,15 +879,15 @@
// is anything particularly "valid" or correct about the
// value.
if(inp.afterBlur()) {
- //console.log("Afterblurner setting flag false, return true");
- //console.groupEnd();
+ x6.console.log("Afterblurner setting flag false, return true");
+ x6.console.groupEnd();
inp.inblur = false;
inp.lastBlurred = u.p(inp,'value','').trim();
return true;
}
else {
- //console.log("Afterblurner setting flag false, return false");
- //console.groupEnd();
+ x6.console.log("Afterblurner setting flag false, return false");
+ x6.console.groupEnd();
inp.inblur = false;
return false;
}
@@ -776,14 +896,14 @@
enable: function(inp) {
if(typeof(inp)=='string') inp = u.byId(inp);
- //console.log("Enabling input ",inp.id);
+ x6.console.log("Enabling input ",inp.id);
inp.disabled = false;
inp.zOriginalValue = u.p(inp,'value','');
this.setClass(inp);
},
disable: function(inp) {
if(typeof(inp)=='string') inp = u.byId(inp);
- //console.log("Disabling input ",inp.id);
+ x6.console.log("Disabling input ",inp.id);
inp.disabled = true;
this.setClass(inp);
},
@@ -806,8 +926,8 @@
}
ux = u.uniqueId();
- //console.group("setClass for an input "+ux);
- //console.log(inp);
+ x6.console.group("setClass for an input "+ux);
+ x6.console.log(inp);
if(u.p(inp,'zOriginalValue',null)==null) inp.zOriginalValue = '';
if(inp.value==inp.zOriginalValue) {
inp.zChanged = 0;
@@ -831,15 +951,15 @@
else if(zNew) css = 'changed';
else if(zChanged) css = 'changed';
else css = '';
- //console.log("initial class is "+css);
+ x6.console.log("initial class is "+css);
// Now pick the selected version if required
if(zSelected) css += 'Selected';
- //console.log("Final class is "+css);
+ x6.console.log("Final class is "+css);
// Now do some stuff if it is read only
//inp.disabled = zRO;
- //console.log("Read Only Decision is",inp.disabled);
+ x6.console.log("Read Only Decision is",inp.disabled);
// Flag to do the row
doRow = u.p(inp,'xClassRow',0);
@@ -847,7 +967,7 @@
// Now set the class name
inp.className = css;
if(doRow!=0) {
- //console.log('do row');
+ x6.console.log('do row');
if(zSelected) {
inp.parentNode.parentNode.className = 'selected';
}
@@ -855,12 +975,12 @@
inp.parentNode.parentNode.className = '';
}
}
- //console.groupEnd();
+ x6.console.groupEnd();
},
clearOut: function(inp) {
if(inp.zSelected==1) {
- //console.log("In clear out, blurring ",inp);
+ x6.console.log("In clear out, blurring ",inp);
inp.blur();
}
inp.disabled = true;
@@ -920,7 +1040,7 @@
var skey = u.bb.vgfGet('skey_'+table,-1);
}
if(skey==-1) return;
- console.log(table,skey);
+ x6.console.log(table,skey);
ua.json.init('x6page',table);
ua.json.addParm('x6action','viewClob');
@@ -1079,7 +1199,7 @@
var svals = u.p(input,'xValues','');
if(svals.trim()=='') return;
- //console.log(svals);
+ x6.console.log(svals);
retval = '';
var rows = svals.split('||');
for(var idx in rows) {
@@ -1089,7 +1209,7 @@
retval+= '<td>'+values[idx2];
}
}
- //console.log(retval);
+ x6.console.log(retval);
this.tbody.innerHTML = retval;
},
@@ -1183,7 +1303,7 @@
else {
if(direction == 'Up') {
var candidate = $(rowNow).prev();
- //console.log("Up candidate ",candidate);
+ x6.console.log("Up candidate ",candidate);
var rowsBelow = $(rowNow).nextAll().length;
if(rowsBelow > 5) {
var stNow = $('.x6select tbody').scrollTop();
@@ -1192,15 +1312,15 @@
}
else {
var candidate = $(rowNow).next();
- //console.log("Down candidate ",candidate);
+ x6.console.log("Down candidate ",candidate);
var rowsAbove = $(rowNow).prevAll().length;
if(rowsAbove > 5) {
var stNow = $('.x6select tbody').scrollTop();
$(jqBody).scrollTop(stNow + this.lineHeight + 3);
}
}
- //console.log("row now ",rowNow);
- //console.log(direction);
+ x6.console.log("row now ",rowNow);
+ x6.console.log(direction);
if (candidate.length > 0) $(candidate[0].firstChild).mouseover();
}
}
@@ -1258,6 +1378,36 @@
return x6events.fireEvent('reqSaveRow_'+this.zTable);
}
},
+ buttonCustom: function(self,id,table) {
+ self.zTable = table;
+ // This is sort of the same as the predefined buttons
+ x6plugins.buttonStandard(self,id,u.p(self,'buttonKey'));
+
+ // This is special for custom buttons
+ x6events.subscribeToEvent('buttonsOn_'+table,id);
+ self['receiveEvent_buttonsOn_'+table] = function() {
+ var skey = u.bb.vgfGet('skey_'+this.zTable);
+ var doit = false;
+ if(skey==0) {
+ doit = u.p(this,'permins','N')=='Y';
+ }
+ else {
+ doit = u.p(this,'permupd','N')=='Y';
+ }
+ if(doit...
[truncated message content] |
|
From: <ken...@us...> - 2008-12-26 17:58:06
|
Revision: 1008
http://andro.svn.sourceforge.net/andro/?rev=1008&view=rev
Author: kendowns
Date: 2008-12-26 17:58:03 +0000 (Fri, 26 Dec 2008)
Log Message:
-----------
Three bug fixes
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-24 17:04:00 UTC (rev 1007)
+++ trunk/andro/clib/x6.js 2008-12-26 17:58:03 UTC (rev 1008)
@@ -612,7 +612,7 @@
// you do not see an input's new value until the keyup
// event. You do not see it in keypress or keydown.
keyUp: function(e,inp) {
- x6.x6.console.group("Input keyUp");
+ x6.console.group("Input keyUp");
x6.console.log(e);
x6.console.log(inp);
@@ -2190,6 +2190,10 @@
}
}
}
+
+ if(u.p(self,'x6profile')=='twosides') {
+ x6events.fireEvent('buttonsNew_'+table);
+ }
}
x6tabDiv = {
@@ -3515,7 +3519,7 @@
var pieces = kids[kid].split(':');
var table_chd = pieces[0];
var display = pieces[1]; // assume 'checkbox'
- var json = new androJSON('x6table',this.zTable);
+ var json = new androJSON('x6page',this.zTable);
json.addParm('skey',u.bb.vgfGet('skey_'+this.zTable));
json.addParm('table_chd',pieces[0]);
json.addParm('x6action' ,'child_checkbox');
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-26 22:33:01
|
Revision: 1018
http://andro.svn.sourceforge.net/andro/?rev=1018&view=rev
Author: kendowns
Date: 2008-12-26 22:32:58 +0000 (Fri, 26 Dec 2008)
Log Message:
-----------
In select drop-downs, null values are made spaces.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-26 20:32:17 UTC (rev 1017)
+++ trunk/andro/clib/x6.js 2008-12-26 22:32:58 UTC (rev 1018)
@@ -1287,7 +1287,12 @@
retval += '<tr>';
var values = rows[idx];
for(var idx2 in values) {
- retval+= '<td>'+values[idx2];
+ if(values[idx2] == null) {
+ retval+= '<td> ';
+ }
+ else {
+ retval+= '<td>'+values[idx2];
+ }
}
}
var lh = this.lineHeight + 3;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-29 16:07:05
|
Revision: 1026
http://andro.svn.sourceforge.net/andro/?rev=1026&view=rev
Author: kendowns
Date: 2008-12-29 16:07:01 +0000 (Mon, 29 Dec 2008)
Log Message:
-----------
IE Compatibility: removed stray comma that messes up IE.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-29 16:06:07 UTC (rev 1025)
+++ trunk/andro/clib/x6.js 2008-12-29 16:07:01 UTC (rev 1026)
@@ -242,7 +242,7 @@
console[fnname](x1,x2,x3,x4,x5,x6);
else
console[fnname](x1,x2,x3,x4,x5,x6,x7);
- },
+ }
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ken...@us...> - 2008-12-30 17:10:22
|
Revision: 1034
http://andro.svn.sourceforge.net/andro/?rev=1034&view=rev
Author: kendowns
Date: 2008-12-30 17:10:19 +0000 (Tue, 30 Dec 2008)
Log Message:
-----------
Small fix to IE-compatibility for event handling.
Modified Paths:
--------------
trunk/andro/clib/x6.js
Modified: trunk/andro/clib/x6.js
===================================================================
--- trunk/andro/clib/x6.js 2008-12-30 16:38:31 UTC (rev 1033)
+++ trunk/andro/clib/x6.js 2008-12-30 17:10:19 UTC (rev 1034)
@@ -75,7 +75,7 @@
$(document).keypress(function(e) {
//e = e ? e : window.event;
x6.console.group("Document Keypress");
- x6.console.log("keypress ",e);
+ x6.console.log("Here is keypress event: ",e);
var retval= x6.keyDispatcher(e);
x6.console.groupEnd();
return retval;
@@ -444,7 +444,7 @@
subscribeToEvent: function(eventName,id) {
x6.console.group("subscribeToEvent "+eventName);
x6.console.log("event name: ",eventName)
- x6.console.log("id subscbr: ",id);
+ x6.console.log("id subscriber: ",id);
if(id=='undefined') {
u.error('x6events.subscribeToEvent. Second parameter '
+' undefined. First parameter: '+eventName
@@ -538,11 +538,16 @@
x6.console.log('arguments: ',arguments);
// Find out if anybody is listening for this event
var subscribers = this.getSubscribers(eventName);
+ if(subscribers.length==0) {
+ x6.console.log("No subscribers to this event, no action");
+ x6.console.groupEnd();
+ return;
+ }
// loop through subscribers. Note at the bottom of the list
// that if an event handler returns false we must stop.
this.retvals[eventName] = true;
- for(var x=0; x<(subscribers.length-1);x++) {
+ for(var x=0; x<subscribers.length;x++) {
var id = subscribers[x];
x6.console.log("type of id: ",typeof(id));
x6.console.log("subscriber: ",id);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|