X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=roojs-debug.js;h=2eed311eed6e16a9b77eb66624ea25ccd24674bb;hb=25dc37b6fac42dc67bc542601241df016b5a3817;hp=6e125677b4ccfa217eab4364585544cee9afdbd6;hpb=c2162fa64f4d6cb2a21a9296cdf9c79ab00ece5e;p=roojs1 diff --git a/roojs-debug.js b/roojs-debug.js index 6e125677b4..2eed311eed 100644 --- a/roojs-debug.js +++ b/roojs-debug.js @@ -4667,6 +4667,7 @@ Roo.Template.prototype = { * @return {String} The HTML fragment */ applyTemplate : function(values){ + Roo.log(["applyTemplate", values]); try { if(this.compiled){ @@ -6073,10 +6074,10 @@ Roo.util.Observable.releaseCapture = function(o){ var ls = this.listeners, scope, len = ls.length; if(len > 0){ this.firing = true; - var args = Array.prototype.slice.call(arguments, 0); + var args = Array.prototype.slice.call(arguments, 0); for(var i = 0; i < len; i++){ - var l = ls[i]; - if(l.fireFn.apply(l.scope||this.obj||window, arguments) === false){ + var l = ls[i]; + if(l.fireFn.apply(l.scope||this.obj||window, args) === false){ this.firing = false; return false; } @@ -11659,7 +11660,9 @@ Roo.extend(Roo.data.Connection, Roo.util.Observable, { url += (url.indexOf('?') != -1 ? '&' : '?') + p; p = ''; } + Roo.lib.Ajax.useDefaultHeader = typeof(o.headers) == 'undefined' || typeof(o.headers['Content-Type']) == 'undefined'; this.transId = Roo.lib.Ajax.request(method, url, cb, p, o); + Roo.lib.Ajax.useDefaultHeader == true; return this.transId; }else{ Roo.callback(o.callback, o.scope, [o, null, null]); @@ -13299,6 +13302,9 @@ mc.add(otherEl); * @return {Object} The item associated with the passed key. */ item : function(key){ + if (key === 'length') { + return null; + } var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key]; return typeof item != 'function' || this.allowFunctions ? item : null; // for prototype! }, @@ -16800,10 +16806,86 @@ Roo.Markdown.toHtml = function(text) { // (function() { + /** + * eval:var:escape + * eval:var:unescape + * eval:var:replace + */ + + /** + * Helpers + */ + + var escape = function (html, encode) { + return html + .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + var unescape = function (html) { + // explicitly match decimal, hex, and named HTML entities + return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) { + n = n.toLowerCase(); + if (n === 'colon') { return ':'; } + if (n.charAt(0) === '#') { + return n.charAt(1) === 'x' + ? String.fromCharCode(parseInt(n.substring(2), 16)) + : String.fromCharCode(+n.substring(1)); + } + return ''; + }); + } + + var replace = function (regex, opt) { + regex = regex.source; + opt = opt || ''; + return function self(name, val) { + if (!name) { return new RegExp(regex, opt); } + val = val.source || val; + val = val.replace(/(^|[^\[])\^/g, '$1'); + regex = regex.replace(name, val); + return self; + }; + } + + + /** + * eval:var:noop + */ + var noop = function () {} + noop.exec = noop; + + /** + * eval:var:merge + */ + var merge = function (obj) { + var i = 1 + , target + , key; + + for (; i < arguments.length; i++) { + target = arguments[i]; + for (key in target) { + if (Object.prototype.hasOwnProperty.call(target, key)) { + obj[key] = target[key]; + } + } + } + + return obj; + } + + /** * Block-Level Grammar */ + + + var block = { newline: /^\n+/, code: /^( {4}[^\n]+\n*)+/, @@ -16893,7 +16975,7 @@ Roo.Markdown.toHtml = function(text) { * Block Lexer */ - function Lexer(options) { + var Lexer = function (options) { this.tokens = []; this.tokens.links = {}; this.options = options || marked.defaults; @@ -17311,7 +17393,7 @@ Roo.Markdown.toHtml = function(text) { * Inline Lexer & Compiler */ - function InlineLexer(links, options) { + var InlineLexer = function (links, options) { this.options = options || marked.defaults; this.links = links; this.rules = inline.normal; @@ -17551,7 +17633,11 @@ Roo.Markdown.toHtml = function(text) { * Renderer */ - function Renderer(options) { + /** + * eval:var:Renderer + */ + + var Renderer = function (options) { this.options = options || {}; } @@ -17700,8 +17786,11 @@ Roo.Markdown.toHtml = function(text) { /** * Parsing & Compiling */ + /** + * eval:var:Parser + */ - function Parser(options) { + var Parser= function (options) { this.tokens = []; this.token = null; this.options = options || marked.defaults; @@ -17876,72 +17965,15 @@ Roo.Markdown.toHtml = function(text) { } } }; - - /** - * Helpers - */ - - function escape(html, encode) { - return html - .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); - } - - function unescape(html) { - // explicitly match decimal, hex, and named HTML entities - return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) { - n = n.toLowerCase(); - if (n === 'colon') { return ':'; } - if (n.charAt(0) === '#') { - return n.charAt(1) === 'x' - ? String.fromCharCode(parseInt(n.substring(2), 16)) - : String.fromCharCode(+n.substring(1)); - } - return ''; - }); - } - - function replace(regex, opt) { - regex = regex.source; - opt = opt || ''; - return function self(name, val) { - if (!name) { return new RegExp(regex, opt); } - val = val.source || val; - val = val.replace(/(^|[^\[])\^/g, '$1'); - regex = regex.replace(name, val); - return self; - }; - } - - function noop() {} - noop.exec = noop; - - function merge(obj) { - var i = 1 - , target - , key; - - for (; i < arguments.length; i++) { - target = arguments[i]; - for (key in target) { - if (Object.prototype.hasOwnProperty.call(target, key)) { - obj[key] = target[key]; - } - } - } - - return obj; - } - + /** * Marked */ - - function marked(src, opt, callback) { + /** + * eval:var:marked + */ + var marked = function (src, opt, callback) { if (callback || typeof opt === 'function') { if (!callback) { callback = opt; @@ -17962,7 +17994,9 @@ Roo.Markdown.toHtml = function(text) { } pending = tokens.length; - + /** + * eval:var:done + */ var done = function(err) { if (err) { opt.highlight = highlight; @@ -21095,8 +21129,8 @@ Roo.dd.DDTarget = function(id, sGroup, config) { if (id) { this.initTarget(id, sGroup, config); } - if (config.listeners || config.events) { - Roo.dd.DragDrop.superclass.constructor.call(this, { + if (config && (config.listeners || config.events)) { + Roo.dd.DragDrop.superclass.constructor.call(this, { listeners : config.listeners || {}, events : config.events || {} }); @@ -23235,6 +23269,16 @@ Roo.extend(Roo.data.Store, Roo.util.Observable, { var r = this.reader.readRecords(o); this.loadRecords(r, {add: append}, true); }, + + /** + * using 'cn' the nested child reader read the child array into it's child stores. + * @param {Object} rec The record with a 'children array + */ + loadDataFromChildren : function(rec) + { + this.loadData(this.reader.toLoadData(rec)); + }, + /** * Gets the number of cached records. @@ -23539,14 +23583,16 @@ Roo.extend(Roo.data.Store, Roo.util.Observable, { * Small helper class to make creating Stores from Array data easier. * @cfg {Number} id The array index of the record id. Leave blank to auto generate ids. * @cfg {Array} fields An array of field definition objects, or field name strings. + * @cfg {Object} an existing reader (eg. copied from another store) * @cfg {Array} data The multi-dimensional array of data * @constructor * @param {Object} config */ -Roo.data.SimpleStore = function(config){ +Roo.data.SimpleStore = function(config) +{ Roo.data.SimpleStore.superclass.constructor.call(this, { isLocal : true, - reader: new Roo.data.ArrayReader({ + reader: typeof(config.reader) != 'undefined' ? config.reader : new Roo.data.ArrayReader({ id: config.id }, Roo.data.Record.create(config.fields) @@ -23723,6 +23769,9 @@ Roo.data.DataReader = function(meta, recordType){ }; Roo.data.DataReader.prototype = { + + + readerType : 'Data', /** * Create an empty record * @param {Object} data (optional) - overlay some values @@ -23743,6 +23792,7 @@ Roo.data.DataReader.prototype = { return new this.recordType(Roo.apply(da, d)); } + };/* * Based on: * Ext JS Library 1.1.1 @@ -24281,6 +24331,8 @@ Roo.data.JsonReader = function(meta, recordType){ }; Roo.extend(Roo.data.JsonReader, Roo.data.DataReader, { + readerType : 'Json', + /** * @prop {Boolean} metaFromRemote - if the meta data was loaded from the remote source. * Used by Store query builder to append _requestMeta to params. @@ -24422,6 +24474,14 @@ Roo.extend(Roo.data.JsonReader, Roo.data.DataReader, { records : records, totalRecords : totalRecords }; + }, + // used when loading children.. @see loadDataFromChildren + toLoadData: function(rec) + { + // expect rec just to be an array.. eg [a,b,c, [...] << cn ] + var data = typeof(rec.data.cn) == 'undefined' ? [] : rec.data.cn; + return { data : data, total : data.length }; + } });/* * Based on: @@ -24492,6 +24552,9 @@ Roo.data.XmlReader = function(meta, recordType){ Roo.data.XmlReader.superclass.constructor.call(this, meta, recordType||meta.fields); }; Roo.extend(Roo.data.XmlReader, Roo.data.DataReader, { + + readerType : 'Xml', + /** * This method is only used by a DataProxy which has retrieved data from a remote server. * @param {Object} response The XHR object which contains the parsed XML document. The response is expected @@ -24603,44 +24666,54 @@ var myReader = new Roo.data.ArrayReader({ * * created using {@link Roo.data.Record#create}. */ -Roo.data.ArrayReader = function(meta, recordType){ - - +Roo.data.ArrayReader = function(meta, recordType) +{ Roo.data.ArrayReader.superclass.constructor.call(this, meta, recordType||meta.fields); }; Roo.extend(Roo.data.ArrayReader, Roo.data.JsonReader, { - /** + + /** * Create a data block containing Roo.data.Records from an XML document. * @param {Object} o An Array of row objects which represents the dataset. * @return {Object} A data block which is used by an {@link Roo.data.Store} object as * a cache of Roo.data.Records. */ - readRecords : function(o){ + readRecords : function(o) + { var sid = this.meta ? this.meta.id : null; var recordType = this.recordType, fields = recordType.prototype.fields; var records = []; var root = o; - for(var i = 0; i < root.length; i++){ - var n = root[i]; - var values = {}; - var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null); - for(var j = 0, jlen = fields.length; j < jlen; j++){ - var f = fields.items[j]; - var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j; - var v = n[k] !== undefined ? n[k] : f.defaultValue; - v = f.convert(v); - values[f.name] = v; - } - var record = new recordType(values, id); - record.json = n; - records[records.length] = record; + for(var i = 0; i < root.length; i++){ + var n = root[i]; + var values = {}; + var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null); + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var f = fields.items[j]; + var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j; + var v = n[k] !== undefined ? n[k] : f.defaultValue; + v = f.convert(v); + values[f.name] = v; } - return { - records : records, - totalRecords : records.length - }; + var record = new recordType(values, id); + record.json = n; + records[records.length] = record; + } + return { + records : records, + totalRecords : records.length + }; + }, + // used when loading children.. @see loadDataFromChildren + toLoadData: function(rec) + { + // expect rec just to be an array.. eg [a,b,c, [...] << cn ] + return typeof(rec.data.cn) == 'undefined' ? [] : rec.data.cn; + } + + });/* * Based on: * Ext JS Library 1.1.1 @@ -41365,9 +41438,11 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { // element that contains real text value.. (when hidden is used..) // private - onRender : function(ct, position){ + onRender : function(ct, position) + { Roo.form.ComboBox.superclass.onRender.call(this, ct, position); - if(this.hiddenName){ + + if(this.hiddenName){ this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId||this.hiddenName)}, 'before', true); this.hiddenField.value = @@ -41379,6 +41454,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { } + if(Roo.isGecko){ this.el.dom.setAttribute('autocomplete', 'off'); } @@ -41439,7 +41515,9 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { } this.view = new Roo.View(this.innerList, this.tpl, { - singleSelect:true, store: this.store, selectedClass: this.selectedClass + singleSelect:true, + store: this.store, + selectedClass: this.selectedClass }); this.view.on('click', this.onViewClick, this); @@ -42261,7 +42339,7 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, // give fake names to child combo; this.combo.hiddenName = this.hiddenName ? (this.hiddenName+'-subcombo') : this.hiddenName; - this.combo.name = this.name? (this.name+'-subcombo') : this.name; + this.combo.name = this.name ? (this.name+'-subcombo') : this.name; this.combo = Roo.factory(this.combo, Roo.form); this.combo.onRender(ct, position); @@ -42382,6 +42460,7 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, { var valueField = this.combo.valueField; var displayField = this.combo.displayField; + if (this.items.indexOfKey(rec[valueField]) > -1) { //console.log("GOT " + rec.data.id); return; @@ -42413,7 +42492,6 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, this.items.each(function(f) { ar.push(f.data[idField]); - }); this.hiddenEl.dom.value = ar.join(','); this.validate(); @@ -42439,11 +42517,9 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, }, setValue: function(v) // not a valid action - must use addItems.. { - - this.reset(); - - + this.reset(); + if (this.store.isLocal && (typeof(v) == 'string')) { // then we can use the store to find the values.. // comma seperated at present.. this needs to allow JSON based encoding.. @@ -42627,6 +42703,434 @@ Roo.extend(Roo.form.ComboBoxArray.Item, Roo.BoxComponent, { } } +});/* + * RooJS Library 1.1.1 + * Copyright(c) 2008-2011 Alan Knowles + * + * License - LGPL + */ + + +/** + * @class Roo.form.ComboNested + * @extends Roo.form.ComboBox + * A combobox for that allows selection of nested items in a list, + * eg. + * + * Book + * -> red + * -> green + * Table + * -> square + * ->red + * ->green + * -> rectangle + * ->green + * + * + * @constructor + * Create a new ComboNested + * @param {Object} config Configuration options + */ +Roo.form.ComboNested = function(config){ + Roo.form.ComboCheck.superclass.constructor.call(this, config); + // should verify some data... + // like + // hiddenName = required.. + // displayField = required + // valudField == required + var req= [ 'hiddenName', 'displayField', 'valueField' ]; + var _t = this; + Roo.each(req, function(e) { + if ((typeof(_t[e]) == 'undefined' ) || !_t[e].length) { + throw "Roo.form.ComboNested : missing value for: " + e; + } + }); + + +}; + +Roo.extend(Roo.form.ComboNested, Roo.form.ComboBox, { + + /* + * @config {Number} max Number of columns to show + */ + + maxColumns : 3, + + list : null, // the outermost div.. + innerLists : null, // the + views : null, + stores : null, + // private + loadingChildren : false, + + onRender : function(ct, position) + { + Roo.form.ComboBox.superclass.onRender.call(this, ct, position); // skip parent call - got to above.. + + if(this.hiddenName){ + this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId||this.hiddenName)}, + 'before', true); + this.hiddenField.value = + this.hiddenValue !== undefined ? this.hiddenValue : + this.value !== undefined ? this.value : ''; + + // prevent input submission + this.el.dom.removeAttribute('name'); + + + } + + if(Roo.isGecko){ + this.el.dom.setAttribute('autocomplete', 'off'); + } + + var cls = 'x-combo-list'; + + this.list = new Roo.Layer({ + shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false + }); + + var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth); + this.list.setWidth(lw); + this.list.swallowEvent('mousewheel'); + this.assetHeight = 0; + + if(this.title){ + this.header = this.list.createChild({cls:cls+'-hd', html: this.title}); + this.assetHeight += this.header.getHeight(); + } + this.innerLists = []; + this.views = []; + this.stores = []; + for (var i =0 ; i < this.maxColumns; i++) { + this.onRenderList( cls, i); + } + + // always needs footer, as we are going to have an 'OK' button. + this.footer = this.list.createChild({cls:cls+'-ft'}); + this.pageTb = new Roo.Toolbar(this.footer); + var _this = this; + this.pageTb.add( { + + text: 'Done', + handler: function() + { + _this.collapse(); + } + }); + + if ( this.allowBlank && !this.disableClear) { + + this.pageTb.add(new Roo.Toolbar.Fill(), { + cls: 'x-btn-icon x-btn-clear', + text: ' ', + handler: function() + { + _this.collapse(); + _this.clearValue(); + _this.onSelect(false, -1); + } + }); + } + if (this.footer) { + this.assetHeight += this.footer.getHeight(); + } + + }, + onRenderList : function ( cls, i) + { + + var lw = Math.floor( + ((this.listWidth * this.maxColumns || Math.max(this.wrap.getWidth(), this.minListWidth)) - this.list.getFrameWidth('lr')) / this.maxColumns + ); + + this.list.setWidth(lw); // default to '1' + + var il = this.innerLists[i] = this.list.createChild({cls:cls+'-inner'}); + //il.on('mouseover', this.onViewOver, this, { list: i }); + //il.on('mousemove', this.onViewMove, this, { list: i }); + il.setWidth(lw); + il.setStyle({ 'overflow-x' : 'hidden'}); + + if(!this.tpl){ + this.tpl = new Roo.Template({ + html : '