From: phasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4> Date: Wed, 11 Nov 2009 08:05:07 +0000 (+0000) Subject: Simplify list construction in xul (provide a default map_row_to_columns function... X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=52f649d06b5b5ec47fb8706f01e76a0ec06a7b7b;p=contrib%2FConifer.git Simplify list construction in xul (provide a default map_row_to_columns function), give the option for using fm_IDL.xml for column definitions, and use dojo.date.locale for timestamp columns when using fm_IDL.xml. Simple example: Given this XUL: <tree id="atev_list" flex="1" /> Then this Javascript will build columns based on the "atev" class: JSAN.use('util.list'); var list = new util.list('atev_list'); list.init( { columns: [ 'atev' ] } ); If we need to customize certain columns, we could do it like so: JSAN.use('util.list'); var list = new util.list('atev_list'); list.init( { columns: list.fm_columns('atev', { 'atev_id' : { 'primary' : true }, 'atev_run_time' : { 'flex' : 1 }, 'atev_isdeleted' : { 'hidden' : false, 'onclick' : 'alert("Boo!")' } }) } ); git-svn-id: svn://svn.open-ils.org/ILS/trunk@14864 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/xul/staff_client/chrome/content/util/list.js b/Open-ILS/xul/staff_client/chrome/content/util/list.js index 9189827b32..8ec709289c 100644 --- a/Open-ILS/xul/staff_client/chrome/content/util/list.js +++ b/Open-ILS/xul/staff_client/chrome/content/util/list.js @@ -32,14 +32,28 @@ util.list.prototype = { JSAN.use('util.widgets'); if (typeof params.map_row_to_column == 'function') obj.map_row_to_column = params.map_row_to_column; - if (typeof params.map_row_to_columns == 'function') obj.map_row_to_columns = params.map_row_to_columns; + if (typeof params.map_row_to_columns == 'function') { + obj.map_row_to_columns = params.map_row_to_columns; + } else { + obj.map_row_to_columns = obj.std_map_row_to_columns(); + } if (typeof params.retrieve_row == 'function') obj.retrieve_row = params.retrieve_row; obj.prebuilt = false; if (typeof params.prebuilt != 'undefined') obj.prebuilt = params.prebuilt; if (typeof params.columns == 'undefined') throw('util.list.init: No columns'); - obj.columns = params.columns; + obj.columns = []; + for (var i = 0; i < params.columns.length; i++) { + if (typeof params.columns[i] == 'object') { + obj.columns.push( params.columns[i] ); + } else { + var cols = obj.fm_columns( params.columns[i] ); + for (var j = 0; j < cols.length; j++) { + obj.columns.push( cols[j] ); + } + } + } switch(obj.node.nodeName) { case 'tree' : obj._init_tree(params); break; @@ -1518,7 +1532,99 @@ util.list.prototype = { } catch(E) { obj.error.standard_unexpected_error_alert('setting list actions',E); } - } + }, + + // Takes fieldmapper class name and attempts to spit out column definitions suitable for .init + 'fm_columns' : function(hint,column_extras) { + var obj = this; + var columns = []; + try { + // requires the dojo library fieldmapper.autoIDL + if (typeof fieldmapper == 'undefined') { throw 'fieldmapper undefined'; } + if (typeof fieldmapper.IDL == 'undefined') { throw 'fieldmapper.IDL undefined'; } + if (typeof fieldmapper.IDL.fmclasses == 'undefined') { throw 'fieldmapper.IDL.fmclasses undefined'; } + if (typeof fieldmapper.IDL.fmclasses[hint] == 'undefined') { throw 'fieldmapper.IDL.fmclasses.' + hint + ' undefined'; } + var my_class = fieldmapper.IDL.fmclasses[hint]; + + function col_def(my_field) { + var col_id = hint + '_' + my_field.name; + var def = { + 'id' : col_id, + 'label' : my_field.label || my_field.name, + 'sort_type' : [ 'int', 'float', 'id', 'number' ].indexOf(my_field.datatype) > -1 ? 'number' : ( my_field.datatype == 'money' ? 'money' : 'default'), + 'hidden' : [ 'isnew', 'ischanged', 'isdeleted' ].indexOf(my_field.name) > -1, + 'flex' : 1 + }; + // my_field.datatype => bool float id int interval link money number org_unit text timestamp + def.render = function(my) { return my[hint][my_field.name](); } + if (my_field.datatype == 'timestamp') { + dojo.require('dojo.date.locale'); + dojo.require('dojo.date.stamp'); + def.render = function(my) { + return dojo.date.locale.format( dojo.date.stamp.fromISOString(my[hint][my_field.name]()) ); + } + } + if (my_field.datatype == 'org_unit') { + def.render = function(my) { + return typeof my[hint][my_field.name]() == 'object' ? my[hint][my_field.name]().shortname() : data.hash.aou[ my[hint][my_field.name]() ].shortname(); + } + } + if (my_field.datatype == 'money') { + JSAN.use('util.money'); + def.render = function(my) { + return util.money.sanitize( my[hint][my_field.name]() ); + } + } + if (column_extras) { + if (column_extras[col_id]) { + for (var attr in column_extras[col_id]) { + def[attr] = column_extras[col_id][attr]; + } + } + } + return def; + } + + for (var i = 0; i < my_class.fields.length; i++) { + var my_field = my_class.fields[i]; + columns.push( col_def(my_field) ); + } + } catch(E) { + obj.error.standard_unexpected_error_alert('fm_columns()',E); + } + return columns; + }, + // Default for the map_row_to_columns function for .init + 'std_map_row_to_columns' : function(error_value) { + return function(row,cols) { + // row contains { 'my' : { 'acp' : {}, 'circ' : {}, 'mvr' : {} } } + // cols contains all of the objects listed above in columns + + var obj = {}; + JSAN.use('util.error'); obj.error = new util.error(); + JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'}); + JSAN.use('util.network'); obj.network = new util.network(); + JSAN.use('util.money'); + + var my = row.my; + var values = []; + var cmd = ''; + try { + for (var i = 0; i < cols.length; i++) { + switch (typeof cols[i].render) { + case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; obj.error.sdump('D_COLUMN_RENDER_ERROR',E); } break; + case 'string' : cmd += 'try { ' + cols[i].render + '; values['+i+'] = v; } catch(E) { values['+i+'] = error_value; }'; break; + default: cmd += 'values['+i+'] = "??? '+(typeof cols[i].render)+'"; '; + } + } + if (cmd) eval( cmd ); + } catch(E) { + obj.error.sdump('D_WARN','map_row_to_column: ' + E); + if (error_value) { value = error_value; } else { value = ' ' }; + } + return values; + } + } } dump('exiting util.list.js\n');