[open-ils-commits] r13914 - branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget (erickson)
svn at svn.open-ils.org
svn at svn.open-ils.org
Fri Aug 21 11:34:01 EDT 2009
Author: erickson
Date: 2009-08-21 11:33:58 -0400 (Fri, 21 Aug 2009)
New Revision: 13914
Added:
branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/PCrudFilterDialog.js
Modified:
branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js
branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoGrid.js
Log:
more work on pcrud filter dialog. added filter option to autogrid. repaired faulty linked object caching in autogrid. with caching repaired, made linked grid cell data fetching synchronous to prevent excessive network requests (1st instance of an object is cached)
Modified: branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js
===================================================================
--- branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js 2009-08-21 15:33:02 UTC (rev 13913)
+++ branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js 2009-08-21 15:33:58 UTC (rev 13914)
@@ -9,8 +9,6 @@
dojo.declare('openils.widget.AutoFieldWidget', null, {
async : false,
- cache : {},
- cacheSingle : {},
/**
* args:
@@ -48,9 +46,10 @@
this.fmClass + ' fmField=' + this.fmField + ' fmObject=' + js2JSON(this.fmObject));
this.auth = openils.User.authtoken;
- if(!this.cache[this.auth]) {
- this.cache[this.auth] = {};
- }
+ this.cache = openils.widget.AutoFieldWidget.cache;
+ this.cache[this.auth] = this.cache[this.auth] || {};
+ this.cache[this.auth].single = this.cache[this.auth].single || {};
+ this.cache[this.auth].list = this.cache[this.auth].list || {};
},
/**
@@ -217,8 +216,8 @@
// first try the store cache
var self = this;
- if(this.cache[this.auth][lclass]) {
- var store = this.cache[this.auth][lclass];
+ if(this.cache[this.auth].list[lclass]) {
+ var store = this.cache[this.auth].list[lclass];
var query = {};
query[linkInfo.vfield.name] = ''+this.widgetValue;
store.fetch({query:query, onComplete:
@@ -230,11 +229,13 @@
}
// then try the single object cache
- if(this.cacheSingle[lclass] && this.cacheSingle[lclass][this.widgetValue]) {
- this.widgetValue = this.cacheSingle[lclass][this.widgetValue];
+ if(this.cache[this.auth].single[lclass] && this.cache[this.auth].single[lclass][this.widgetValue]) {
+ this.widgetValue = this.cache[this.auth].single[lclass][this.widgetValue];
return;
}
+ console.log("Fetching sync object " + lclass + " : " + this.widgetValue);
+
// if those fail, fetch the linked object
this.async = true;
var self = this;
@@ -242,10 +243,13 @@
async : !this.forceSync,
oncomplete : function(r) {
var item = openils.Util.readResponse(r);
- if(!self.cacheSingle[lclass])
- self.cacheSingle[lclass] = {};
- self.widgetValue = item[linkInfo.vfield.selector]();
- self.cacheSingle[lclass][self.widgetValue] = item;
+ var newvalue = item[linkInfo.vfield.selector]();
+
+ if(!self.cache[self.auth].single[lclass])
+ self.cache[self.auth].single[lclass] = {};
+ self.cache[self.auth].single[lclass][self.widgetValue] = newvalue;
+
+ self.widgetValue = newvalue;
self.widget.startup();
self._widgetLoaded();
}
@@ -306,15 +310,15 @@
if(list) {
self.widget.store =
new dojo.data.ItemFileReadStore({data:fieldmapper[linkClass].toStoreData(list)});
- self.cache[self.auth][linkClass] = self.widget.store;
+ self.cache[self.auth].list[linkClass] = self.widget.store;
} else {
- self.widget.store = self.cache[self.auth][linkClass];
+ self.widget.store = self.cache[self.auth].list[linkClass];
}
self.widget.startup();
self._widgetLoaded();
};
- if(this.cache[self.auth][linkClass]) {
+ if(this.cache[self.auth].list[linkClass]) {
oncomplete();
} else {
@@ -452,5 +456,6 @@
});
openils.widget.AutoFieldWidget.localeStrings = dojo.i18n.getLocalization("openils.widget", "AutoFieldWidget");
+ openils.widget.AutoFieldWidget.cache = {};
}
Modified: branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoGrid.js
===================================================================
--- branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoGrid.js 2009-08-21 15:33:02 UTC (rev 13913)
+++ branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/AutoGrid.js 2009-08-21 15:33:58 UTC (rev 13914)
@@ -26,6 +26,7 @@
displayLimit : 15,
displayOffset : 0,
showPaginator : false,
+ showLoadFilter : false,
suppressLinkedFields : null, // list of fields whose linked display data should not be fetched from the server
/* by default, don't show auto-generated (sequence) fields */
@@ -78,7 +79,7 @@
var back = dojo.create('a', {
- innerHTML : 'Back',
+ innerHTML : 'Back', // TODO i18n
style : 'padding-right:6px;',
href : 'javascript:void(0);',
onclick : function() {
@@ -92,7 +93,7 @@
});
var forw = dojo.create('a', {
- innerHTML : 'Next',
+ innerHTML : 'Next', // TODO i18n
style : 'padding-right:6px;',
href : 'javascript:void(0);',
onclick : function() {
@@ -108,8 +109,31 @@
dojo.place(this.paginator.domNode, this.domNode, 'before');
dojo.place(back, this.paginator.domNode);
dojo.place(forw, this.paginator.domNode);
+
+ if(this.showLoadFilter) {
+ dojo.require('openils.widget.PCrudFilterDialog');
+ dojo.place(
+ dojo.create('a', {
+ innerHTML : 'Filter', // TODO i18n
+ style : 'padding-right:6px;',
+ href : 'javascript:void(0);',
+ onclick : function() {
+ var dialog = new openils.widget.PCrudFilterDialog({fmClass:self.fmClass})
+ dialog.onApply = function(filter) {
+ self.resetStore();
+ self.loadAll(self.cachedQueryOpts, filter);
+ };
+ dialog.startup();
+ dialog.show();
+ }
+ }),
+ this.paginator.domNode
+ );
+ }
+
+ // progress image
this.loadProgressIndicator = dojo.create('img', {
- src:'/opac/images/progressbar_green.gif',
+ src:'/opac/images/progressbar_green.gif', // TODO configured path
style:'height:16px;width:16px;'
});
dojo.place(this.loadProgressIndicator, this.paginator.domNode);
@@ -540,18 +564,25 @@
fmField: this.field,
widgetValue : val,
readOnly : true,
+ forceSync : true, // prevents many simultaneous requests for the same data
suppressLinkedFields : this.grid.suppressLinkedFields
});
+ autoWidget.build();
+
+ /*
+ // With proper caching, this should not be necessary to prevent grid render flickering
var _this = this;
autoWidget.build(
function(w, ww) {
- var node = _this.grid.getCell(_this.index).view.getCellNode(rowIndex, _this.index);
- if(node) {
- node.innerHTML = ww.getDisplayString();
- }
+ try {
+ var node = _this.grid.getCell(_this.index).view.getCellNode(rowIndex, _this.index);
+ if(node)
+ node.innerHTML = ww.getDisplayString();
+ } catch(E) {}
}
);
+ */
return autoWidget.getDisplayString();
}
Added: branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/PCrudFilterDialog.js
===================================================================
--- branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/PCrudFilterDialog.js (rev 0)
+++ branches/rel_1_6/Open-ILS/web/js/dojo/openils/widget/PCrudFilterDialog.js 2009-08-21 15:33:58 UTC (rev 13914)
@@ -0,0 +1,128 @@
+
+if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
+ dojo.provide('openils.widget.PCrudFilterDialog');
+ dojo.require('openils.widget.AutoFieldWidget');
+ dojo.require('dijit.form.FilteringSelect');
+ dojo.require('dijit.form.Button');
+ dojo.require('dojo.data.ItemFileReadStore');
+ dojo.require('dijit.Dialog');
+ dojo.require('openils.Util');
+
+ /**
+ * Given a fieldmapper object, this builds a pop-up dialog used for editing the object
+ */
+
+ dojo.declare(
+ 'openils.widget.PCrudFilterDialog',
+ [dijit.Dialog, openils.widget.AutoWidget],
+ {
+
+ constructor : function(args) {
+ for(var k in args)
+ this[k] = args[k];
+ this.widgetIndex = 0;
+ this.widgetCache = {};
+ },
+
+ /**
+ * Builds a basic table of key / value pairs. Keys are IDL display labels.
+ * Values are dijit's, when values set
+ */
+ startup : function() {
+ var self = this;
+ this.inherited(arguments);
+ this.initAutoEnv();
+ var realFieldList = this.sortedFieldList.filter(
+ function(item) { return !item.virtual; });
+ this.fieldStore = new dojo.data.ItemFileReadStore({
+ data : {
+ identifier : 'name',
+ name : 'label',
+ items : realFieldList.map(
+ function(item) {
+ return {label:item.label, name:item.name};
+ }
+ )
+ }
+ });
+
+ // TODO i18n/CSS
+ dojo.place(
+ dojo.create(
+ 'div',
+ {innerHTML:'Filter Selector', style:'text-align:center;width:100%;padding:10px;'}
+ ), this.domNode);
+
+ dojo.place(
+ new dijit.form.Button({
+ label:"Apply",
+ onClick : function() {
+ if(self.onApply)
+ self.onApply(self.compileFilter());
+ self.hide();
+ }
+ }).domNode, this.domNode);
+
+ dojo.place(
+ new dijit.form.Button({
+ label:"Cancel",
+ onClick : function() {
+ if(self.onCancel)
+ self.onCancel();
+ self.hide();
+ }
+ }).domNode, this.domNode);
+
+ this.table = dojo.place(dojo.create('table'), this.domNode);
+ openils.Util.addCSSClass(this.table, 'oils-fm-edit-dialog');
+ this.insertFieldSelector();
+ },
+
+ insertFieldSelector : function() {
+ var selector = new dijit.form.FilteringSelect({labelAttr:'label', store:this.fieldStore});
+ var row = dojo.place(dojo.create('tr'), this.table);
+ var selectorTd = dojo.place(dojo.create('td'), row);
+ var valueTd = dojo.place(dojo.create('td'), row);
+ dojo.place(selector.domNode, selectorTd);
+
+ // dummy text box
+ dojo.place(new dijit.form.TextBox().domNode, valueTd);
+
+ // when a field is selected, update the value widget
+ var self = this;
+ dojo.connect(selector, 'onChange',
+ function(value) {
+
+ if(valueTd.childNodes[0])
+ valueTd.removeChild(valueTd.childNodes[0]);
+
+ var widget = new openils.widget.AutoFieldWidget({
+ fmClass : self.fmClass,
+ fmField : value,
+ parentNode : dojo.place(dojo.create('div'), valueTd)
+ });
+ widget.build();
+
+ if(self.widgetCache[selector.widgetIndex]) {
+ self.widgetCache[selector.widgetIndex].widget.destroy();
+ delete self.widgetCache[selector.widgetIndex];
+ }
+
+ selector.widgetIndex = this.widgetIndex;
+ self.widgetCache[self.widgetIndex++] = widget;
+ }
+ );
+ },
+
+ compileFilter : function() {
+ var filter = {};
+ for(var i in this.widgetCache) {
+ var widget = this.widgetCache[i];
+ filter[widget.fmField] = widget.getFormattedValue();
+ }
+ return filter;
+ }
+ }
+ );
+}
+
More information about the open-ils-commits
mailing list