From: erickson Date: Fri, 12 Nov 2010 19:51:26 +0000 (+0000) Subject: Back-port of 18712 and related changes: Server-generated IDL JS X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=ebbf468e494d886ceb916f370fa1f6ebbcfef33c;p=evergreen%2Fjoelewis.git Back-port of 18712 and related changes: Server-generated IDL JS The goal is to reduce use of pre-onload XHR, which is known to cause problems (dreaded white-screen-of-death) in firefox/xulrunner. Change allows opac, staff client, and embedded browser interfaces to load a pre-formatted JS object instead of IDL XML via XHR. In addition to dropping the XHR, clients no longer parse the XML, which should reduce page render time. Finally, in the staff interfaces, the full IDL is once again loaded, so there is no need to specifiy per-page classes. Per-page classes are still supported and used in the OPAC to reduce the up-front load time. Change requires an update to the Evergreen Apache config. Part of this change included condensing fieldmapper.hash and fielmapper.dojoData content into fieldmapper.Fieldmapper to avoid circular dependencies, which was causing problems with IE. Will eventually want to deprecate .hash and .dojoData, but for now they still function as before. git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_2_0@18717 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/examples/apache/eg_vhost.conf b/Open-ILS/examples/apache/eg_vhost.conf index da947e0b45..7d4933b35e 100644 --- a/Open-ILS/examples/apache/eg_vhost.conf +++ b/Open-ILS/examples/apache/eg_vhost.conf @@ -565,3 +565,27 @@ RewriteRule ^/openurl$ ${openurl:%1} [NE,PT] CustomLog /var/log/apache2/deflate_log deflate + + + + SetHandler perl-script + PerlHandler OpenILS::WWW::IDL2js + Options +ExecCGI + PerlSendHeader On + allow from all + + + Header append Cache-Control "public" + + + + SetOutputFilter DEFLATE + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html + SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary + + Header append Vary User-Agent env=!dont-vary + + + diff --git a/Open-ILS/examples/apache/startup.pl b/Open-ILS/examples/apache/startup.pl index 378aaa3174..a76505e290 100755 --- a/Open-ILS/examples/apache/startup.pl +++ b/Open-ILS/examples/apache/startup.pl @@ -7,6 +7,7 @@ use OpenILS::WWW::Proxy ('/openils/conf/opensrf_core.xml'); use OpenILS::WWW::Vandelay qw( /openils/conf/opensrf_core.xml ); use OpenILS::WWW::EGWeb ('/openils/conf/oils_web.xml'); use OpenILS::WWW::PasswordReset ('/openils/conf/opensrf_core.xml'); +use OpenILS::WWW::IDL2js ('/openils/conf/opensrf_core.xml'); # - Uncoment the following 2 lines to make use of the IP redirection code # - The IP file should to contain a map with the following format: diff --git a/Open-ILS/examples/opensrf.xml.example b/Open-ILS/examples/opensrf.xml.example index 74c28a1cf8..bf1776203a 100644 --- a/Open-ILS/examples/opensrf.xml.example +++ b/Open-ILS/examples/opensrf.xml.example @@ -31,6 +31,8 @@ vim:et:ts=4:sw=4: SYSCONFDIR/fm_IDL.xml + fm_IDL2js.xsl + prefork diff --git a/Open-ILS/src/perlmods/OpenILS/WWW/IDL2js.pm b/Open-ILS/src/perlmods/OpenILS/WWW/IDL2js.pm new file mode 100644 index 0000000000..ee5b2ef255 --- /dev/null +++ b/Open-ILS/src/perlmods/OpenILS/WWW/IDL2js.pm @@ -0,0 +1,79 @@ +package OpenILS::WWW::IDL2js; +use strict; use warnings; +use XML::LibXML; +use XML::LibXSLT; +use Apache2::Const -compile => qw(OK DECLINED HTTP_INTERNAL_SERVER_ERROR); +use Error qw/:try/; +use OpenSRF::System; +use OpenSRF::Utils::SettingsClient; + +my $bs_config; +my $stylesheet; +my $idl_doc; + + +# load and parse the stylesheet +sub import { + my $self = shift; + $bs_config = shift; +} + +# parse the IDL, loaded from the network +my $__initted = 0; +sub child_init { + $__initted = 1; + + OpenSRF::System->bootstrap_client(config_file => $bs_config); + my $sclient = OpenSRF::Utils::SettingsClient->new(); + + my $xsl_file = $sclient->config_value('IDL2js'); + + unless($xsl_file) { + warn "XSL2js XSL file required for IDL2js Apache module\n"; + return; + } + + $xsl_file = $sclient->config_value(dirs => 'xsl')."/$xsl_file"; + my $idl_file = $sclient->config_value("IDL"); + + my $xslt = XML::LibXSLT->new(); + + try { + + my $style_doc = XML::LibXML->load_xml(location => $xsl_file, no_cdata=>1); + $stylesheet = $xslt->parse_stylesheet($style_doc); + + } catch Error with { + my $e = shift; + warn "Invalid XSL File: $xsl_file: $e\n"; + }; + + $idl_doc = XML::LibXML->load_xml(location => $idl_file); +} + + +sub handler { + my $r = shift; + my $args = $r->args || ''; + child_init() unless $__initted; + + return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR unless $stylesheet and $idl_doc; + return Apache2::Const::DECLINED if $args and $args !~ /^[a-zA-Z,]*$/; + + my $output; + try { + my $results = $stylesheet->transform($idl_doc, class_list => "'$args'"); + $output = $stylesheet->output_as_bytes($results); + } catch Error with { + my $e = shift; + $r->log->error("IDL XSL Error: $e"); + }; + + return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR unless $output; + + $r->content_type('application/x-javascript; encoding=utf8'); + $r->print($output); + return Apache2::Const::OK; +} + +1; diff --git a/Open-ILS/web/conify/global/actor/org_unit.html b/Open-ILS/web/conify/global/actor/org_unit.html index 4f3de43130..726898b446 100644 --- a/Open-ILS/web/conify/global/actor/org_unit.html +++ b/Open-ILS/web/conify/global/actor/org_unit.html @@ -47,6 +47,7 @@ + diff --git a/Open-ILS/web/conify/global/actor/org_unit_type.html b/Open-ILS/web/conify/global/actor/org_unit_type.html index c3d4a5d9a5..4b1e843807 100644 --- a/Open-ILS/web/conify/global/actor/org_unit_type.html +++ b/Open-ILS/web/conify/global/actor/org_unit_type.html @@ -49,6 +49,7 @@ + @@ -381,7 +382,7 @@ { parent : current_type, attribute : 'children' } ); }, - }).send(); + }); if (!err) { highlighter.editor_pane.green.play(); diff --git a/Open-ILS/web/conify/global/config/copy_status.html b/Open-ILS/web/conify/global/config/copy_status.html index ef100ca476..943fd24cbf 100644 --- a/Open-ILS/web/conify/global/config/copy_status.html +++ b/Open-ILS/web/conify/global/config/copy_status.html @@ -50,6 +50,7 @@ + diff --git a/Open-ILS/web/conify/global/config/marc_code_maps.html b/Open-ILS/web/conify/global/config/marc_code_maps.html index ccc9881e6b..9a8bbb0ad8 100644 --- a/Open-ILS/web/conify/global/config/marc_code_maps.html +++ b/Open-ILS/web/conify/global/config/marc_code_maps.html @@ -50,6 +50,7 @@ + diff --git a/Open-ILS/web/conify/global/permission/grp_tree.html b/Open-ILS/web/conify/global/permission/grp_tree.html index c70a4406e2..aa74425c64 100644 --- a/Open-ILS/web/conify/global/permission/grp_tree.html +++ b/Open-ILS/web/conify/global/permission/grp_tree.html @@ -60,6 +60,7 @@ + diff --git a/Open-ILS/web/conify/global/permission/perm_list.html b/Open-ILS/web/conify/global/permission/perm_list.html index 76bd62731f..680cf6104f 100644 --- a/Open-ILS/web/conify/global/permission/perm_list.html +++ b/Open-ILS/web/conify/global/permission/perm_list.html @@ -50,6 +50,7 @@ + @@ -58,6 +59,7 @@ + diff --git a/Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js b/Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js index f629f6d710..786ae42405 100644 --- a/Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js +++ b/Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js @@ -16,6 +16,11 @@ */ if(!dojo._hasResource["fieldmapper.Fieldmapper"]){ + dojo._hasResource["fieldmapper.Fieldmapper"] = true; + + dojo.provide("fieldmapper.Fieldmapper"); + dojo.require("DojoSRF"); + /* generate fieldmapper javascript classes. This expects a global variable called 'fmclasses' to be fleshed with the classes we need to build */ @@ -23,11 +28,6 @@ if(!dojo._hasResource["fieldmapper.Fieldmapper"]){ function FMEX(message) { this.message = message; } FMEX.toString = function() { return "FieldmapperException: " + this.message + "\n"; } - - dojo._hasResource["fieldmapper.Fieldmapper"] = true; - dojo.provide("fieldmapper.Fieldmapper"); - dojo.require("DojoSRF"); - dojo.declare( "fieldmapper.Fieldmapper", null, { constructor : function (initArray) { @@ -88,17 +88,10 @@ if(!dojo._hasResource["fieldmapper.Fieldmapper"]){ } return; } - - - -/* - isnew : function(n) { if(arguments.length == 1) this.a[0] =n; return this.a[0]; }, - ischanged : function(n) { if(arguments.length == 1) this.a[1] =n; return this.a[1]; }, - isdeleted : function(n) { if(arguments.length == 1) this.a[2] =n; return this.a[2]; } -*/ }); + fieldmapper.vivicateClass = function (cl) { dojo.provide( cl ); dojo.declare( cl , fieldmapper.Fieldmapper, { @@ -128,10 +121,13 @@ if(!dojo._hasResource["fieldmapper.Fieldmapper"]){ } }); + fieldmapper[cl] = window[cl]; // alias into place - if (fieldmapper.IDL && fieldmapper.IDL.loaded) fieldmapper[cl].Identifier = fieldmapper.IDL.fmclasses[cl].pkey; - if (dojo._hasResource['fieldmapper.dojoData'] && dojo.filter(['aou','aout','pgt'], function(x){return x == cl}).length == 0) { + if (fieldmapper.IDL && fieldmapper.IDL.loaded) + fieldmapper[cl].Identifier = fieldmapper.IDL.fmclasses[cl].pkey; + + //if (dojo.filter(['aou','aout','pgt'], function(x){return x == cl}).length == 0) { fieldmapper[cl].prototype.fromStoreItem = _fromStoreItem; fieldmapper[cl].toStoreData = _toStoreData; fieldmapper[cl].toStoreItem = _toStoreItem; @@ -139,46 +135,11 @@ if(!dojo._hasResource["fieldmapper.Fieldmapper"]){ fieldmapper[cl].initStoreData = _initStoreData; fieldmapper[cl].prototype.toHash = _toHash; fieldmapper[cl].toHash = _toHash; - } - + fieldmapper[cl].prototype.fromHash = _fromHash; + fieldmapper[cl].fromHash = _fromHash; + //} }; - if (!window.fmclasses) dojo.require("fieldmapper.fmall", true); - for( var cl in fmclasses ) { - fieldmapper.vivicateClass(cl); - } - - // if we were NOT called by the IDL loader ... - // XXX This is now deprecated in preference to fieldmapper.AutoIDL - if ( !(fieldmapper.IDL && fieldmapper.IDL.loaded) ) { - - fieldmapper.cmsa.Identifier = 'alias'; - fieldmapper.cmc.Identifier = 'name'; - fieldmapper.i18n_l.Identifier = 'code'; - fieldmapper.ccpbt.Identifier = 'code'; - fieldmapper.ccnbt.Identifier = 'code'; - fieldmapper.cbrebt.Identifier = 'code'; - fieldmapper.cubt.Identifier = 'code'; - fieldmapper.ccm.Identifier = 'code'; - fieldmapper.cvrfm.Identifier = 'code'; - fieldmapper.clm.Identifier = 'code'; - fieldmapper.cam.Identifier = 'code'; - fieldmapper.cifm.Identifier = 'code'; - fieldmapper.citm.Identifier = 'code'; - fieldmapper.cblvl.Identifier = 'code'; - fieldmapper.clfm.Identifier = 'code'; - fieldmapper.mous.Identifier = 'usr'; - fieldmapper.moucs.Identifier = 'usr'; - fieldmapper.mucs.Identifier = 'usr'; - fieldmapper.mus.Identifier = 'usr'; - fieldmapper.rxbt.Identifier = 'xact'; - fieldmapper.rxpt.Identifier = 'xact'; - fieldmapper.cxt.Identifier = 'name'; - fieldmapper.amtr.Identifier = 'matchpoint'; - fieldmapper.coust.Identifier = 'name'; - - } - fieldmapper._request = function ( meth, staff, params ) { var ses = OpenSRF.CachedClientSession( meth[0] ); if (!ses) return null; @@ -246,89 +207,178 @@ if(!dojo._hasResource["fieldmapper.Fieldmapper"]){ have a staff counterpart and should have ".staff" appended to the method before the method is called when in XUL mode */ fieldmapper.OpenSRF.methods = { - SEARCH_MRS : ['open-ils.search','open-ils.search.metabib.multiclass',true], - SEARCH_RS : ['open-ils.search','open-ils.search.biblio.multiclass',true], - SEARCH_MRS_QUERY : ['open-ils.search','open-ils.search.metabib.multiclass.query',true], - SEARCH_RS_QUERY : ['open-ils.search','open-ils.search.biblio.multiclass.query',true], - FETCH_SEARCH_RIDS : ['open-ils.search','open-ils.search.biblio.record.class.search',true], - FETCH_MRMODS : ['open-ils.search','open-ils.search.biblio.metarecord.mods_slim.retrieve'], - FETCH_MODS_FROM_COPY : ['open-ils.search','open-ils.search.biblio.mods_from_copy'], - FETCH_MR_COPY_COUNTS : ['open-ils.search','open-ils.search.biblio.metarecord.copy_count',true], - FETCH_RIDS : ['open-ils.search','open-ils.search.biblio.metarecord_to_records',true], - FETCH_RMODS : ['open-ils.search','open-ils.search.biblio.record.mods_slim.retrieve'], - FETCH_R_COPY_COUNTS : ['open-ils.search','open-ils.search.biblio.record.copy_count',true], - FETCH_FLESHED_USER : ['open-ils.actor','open-ils.actor.user.fleshed.retrieve'], - FETCH_SESSION : ['open-ils.auth','open-ils.auth.session.retrieve'], - LOGIN_INIT : ['open-ils.auth','open-ils.auth.authenticate.init'], - LOGIN_COMPLETE : ['open-ils.auth','open-ils.auth.authenticate.complete'], - LOGIN_DELETE : ['open-ils.auth','open-ils.auth.session.delete'], - FETCH_USER_PREFS : ['open-ils.actor','open-ils.actor.patron.settings.retrieve'], - UPDATE_USER_PREFS : ['open-ils.actor','open-ils.actor.patron.settings.update'], - FETCH_COPY_STATUSES : ['open-ils.search','open-ils.search.config.copy_status.retrieve.all'], - FETCH_COPY_COUNTS_SUMMARY : ['open-ils.search','open-ils.search.biblio.copy_counts.summary.retrieve'], - FETCH_MARC_HTML : ['open-ils.search','open-ils.search.biblio.record.html'], - FETCH_CHECKED_OUT_SUM : ['open-ils.actor','open-ils.actor.user.checked_out'], - FETCH_HOLDS : ['open-ils.circ','open-ils.circ.holds.retrieve'], - FETCH_FINES_SUMMARY : ['open-ils.actor','open-ils.actor.user.fines.summary'], - FETCH_TRANSACTIONS : ['open-ils.actor','open-ils.actor.user.transactions.have_charge.fleshed'], - FETCH_MONEY_BILLING : ['open-ils.circ','open-ils.circ.money.billing.retrieve.all'], - FETCH_CROSSREF : ['open-ils.search','open-ils.search.authority.crossref'], - FETCH_CROSSREF_BATCH : ['open-ils.search','open-ils.search.authority.crossref.batch'], - CREATE_HOLD : ['open-ils.circ','open-ils.circ.holds.create'], - CREATE_HOLD_OVERRIDE : ['open-ils.circ','open-ils.circ.holds.create.override'], - CANCEL_HOLD : ['open-ils.circ','open-ils.circ.hold.cancel'], - UPDATE_USERNAME : ['open-ils.actor','open-ils.actor.user.username.update'], - UPDATE_PASSWORD : ['open-ils.actor','open-ils.actor.user.password.update'], - UPDATE_EMAIL : ['open-ils.actor','open-ils.actor.user.email.update'], - RENEW_CIRC : ['open-ils.circ','open-ils.circ.renew'], - CHECK_SPELL : ['open-ils.search','open-ils.search.spellcheck'], - FETCH_REVIEWS : ['open-ils.search','open-ils.search.added_content.review.retrieve.all'], - FETCH_TOC : ['open-ils.search','open-ils.search.added_content.toc.retrieve'], - FETCH_ACONT_SUMMARY : ['open-ils.search','open-ils.search.added_content.summary.retrieve'], - FETCH_USER_BYBARCODE : ['open-ils.actor','open-ils.actor.user.fleshed.retrieve_by_barcode'], - FETCH_ADV_MARC_MRIDS : ['open-ils.search','open-ils.search.biblio.marc',true], - FETCH_ADV_ISBN_RIDS : ['open-ils.search','open-ils.search.biblio.isbn'], - FETCH_ADV_ISSN_RIDS : ['open-ils.search','open-ils.search.biblio.issn'], - FETCH_ADV_TCN_RIDS : ['open-ils.search','open-ils.search.biblio.tcn'], - FETCH_CNBROWSE : ['open-ils.search','open-ils.search.callnumber.browse'], - FETCH_CONTAINERS : ['open-ils.actor','open-ils.actor.container.retrieve_by_class'], - FETCH_CONTAINERS : ['open-ils.actor','open-ils.actor.container.retrieve_by_class'], - CREATE_CONTAINER : ['open-ils.actor','open-ils.actor.container.create'], - DELETE_CONTAINER : ['open-ils.actor','open-ils.actor.container.full_delete'], - CREATE_CONTAINER_ITEM : ['open-ils.actor','open-ils.actor.container.item.create'], - DELETE_CONTAINER_ITEM : ['open-ils.actor','open-ils.actor.container.item.delete'], - FLESH_CONTAINER : ['open-ils.actor','open-ils.actor.container.flesh'], - FLESH_PUBLIC_CONTAINER : ['open-ils.actor','open-ils.actor.container.public.flesh'], - UPDATE_CONTAINER : ['open-ils.actor','open-ils.actor.container.update'], - FETCH_COPY : ['open-ils.search','open-ils.search.asset.copy.retrieve'], - FETCH_FLESHED_COPY : ['open-ils.search','open-ils.search.asset.copy.fleshed2.retrieve'], - CHECK_HOLD_POSSIBLE : ['open-ils.circ','open-ils.circ.title_hold.is_possible'], - UPDATE_HOLD : ['open-ils.circ','open-ils.circ.hold.update'], - FETCH_COPIES_FROM_VOLUME : ['open-ils.search','open-ils.search.asset.copy.retrieve_by_cn_label',true], - FETCH_VOLUME_BY_INFO : ['open-ils.search','open-ils.search.call_number.retrieve_by_info'], /* XXX staff method? */ - FETCH_VOLUME : ['open-ils.search','open-ils.search.asset.call_number.retrieve'], - FETCH_COPY_LOCATIONS : ['open-ils.circ','open-ils.circ.copy_location.retrieve.all'], - FETCH_COPY_NOTES : ['open-ils.circ','open-ils.circ.copy_note.retrieve.all'], - FETCH_COPY_STAT_CATS : ['open-ils.circ','open-ils.circ.asset.stat_cat_entries.fleshed.retrieve_by_copy'], - FETCH_LIT_FORMS : ['open-ils.search','open-ils.search.biblio.lit_form_map.retrieve.all'], - FETCH_ITEM_FORMS : ['open-ils.search','open-ils.search.biblio.item_form_map.retrieve.all'], - FETCH_ITEM_TYPES : ['open-ils.search','open-ils.search.biblio.item_type_map.retrieve.all'], - FETCH_AUDIENCES : ['open-ils.search','open-ils.search.biblio.audience_map.retrieve.all'], - FETCH_HOLD_STATUS : ['open-ils.circ','open-ils.circ.hold.status.retrieve'], - FETCH_NON_CAT_CIRCS : ['open-ils.circ','open-ils.circ.open_non_cataloged_circulation.user'], - FETCH_NON_CAT_CIRC : ['open-ils.circ','open-ils.circ.non_cataloged_circulation.retrieve'], - FETCH_NON_CAT_TYPES : ['open-ils.circ','open-ils.circ.non_cat_types.retrieve.all'], - FETCH_BRE : ['open-ils.search','open-ils.search.biblio.record_entry.slim.retrieve'], - CHECK_USERNAME : ['open-ils.actor','open-ils.actor.username.exists'], - FETCH_CIRC_BY_ID : ['open-ils.circ','open-ils.circ.retrieve'], - FETCH_MR_DESCRIPTORS : ['open-ils.search','open-ils.search.metabib.record_to_descriptors'], - FETCH_HIGHEST_PERM_ORG : ['open-ils.actor','open-ils.actor.user.perm.highest_org.batch'], - FETCH_USER_NOTES : ['open-ils.actor','open-ils.actor.note.retrieve.all'], FETCH_ORG_BY_SHORTNAME : ['open-ils.actor','open-ils.actor.org_unit.retrieve_by_shortname'], - FETCH_BIB_ID_BY_BARCODE : ['open-ils.search','open-ils.search.bib_id.by_barcode'], FETCH_ORG_SETTING : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default'], FETCH_ORG_SETTING_BATCH : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default.batch'] }; + + + //** FROM HASH **/ + function _fromHash (_hash) { + for ( var i=0; i < this._fields.length; i++) { + if (_hash[this._fields[i]] != null) + this[this._fields[i]]( _hash[this._fields[i]] ); + } + return this; + } + + function _toHash (includeNulls, virtFields) { + var _hash = {}; + for ( var i=0; i < this._fields.length; i++) { + if (includeNulls || this[this._fields[i]]() != null) { + if (this[this._fields[i]]() == null) + _hash[this._fields[i]] = null; + else + _hash[this._fields[i]] = '' + this[this._fields[i]](); + } + } + + if (virtFields && virtFields.length > 0) { + for (var i = 0; i < virtFields.length; i++) { + if (!_hash[virtFields[i]]) + _hash[virtFields[i]] = null; + } + } + + return _hash; + } + //** FROM HASH **/ + + + /** FROM dojoData **/ + function _fromStoreItem (data) { + this.fromHash(data); + + for (var i = 0; this._ignore_fields && i < this._ignore_fields.length; i++) + this[this._ignore_fields[i]](null); + + for (var i = 0; this._fields && i < this._fields.length; i++) { + if (dojo.isArray( this[this._fields[i]]() )) + this[this._fields[i]]( this[this._fields[i]]()[0] ); + } + return this; + } + + function _initStoreData(label, params) { + if (!params) params = {}; + if (!params.identifier) params.identifier = this.Identifier; + if (!label) label = params.label; + if (!label) label = params.identifier; + return { label : label, identifier : params.identifier, items : [] }; + } + + function _toStoreItem(fmObj, params) { + if (!params) params = {}; + return fmObj.toHash(true, params.virtualFields); + } + + function _toStoreData (list, label, params) { + if (!params) params = {}; + var data = this.initStoreData(label, params); + + for (var i = 0; list && i < list.length; i++) data.items.push( list[i].toHash(true, params.virtualFields) ); + + if (params.children && params.parent) { + var _hash_list = data.items; + + var _find_root = {}; + for (var i = 0; _hash_list && i < _hash_list.length; i++) { + _find_root[_hash_list[i][params.identifier]] = _hash_list[i]; + } + + var item_data = []; + for (var i = 0; _hash_list && i < _hash_list.length; i++) { + var obj = _hash_list[i] + obj[params.children] = []; + + for (var j = 0; _hash_list && j < _hash_list.length; j++) { + var kid = _hash_list[j]; + if (kid[params.parent] == obj[params.identifier]) { + obj[params.children].push( { _reference : kid[params.identifier] } ); + kid._iskid = true; + if (_find_root[kid[params.identifier]]) delete _find_root[kid[params.identifier]]; + } + } + + item_data.push( obj ); + } + + for (var j in _find_root) { + _find_root[j]['_top'] = 'true'; + if (!_find_root[j][params.parent]) + _find_root[j]['_trueRoot'] = 'true'; + } + + data.items = item_data; + } + + return data; + } + /** FROM dojoData **/ + + + + /** ! Begin code that executes on page parse */ + + if (!window.fmclasses) dojo.require("fieldmapper.fmall", true); + for( var cl in fmclasses ) { + fieldmapper.vivicateClass(cl); + } + + // if we were NOT called by the IDL loader ... + // XXX This is now deprecated in preference to fieldmapper.AutoIDL + if ( !(fieldmapper.IDL && fieldmapper.IDL.loaded) ) { + + fieldmapper.cmsa.Identifier = 'alias'; + fieldmapper.cmc.Identifier = 'name'; + fieldmapper.i18n_l.Identifier = 'code'; + fieldmapper.ccpbt.Identifier = 'code'; + fieldmapper.ccnbt.Identifier = 'code'; + fieldmapper.cbrebt.Identifier = 'code'; + fieldmapper.cubt.Identifier = 'code'; + fieldmapper.ccm.Identifier = 'code'; + fieldmapper.cvrfm.Identifier = 'code'; + fieldmapper.clm.Identifier = 'code'; + fieldmapper.cam.Identifier = 'code'; + fieldmapper.cifm.Identifier = 'code'; + fieldmapper.citm.Identifier = 'code'; + fieldmapper.cblvl.Identifier = 'code'; + fieldmapper.clfm.Identifier = 'code'; + fieldmapper.mous.Identifier = 'usr'; + fieldmapper.moucs.Identifier = 'usr'; + fieldmapper.mucs.Identifier = 'usr'; + fieldmapper.mus.Identifier = 'usr'; + fieldmapper.rxbt.Identifier = 'xact'; + fieldmapper.rxpt.Identifier = 'xact'; + fieldmapper.cxt.Identifier = 'name'; + fieldmapper.amtr.Identifier = 'matchpoint'; + fieldmapper.coust.Identifier = 'name'; + + } + + + /** FROM dojoData **/ + /* set up some known class attributes */ + if (fieldmapper.aou) fieldmapper.aou.prototype._ignore_fields = ['children']; + if (fieldmapper.aout) fieldmapper.aout.prototype._ignore_fields = ['children']; + if (fieldmapper.pgt) fieldmapper.pgt.prototype._ignore_fields = ['children']; + + fieldmapper.aou.toStoreData = function (list, label) { + if (!label) label = 'shortname'; + return _toStoreData.call(this, list, label, { 'parent' : 'parent_ou', 'children' : 'children' }); + } + + fieldmapper.aout.toStoreData = function (list, label) { + if (!label) label = 'name'; + return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' }); + } + + fieldmapper.pgt.toStoreData = function (list, label) { + if (!label) label = 'name'; + return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' }); + } + /** FROM dojoData **/ + } diff --git a/Open-ILS/web/js/dojo/fieldmapper/IDL.js b/Open-ILS/web/js/dojo/fieldmapper/IDL.js index 91ee78d46f..97c9a1345a 100644 --- a/Open-ILS/web/js/dojo/fieldmapper/IDL.js +++ b/Open-ILS/web/js/dojo/fieldmapper/IDL.js @@ -1,4 +1,5 @@ if(!dojo._hasResource["fieldmapper.IDL"]) { + dojo._hasResource['fieldmapper.IDL'] = true; dojo.require("DojoSRF"); dojo.provide("fieldmapper.IDL"); dojo.declare('fieldmapper.IDL', null, { @@ -11,10 +12,30 @@ if(!dojo._hasResource["fieldmapper.IDL"]) { constructor : function(classlist) { + var preload = []; + if (window._preload_fieldmapper_IDL) { + if (!fieldmapper.IDL.fmclasses) fieldmapper.IDL.fmclasses = {}; + if (!window.fmclasses) window.fmclasses = {}; + + for (var c in window._preload_fieldmapper_IDL) { + preload.push(c); + fieldmapper.IDL.fmclasses[c] = window._preload_fieldmapper_IDL[c]; + + window.fmclasses[c] = []; + dojo.forEach(fieldmapper.IDL.fmclasses[c].fields, function(obj){ window.fmclasses[c].push(obj.name) }); + + if (classlist && classlist.length) + classlist = dojo.filter(classlist, function(x){return x != c;}); + } + + fieldmapper.IDL.loaded = true; + window._preload_fieldmapper_IDL = null; + } + if(!fieldmapper.IDL.fmclasses || (classlist && classlist.length)) { var idl_url = this._URL_PATH; - if (classlist.length) { + if (classlist.length > 1 || classlist[0] != '*') { idl_url += '?'; for (var i = 0; i < classlist.length; i++) { @@ -27,25 +48,32 @@ if(!dojo._hasResource["fieldmapper.IDL"]) { } } - var self = this; - dojo.xhrGet({ - url : idl_url, - handleAs : 'xml', - sync : true, - timeout : 10000, - preventCache : true, - load : function (response) { - self._parse(response); - fieldmapper.IDL.loaded = true; - }, - error : function (response) { - fieldmapper.IDL.loaded = false; - dojo.require('fieldmapper.fmall', true); - } - }); + if( !idl_url.match(/\?$/) ) { // make sure we have classes that need loading + + console.log("Fetching classes from server at " + idl_url + ':' + classlist); + + var self = this; + dojo.xhrGet({ + url : idl_url, + handleAs : 'xml', + sync : true, + timeout : 10000, + load : function (response) { + self._parse(response); + fieldmapper.IDL.loaded = true; + }, + error : function (response) { + fieldmapper.IDL.loaded = false; + dojo.require('fieldmapper.fmall', true); + } + }); + } } dojo.require('fieldmapper.Fieldmapper'); + if (preload.length) + dojo.forEach( classlist, function (c) { fieldmapper.vivicateClass(c); } ); + if (classlist && classlist.length) dojo.forEach( classlist, function (c) { fieldmapper.vivicateClass(c); } ); }, diff --git a/Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js b/Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js index b1d12be508..c548e6af57 100644 --- a/Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js +++ b/Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js @@ -20,7 +20,6 @@ if(!dojo._hasResource["fieldmapper.OrgUtils"]){ dojo._hasResource["fieldmapper.OrgUtils"] = true; dojo.provide("fieldmapper.OrgUtils"); dojo.require("fieldmapper.Fieldmapper"); - dojo.require("fieldmapper.hash"); dojo.require("fieldmapper.OrgTree", true); dojo.require("fieldmapper.OrgLasso", true); diff --git a/Open-ILS/web/js/dojo/fieldmapper/dojoData.js b/Open-ILS/web/js/dojo/fieldmapper/dojoData.js index 9b0cddd3c6..428359a6ff 100644 --- a/Open-ILS/web/js/dojo/fieldmapper/dojoData.js +++ b/Open-ILS/web/js/dojo/fieldmapper/dojoData.js @@ -19,112 +19,117 @@ if(!dojo._hasResource['fieldmapper.dojoData']){ dojo._hasResource['fieldmapper.dojoData'] = true; dojo.provide('fieldmapper.dojoData'); - dojo.require('fieldmapper.Fieldmapper'); - dojo.require('fieldmapper.hash'); + if(!dojo._hasResource["fieldmapper.Fieldmapper"]) { + + /* XXX Content loaded in Fieldmapper */ + /* XXX deprecate this file **/ + + dojo.require('fieldmapper.Fieldmapper'); + dojo.require('fieldmapper.hash'); + + function _fromStoreItem (data) { + this.fromHash(data); + + for (var i = 0; this._ignore_fields && i < this._ignore_fields.length; i++) + this[this._ignore_fields[i]](null); + + for (var i = 0; this._fields && i < this._fields.length; i++) { + if (dojo.isArray( this[this._fields[i]]() )) + this[this._fields[i]]( this[this._fields[i]]()[0] ); + } + return this; + } + + function _initStoreData(label, params) { + if (!params) params = {}; + if (!params.identifier) params.identifier = this.Identifier; + if (!label) label = params.label; + if (!label) label = params.identifier; + return { label : label, identifier : params.identifier, items : [] }; + } + + function _toStoreItem(fmObj, params) { + if (!params) params = {}; + return fmObj.toHash(true, params.virtualFields); + } + + function _toStoreData (list, label, params) { + if (!params) params = {}; + var data = this.initStoreData(label, params); + + for (var i = 0; list && i < list.length; i++) data.items.push( list[i].toHash(true, params.virtualFields) ); + + if (params.children && params.parent) { + var _hash_list = data.items; + + var _find_root = {}; + for (var i = 0; _hash_list && i < _hash_list.length; i++) { + _find_root[_hash_list[i][params.identifier]] = _hash_list[i]; + } + + var item_data = []; + for (var i = 0; _hash_list && i < _hash_list.length; i++) { + var obj = _hash_list[i] + obj[params.children] = []; + + for (var j = 0; _hash_list && j < _hash_list.length; j++) { + var kid = _hash_list[j]; + if (kid[params.parent] == obj[params.identifier]) { + obj[params.children].push( { _reference : kid[params.identifier] } ); + kid._iskid = true; + if (_find_root[kid[params.identifier]]) delete _find_root[kid[params.identifier]]; + } + } + + item_data.push( obj ); + } + + for (var j in _find_root) { + _find_root[j]['_top'] = 'true'; + if (!_find_root[j][params.parent]) + _find_root[j]['_trueRoot'] = 'true'; + } + + data.items = item_data; + } + + return data; + } + + for (var i in fmclasses) { + fieldmapper[i].prototype.fromStoreItem = _fromStoreItem; + fieldmapper[i].toStoreData = _toStoreData; + fieldmapper[i].toStoreItem = _toStoreItem; + fieldmapper[i].prototype.toStoreItem = function ( args ) { return _toStoreItem(this, args) }; + fieldmapper[i].initStoreData = _initStoreData; + } + + if (fieldmapper.aou) fieldmapper.aou.prototype._ignore_fields = ['children']; + if (fieldmapper.aout) fieldmapper.aout.prototype._ignore_fields = ['children']; + if (fieldmapper.pgt) fieldmapper.pgt.prototype._ignore_fields = ['children']; + + fieldmapper.aou.toStoreData = function (list, label) { + if (!label) label = 'shortname'; + return _toStoreData.call(this, list, label, { 'parent' : 'parent_ou', 'children' : 'children' }); + } + + fieldmapper.aout.toStoreData = function (list, label) { + if (!label) label = 'name'; + return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' }); + } + + fieldmapper.pgt.toStoreData = function (list, label) { + if (!label) label = 'name'; + return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' }); + } + + /* + ppl.toStoreData = function (list, label) { + if (!label) label = 'code'; + return _toStoreData(list, label, {}); + } + */ - function _fromStoreItem (data) { - this.fromHash(data); - - for (var i = 0; this._ignore_fields && i < this._ignore_fields.length; i++) - this[this._ignore_fields[i]](null); - - for (var i = 0; this._fields && i < this._fields.length; i++) { - if (dojo.isArray( this[this._fields[i]]() )) - this[this._fields[i]]( this[this._fields[i]]()[0] ); - } - return this; - } - - function _initStoreData(label, params) { - if (!params) params = {}; - if (!params.identifier) params.identifier = this.Identifier; - if (!label) label = params.label; - if (!label) label = params.identifier; - return { label : label, identifier : params.identifier, items : [] }; } - - function _toStoreItem(fmObj, params) { - if (!params) params = {}; - return fmObj.toHash(true, params.virtualFields); - } - - function _toStoreData (list, label, params) { - if (!params) params = {}; - var data = this.initStoreData(label, params); - - for (var i = 0; list && i < list.length; i++) data.items.push( list[i].toHash(true, params.virtualFields) ); - - if (params.children && params.parent) { - var _hash_list = data.items; - - var _find_root = {}; - for (var i = 0; _hash_list && i < _hash_list.length; i++) { - _find_root[_hash_list[i][params.identifier]] = _hash_list[i]; - } - - var item_data = []; - for (var i = 0; _hash_list && i < _hash_list.length; i++) { - var obj = _hash_list[i] - obj[params.children] = []; - - for (var j = 0; _hash_list && j < _hash_list.length; j++) { - var kid = _hash_list[j]; - if (kid[params.parent] == obj[params.identifier]) { - obj[params.children].push( { _reference : kid[params.identifier] } ); - kid._iskid = true; - if (_find_root[kid[params.identifier]]) delete _find_root[kid[params.identifier]]; - } - } - - item_data.push( obj ); - } - - for (var j in _find_root) { - _find_root[j]['_top'] = 'true'; - if (!_find_root[j][params.parent]) - _find_root[j]['_trueRoot'] = 'true'; - } - - data.items = item_data; - } - - return data; - } - - for (var i in fmclasses) { - fieldmapper[i].prototype.fromStoreItem = _fromStoreItem; - fieldmapper[i].prototype.fromStoreItem = _fromStoreItem; - fieldmapper[i].toStoreData = _toStoreData; - fieldmapper[i].toStoreItem = _toStoreItem; - fieldmapper[i].prototype.toStoreItem = function ( args ) { return _toStoreItem(this, args) }; - fieldmapper[i].initStoreData = _initStoreData; - } - - if (fieldmapper.aou) fieldmapper.aou.prototype._ignore_fields = ['children']; - if (fieldmapper.aout) fieldmapper.aout.prototype._ignore_fields = ['children']; - if (fieldmapper.pgt) fieldmapper.pgt.prototype._ignore_fields = ['children']; - - fieldmapper.aou.toStoreData = function (list, label) { - if (!label) label = 'shortname'; - return _toStoreData.call(this, list, label, { 'parent' : 'parent_ou', 'children' : 'children' }); - } - - fieldmapper.aout.toStoreData = function (list, label) { - if (!label) label = 'name'; - return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' }); - } - - fieldmapper.pgt.toStoreData = function (list, label) { - if (!label) label = 'name'; - return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' }); - } - - /* - ppl.toStoreData = function (list, label) { - if (!label) label = 'code'; - return _toStoreData(list, label, {}); - } - */ - } diff --git a/Open-ILS/web/js/dojo/fieldmapper/hash.js b/Open-ILS/web/js/dojo/fieldmapper/hash.js index c11169ad2e..0cfea4b00e 100644 --- a/Open-ILS/web/js/dojo/fieldmapper/hash.js +++ b/Open-ILS/web/js/dojo/fieldmapper/hash.js @@ -19,40 +19,44 @@ if(!dojo._hasResource['fieldmapper.hash']){ dojo._hasResource['fieldmapper.hash'] = true; dojo.provide('fieldmapper.hash'); - dojo.require('fieldmapper.Fieldmapper'); - - function _fromHash (_hash) { - for ( var i=0; i < this._fields.length; i++) { - if (_hash[this._fields[i]] != null) - this[this._fields[i]]( _hash[this._fields[i]] ); - } - return this; - } - - function _toHash (includeNulls, virtFields) { - var _hash = {}; - for ( var i=0; i < this._fields.length; i++) { - if (includeNulls || this[this._fields[i]]() != null) { - if (this[this._fields[i]]() == null) - _hash[this._fields[i]] = null; - else - _hash[this._fields[i]] = '' + this[this._fields[i]](); - } - } - if (virtFields && virtFields.length > 0) { - for (var i = 0; i < virtFields.length; i++) { - if (!_hash[virtFields[i]]) - _hash[virtFields[i]] = null; - } - } + if(!dojo._hasResource["fieldmapper.Fieldmapper"]) { + + /* XXX Content loaded in Fieldmapper */ + /* XXX deprecate this file **/ + + function _fromHash (_hash) { + for ( var i=0; i < this._fields.length; i++) { + if (_hash[this._fields[i]] != null) + this[this._fields[i]]( _hash[this._fields[i]] ); + } + return this; + } + + function _toHash (includeNulls, virtFields) { + var _hash = {}; + for ( var i=0; i < this._fields.length; i++) { + if (includeNulls || this[this._fields[i]]() != null) { + if (this[this._fields[i]]() == null) + _hash[this._fields[i]] = null; + else + _hash[this._fields[i]] = '' + this[this._fields[i]](); + } + } - return _hash; - } + if (virtFields && virtFields.length > 0) { + for (var i = 0; i < virtFields.length; i++) { + if (!_hash[virtFields[i]]) + _hash[virtFields[i]] = null; + } + } - for (var i in fmclasses) { - window[i].prototype.fromHash = _fromHash; - window[i].prototype.toHash = _toHash; - } + return _hash; + } + for (var i in fmclasses) { + window[i].prototype.fromHash = _fromHash; + window[i].prototype.toHash = _toHash; + } + } } diff --git a/Open-ILS/web/js/ui/base.js b/Open-ILS/web/js/ui/base.js index 1f5de05e28..4a57cd7afb 100644 --- a/Open-ILS/web/js/ui/base.js +++ b/Open-ILS/web/js/ui/base.js @@ -1,7 +1,6 @@ dojo.require('dijit.Dialog'); dojo.require('dojo.cookie'); dojo.require('fieldmapper.AutoIDL'); // make conditional. TT variable sets JS var to enable/disable? -dojo.require('fieldmapper.dojoData'); dojo.require('openils.User'); dojo.require('openils.CGI'); dojo.require('openils.Event'); diff --git a/Open-ILS/web/opac/skin/default/xml/common/js_common.xml b/Open-ILS/web/opac/skin/default/xml/common/js_common.xml index c36dc06bb0..a2fe07b035 100644 --- a/Open-ILS/web/opac/skin/default/xml/common/js_common.xml +++ b/Open-ILS/web/opac/skin/default/xml/common/js_common.xml @@ -1,3 +1,9 @@ + + + + @@ -44,9 +50,8 @@ var djConfig = { locale: locale.toLowerCase(), - AutoIDL: ['aou','aout','pgt','lasso'], parseOnLoad: true, - isDebug: false + isDebug: false }, lang, bidi; diff --git a/Open-ILS/web/templates/base.tt2 b/Open-ILS/web/templates/base.tt2 index dc426c2b92..77a222baa6 100644 --- a/Open-ILS/web/templates/base.tt2 +++ b/Open-ILS/web/templates/base.tt2 @@ -10,19 +10,8 @@ href='[% ctx.media_prefix %]/css/skin/[% ctx.skin %].css' /> - + + diff --git a/Open-ILS/xsl/fm_IDL2js.xsl b/Open-ILS/xsl/fm_IDL2js.xsl new file mode 100644 index 0000000000..1a857bf1ba --- /dev/null +++ b/Open-ILS/xsl/fm_IDL2js.xsl @@ -0,0 +1,79 @@ + + + + + + + +var _preload_fieldmapper_IDL = {}; +for (var c in _preload_fieldmapper_IDL) { + var x = _preload_fieldmapper_IDL[c]; x.field_map = {}; + var p = x.fields.length; + for (var n in {isnew:1,ischanged:1,isdeleted:1}) x.fields[p] = {name:n,type:'field',virtual:true,array_position:p++}; + for (var f in x.fields) x.field_map[x.fields[f].name] = x.fields[f]; +} + + + + + + , + + + + , + + + + + :{name:"",label:"",restrict_primary:"",virtual:,pkey:"",pkey_sequence:"",} + + fields:[,] + + ,permacrud:{"":{},} + +{name:"",label:"",datatype:"",primitive:"",selector:"",array_position:"",,virtual:,required:,i18n:} + + + perms:['',] + + + + + + type:"link", + type:"field" + + + +key:"","class":"",reltype:"" + + + + + true + false + + + + + + + + + + + + + + diff --git a/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul b/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul index 297cc6aad6..b6823be596 100644 --- a/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul +++ b/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul @@ -9,6 +9,7 @@ diff --git a/Open-ILS/xul/staff_client/server/admin/copy_locations.xhtml b/Open-ILS/xul/staff_client/server/admin/copy_locations.xhtml index a4fb1c8fe3..aee74406b3 100644 --- a/Open-ILS/xul/staff_client/server/admin/copy_locations.xhtml +++ b/Open-ILS/xul/staff_client/server/admin/copy_locations.xhtml @@ -10,6 +10,7 @@ &staff.server.admin.copy_locations.title; + - +