X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=roojs-debug.js;h=f95b807da4da7f374eab9f9fe0fdc2b2bce9eb17;hb=ff355e12aa44d689f8536251642f2963c7abbf1e;hp=3b02a0804e54a1761a252c3ee757ce3aeb6cb157;hpb=9187e76807c978e0924f273cba221f83a78f6afb;p=roojs1 diff --git a/roojs-debug.js b/roojs-debug.js index 3b02a0804e..f95b807da4 100644 --- a/roojs-debug.js +++ b/roojs-debug.js @@ -1205,12 +1205,35 @@ document.write(dt.format(Date.patterns.ShortDate)); /** Returns the number of milliseconds between this date and date @param {Date} date (optional) Defaults to now - @return {Number} The diff in milliseconds + @param {String} interval (optional) Default Date.MILLI, A valid date interval enum value (eg. Date.DAY) + @return {Number} The diff in milliseconds or units of interval @member Date getElapsed */ -Date.prototype.getElapsed = function(date) { - return Math.abs((date || new Date()).getTime()-this.getTime()); +Date.prototype.getElapsed = function(date, interval) +{ + date = date || new Date(); + var ret = Math.abs(date.getTime()-this.getTime()); + switch (interval) { + + case Date.SECOND: + return Math.floor(ret / (1000)); + case Date.MINUTE: + return Math.floor(ret / (1000*60)); + case Date.HOUR: + return Math.floor(ret / (1000*60*60)); + case Date.DAY: + return Math.floor(ret / (1000*60*60*24)); + case Date.MONTH: // this does not give exact number...?? + return ((date.format("Y") - this.format("Y")) * 12) + (date.format("m") - this.format("m")); + case Date.YEAR: // this does not give exact number...?? + return (date.format("Y") - this.format("Y")); + + case Date.MILLI: + default: + return ret; + } }; + // was in date file.. @@ -5490,7 +5513,7 @@ Roo.DomHelper = function(){ if (typeof(o) == 'string') { return parentNode.appendChild(document.createTextNode(o)); } - o.tag = o.tag || div; + o.tag = o.tag || 'div'; if (o.ns && Roo.isIE) { ns = false; o.tag = o.ns + ':' + o.tag; @@ -16969,6 +16992,13 @@ Roo.extend(Roo.Component, Roo.util.Observable, { */ actionMode : "el", + /** + * @cfg {String} style + * css styles to add to component + * eg. text-align:right; + */ + style : false, + /** @private */ getActionEl : function(){ return this[this.actionMode]; @@ -25863,14 +25893,16 @@ Roo.extend(Roo.data.DataProxy, Roo.util.Observable); */ /** * @class Roo.data.MemoryProxy + * @extends Roo.data.DataProxy * An implementation of Roo.data.DataProxy that simply passes the data specified in its constructor * to the Reader when its load method is called. * @constructor - * @param {Object} data The data object which the Reader uses to construct a block of Roo.data.Records. + * @param {Object} config A config object containing the objects needed for the Store to access data, */ -Roo.data.MemoryProxy = function(data){ - if (data.data) { - data = data.data; +Roo.data.MemoryProxy = function(config){ + var data = config; + if (typeof(config) != 'undefined' && typeof(config.data) != 'undefined') { + data = config.data; } Roo.data.MemoryProxy.superclass.constructor.call(this); this.data = data; @@ -25878,6 +25910,9 @@ Roo.data.MemoryProxy = function(data){ Roo.extend(Roo.data.MemoryProxy, Roo.data.DataProxy, { + /** + * @cfg {Object} data The data object which the Reader uses to construct a block of Roo.data.Records. + */ /** * Load data from the requested source (in this case an in-memory * data object passed to the constructor), read the data object into @@ -31111,7 +31146,23 @@ Roo.extend(Roo.Button, Roo.util.Observable, { this.hide(); } }, - + /** + * Similar to toggle, but does not trigger event. + * @param {Boolean} state [required] Force a particular state + */ + setPressed : function(state) + { + if(state != this.pressed){ + if(state){ + this.el.addClass("x-btn-pressed"); + this.pressed = true; + }else{ + this.el.removeClass("x-btn-pressed"); + this.pressed = false; + } + } + }, + /** * If a state it passed, it becomes the pressed state otherwise the current state is toggled. * @param {Boolean} state (optional) Force a particular state @@ -31134,6 +31185,8 @@ Roo.extend(Roo.Button, Roo.util.Observable, { } }, + + /** * Focus the button */ @@ -44972,7 +45025,9 @@ Roo.extend(Roo.form.Checkbox, Roo.form.Field, { this.fireEvent('check', this, state); } this.inSetChecked = true; - this.el.dom.value = state ? this.inputValue : this.valueOff; + + this.el.dom.value = state ? this.inputValue : this.valueOff; + this.inSetChecked = false; }, @@ -45063,9 +45118,49 @@ Roo.extend(Roo.form.Radio, Roo.form.Checkbox, { this.el.dom.checked = 'checked' ; } + }, + /** + * Sets the checked state of the checkbox. + * On is always based on a string comparison between inputValue and the param. + * @param {Boolean/String} value - the value to set + * @param {Boolean/String} suppressEvent - whether to suppress the checkchange event. + */ + setValue : function(v,suppressEvent){ + + + //this.checked = (v === true || v === 'true' || v == '1' || String(v).toLowerCase() == 'on'); + //if(this.el && this.el.dom){ + // this.el.dom.checked = this.checked; + // this.el.dom.defaultChecked = this.checked; + //} + this.setChecked(String(v) === String(this.inputValue), suppressEvent); + + this.el.dom.form[this.name].value = v; + + //this.fireEvent("check", this, this.checked); + }, + // private.. + setChecked : function(state,suppressEvent) + { + + if(this.wrap){ + this.wrap[state ? 'addClass' : 'removeClass']('x-menu-item-checked'); + } + this.checked = state; + if(suppressEvent !== true){ + this.fireEvent('check', this, state); + } + + + + + }, + reset : function(){ + // this.setValue(this.resetValue); + //this.originalValue = this.getValue(); + this.clearInvalid(); } - });Roo.rtf = {}; // namespace Roo.rtf.Hex = function(hex) { @@ -45351,7 +45446,7 @@ Roo.rtf.Parser.prototype = { this.hexStore.push(cmd); }, cmderror : function(cmd) { - throw new Exception (cmd.value); + throw cmd.value; }, /* @@ -45481,7 +45576,8 @@ Roo.rtf.Parser.prototype = { { this.emitText(); if (this.controlWord === '') { - this.emitError('empty control word'); + // do we want to track this - it seems just to cause problems. + //this.emitError('empty control word'); } else { this.push({ type: 'controlword', @@ -45605,6 +45701,8 @@ Roo.htmleditor.Filter.prototype = { return; case this.tag === true: // everything + case e.tagName.indexOf(":") > -1 && typeof(this.tag) == 'object' && this.tag.indexOf(":") > -1: + case e.tagName.indexOf(":") > -1 && typeof(this.tag) == 'string' && this.tag == ":": case typeof(this.tag) == 'object' && this.tag.indexOf(e.tagName) > -1: // array and it matches. case typeof(this.tag) == 'string' && this.tag == e.tagName: // array and it matches. if (this.replaceTag && false === this.replaceTag(e)) { @@ -45623,6 +45721,21 @@ Roo.htmleditor.Filter.prototype = { }, this); + }, + + + removeNodeKeepChildren : function( node) + { + + ar = Array.from(node.childNodes); + for (var i = 0; i < ar.length; i++) { + + node.removeChild(ar[i]); + // what if we need to walk these??? + node.parentNode.insertBefore(ar[i], node); + + } + node.parentNode.removeChild(node); } }; @@ -45835,25 +45948,36 @@ Roo.htmleditor.FilterKeepChildren = function(cfg) if (this.tag === false) { return; // dont walk.. (you can use this to use this just to do a child removal on a single tag ) } + // hacky? + if ((typeof(this.tag) == 'object' && this.tag.indexOf(":") > -1)) { + this.cleanNamespace = true; + } + this.walk(cfg.node); } Roo.extend(Roo.htmleditor.FilterKeepChildren, Roo.htmleditor.FilterBlack, { - + cleanNamespace : false, // should really be an option, rather than using ':' inside of this tag. replaceTag : function(node) { // walk children... - //Roo.log(node); + //Roo.log(node.tagName); var ar = Array.from(node.childNodes); //remove first.. + for (var i = 0; i < ar.length; i++) { - if (ar[i].nodeType == 1) { + var e = ar[i]; + if (e.nodeType == 1) { if ( - (typeof(this.tag) == 'object' && this.tag.indexOf(ar[i].tagName) > -1) + (typeof(this.tag) == 'object' && this.tag.indexOf(e.tagName) > -1) || // array and it matches - (typeof(this.tag) == 'string' && this.tag == ar[i].tagName) + (typeof(this.tag) == 'string' && this.tag == e.tagName) + || + (e.tagName.indexOf(":") > -1 && typeof(this.tag) == 'object' && this.tag.indexOf(":") > -1) + || + (e.tagName.indexOf(":") > -1 && typeof(this.tag) == 'string' && this.tag == ":") ) { this.replaceTag(ar[i]); // child is blacklisted as well... continue; @@ -45871,6 +45995,7 @@ Roo.extend(Roo.htmleditor.FilterKeepChildren, Roo.htmleditor.FilterBlack, } } + //Roo.log("REMOVE:" + node.tagName); node.parentNode.removeChild(node); return false; // don't walk children @@ -46030,7 +46155,13 @@ Roo.extend(Roo.htmleditor.FilterTableWidth, Roo.htmleditor.Filter, Roo.htmleditor.FilterWord = function(cfg) { // no need to apply config. - this.walk(cfg.node); + this.replaceDocBullets(cfg.node); + + this.replaceAname(cfg.node); + // this is disabled as the removal is done by other filters; + // this.walk(cfg.node); + + } Roo.extend(Roo.htmleditor.FilterWord, Roo.htmleditor.Filter, @@ -46080,7 +46211,10 @@ Roo.extend(Roo.htmleditor.FilterWord, Roo.htmleditor.Filter, node.removeChild(cn); node.parentNode.insertBefore(cn, node); // move node to parent - and clean it.. - this.replaceTag(cn); + if (cn.nodeType == 1) { + this.replaceTag(cn); + } + } node.parentNode.removeChild(node); /// no need to iterate chidlren = it's got none.. @@ -46132,7 +46266,246 @@ Roo.extend(Roo.htmleditor.FilterWord, Roo.htmleditor.Filter, + }, + + styleToObject: function(node) + { + var styles = (node.getAttribute("style") || '').split(";"); + var ret = {}; + Roo.each(styles, function(s) { + if (!s.match(/:/)) { + return; + } + var kv = s.split(":"); + + // what ever is left... we allow. + ret[kv[0].trim()] = kv[1]; + }); + return ret; + }, + + + replaceAname : function (doc) + { + // replace all the a/name without.. + var aa = Array.from(doc.getElementsByTagName('a')); + for (var i = 0; i < aa.length; i++) { + var a = aa[i]; + if (a.hasAttribute("name")) { + a.removeAttribute("name"); + } + if (a.hasAttribute("href")) { + continue; + } + // reparent children. + this.removeNodeKeepChildren(a); + + } + + + + }, + + + + replaceDocBullets : function(doc) + { + // this is a bit odd - but it appears some indents use ql-indent-1 + //Roo.log(doc.innerHTML); + + var listpara = Array.from(doc.getElementsByClassName('MsoListParagraphCxSpFirst')); + for( var i = 0; i < listpara.length; i ++) { + listpara[i].className = "MsoListParagraph"; + } + + listpara = Array.from(doc.getElementsByClassName('MsoListParagraphCxSpMiddle')); + for( var i = 0; i < listpara.length; i ++) { + listpara[i].className = "MsoListParagraph"; + } + listpara = Array.from(doc.getElementsByClassName('MsoListParagraphCxSpLast')); + for( var i = 0; i < listpara.length; i ++) { + listpara[i].className = "MsoListParagraph"; + } + listpara = Array.from(doc.getElementsByClassName('ql-indent-1')); + for( var i = 0; i < listpara.length; i ++) { + listpara[i].className = "MsoListParagraph"; + } + + // this is a bit hacky - we had one word document where h2 had a miso-list attribute. + var htwo = Array.from(doc.getElementsByTagName('h2')); + for( var i = 0; i < htwo.length; i ++) { + if (htwo[i].hasAttribute('style') && htwo[i].getAttribute('style').match(/mso-list:/)) { + htwo[i].className = "MsoListParagraph"; + } + } + listpara = Array.from(doc.getElementsByClassName('MsoNormal')); + for( var i = 0; i < listpara.length; i ++) { + if (listpara[i].hasAttribute('style') && listpara[i].getAttribute('style').match(/mso-list:/)) { + listpara[i].className = "MsoListParagraph"; + } else { + listpara[i].className = "MsoNormalx"; + } + } + + listpara = doc.getElementsByClassName('MsoListParagraph'); + // Roo.log(doc.innerHTML); + + + + while(listpara.length) { + + this.replaceDocBullet(listpara.item(0)); + } + + }, + + + + replaceDocBullet : function(p) + { + // gather all the siblings. + var ns = p, + parent = p.parentNode, + doc = parent.ownerDocument, + items = []; + + var listtype = 'ul'; + while (ns) { + if (ns.nodeType != 1) { + ns = ns.nextSibling; + continue; + } + if (!ns.className.match(/(MsoListParagraph|ql-indent-1)/i)) { + break; + } + var spans = ns.getElementsByTagName('span'); + if (ns.hasAttribute('style') && ns.getAttribute('style').match(/mso-list/)) { + items.push(ns); + ns = ns.nextSibling; + has_list = true; + if (spans.length && spans[0].hasAttribute('style')) { + var style = this.styleToObject(spans[0]); + if (typeof(style['font-family']) != 'undefined' && !style['font-family'].match(/Symbol/)) { + listtype = 'ol'; + } + } + + continue; + } + var spans = ns.getElementsByTagName('span'); + if (!spans.length) { + break; + } + var has_list = false; + for(var i = 0; i < spans.length; i++) { + if (spans[i].hasAttribute('style') && spans[i].getAttribute('style').match(/mso-list/)) { + has_list = true; + break; + } + } + if (!has_list) { + break; + } + items.push(ns); + ns = ns.nextSibling; + + + } + if (!items.length) { + ns.className = ""; + return; + } + + var ul = parent.ownerDocument.createElement(listtype); // what about number lists... + parent.insertBefore(ul, p); + var lvl = 0; + var stack = [ ul ]; + var last_li = false; + + var margin_to_depth = {}; + max_margins = -1; + + items.forEach(function(n, ipos) { + //Roo.log("got innertHMLT=" + n.innerHTML); + + var spans = n.getElementsByTagName('span'); + if (!spans.length) { + //Roo.log("No spans found"); + + parent.removeChild(n); + + + return; // skip it... + } + + + var num = 1; + var style = {}; + for(var i = 0; i < spans.length; i++) { + + style = this.styleToObject(spans[i]); + if (typeof(style['mso-list']) == 'undefined') { + continue; + } + if (listtype == 'ol') { + num = spans[i].innerText.replace(/[^0-9]+]/g,'') * 1; + } + spans[i].parentNode.removeChild(spans[i]); // remove the fake bullet. + break; + } + //Roo.log("NOW GOT innertHMLT=" + n.innerHTML); + style = this.styleToObject(n); // mo-list is from the parent node. + if (typeof(style['mso-list']) == 'undefined') { + //Roo.log("parent is missing level"); + + parent.removeChild(n); + + return; + } + + var margin = style['margin-left']; + if (typeof(margin_to_depth[margin]) == 'undefined') { + max_margins++; + margin_to_depth[margin] = max_margins; + } + nlvl = margin_to_depth[margin] ; + + if (nlvl > lvl) { + //new indent + var nul = doc.createElement(listtype); // what about number lists... + if (!last_li) { + last_li = doc.createElement('li'); + stack[lvl].appendChild(last_li); + } + last_li.appendChild(nul); + stack[nlvl] = nul; + + } + lvl = nlvl; + + // not starting at 1.. + if (!stack[nlvl].hasAttribute("start") && listtype == "ol") { + stack[nlvl].setAttribute("start", num); + } + + var nli = stack[nlvl].appendChild(doc.createElement('li')); + last_li = nli; + nli.innerHTML = n.innerHTML; + //Roo.log("innerHTML = " + n.innerHTML); + parent.removeChild(n); + + + + + },this); + + + + } + + + }); /** * @class Roo.htmleditor.FilterStyleToTag @@ -46620,12 +46993,14 @@ Roo.htmleditor.TidyWriter.prototype = { * @param {String} text String to write out. * @param {Boolean} raw Optional raw state if true the contents wont get encoded. */ - text: function(text, node) + text: function(in_text, node) { // if not in whitespace critical - if (text.length < 1) { + if (in_text.length < 1) { return; } + var text = new XMLSerializer().serializeToString(document.createTextNode(in_text)); // escape it properly? + if (this.in_pre) { this.html[this.html.length] = text; return; @@ -47623,7 +47998,17 @@ Roo.htmleditor.KeyEnter.prototype = { var pc = range.closest([ 'ol', 'ul']); var pli = range.closest('li'); if (!pc || e.ctrlKey) { - sel.insertNode('br', 'after'); + // on it list, or ctrl pressed. + if (!e.ctrlKey) { + sel.insertNode('br', 'after'); + } else { + // only do this if we have ctrl key.. + var br = doc.createElement('br'); + br.className = 'clear'; + br.setAttribute('style', 'clear: both'); + sel.insertNode(br, 'after'); + } + this.core.undoManager.addEvent(); this.core.fireEditorEvent(e); @@ -47987,10 +48372,11 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { store : { xtype : 'SimpleStore', data : [ - ['auto'], - ['50%'], + ['100%'], ['80%'], - ['100%'] + ['50%'], + ['20%'], + ['10%'] ], fields : [ 'val'], xns : Roo.data @@ -48044,7 +48430,10 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { pressed : false, enableToggle : true, setValue : function(v) { - this.toggle(v == 'block' ? false : true); + // this trigger toggle. + + this.setText(v ? "Hide Caption" : "Show Caption"); + this.setPressed(v != 'block'); }, listeners : { toggle: function (btn, state) @@ -48083,8 +48472,7 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { style: { width : iw, maxWidth : iw + ' !important', // this is not getting rendered? - margin : m - + margin : m } }; @@ -48125,10 +48513,11 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { // we remove caption totally if its hidden... - will delete data.. but otherwise we end up with fake caption var captionhtml = this.caption_display == 'none' ? '' : (this.caption.length ? this.caption : "Caption"); - return { + + var ret = { tag: 'figure', 'data-block' : 'Figure', - + 'data-width' : this.width, contenteditable : 'false', style : { @@ -48137,7 +48526,7 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { maxWidth : this.align == 'center' ? '100% !important' : (this.width + ' !important'), width : this.align == 'center' ? '100%' : this.width, margin: '0px', - padding: '10px', + padding: this.align == 'center' ? '0' : '0 10px' , textAlign : this.align // seems to work for email.. }, @@ -48155,9 +48544,9 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { fontSize : '16px', lineHeight : '24px', display : this.caption_display, - maxWidth : this.width + ' !important', + maxWidth : (this.align == 'center' ? this.width : '100%' ) + ' !important', margin: m, - width: this.width + width: this.align == 'center' ? this.width : '100%' }, @@ -48186,6 +48575,7 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { } ] }; + return ret; }, @@ -48201,11 +48591,14 @@ Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, { this.align = this.getVal(node, 'figure', 'align'); var figcaption = this.getVal(node, 'figcaption', false); - this.caption = this.getVal(figcaption, 'i', 'html'); + if (figcaption !== '') { + this.caption = this.getVal(figcaption, 'i', 'html'); + } + this.caption_display = this.getVal(node, 'figcaption', 'data-display'); //this.text_align = this.getVal(node, 'figcaption', 'style','text-align'); - this.width = this.getVal(node, 'figcaption', 'style', 'width'); + this.width = this.getVal(node, true, 'data-width'); //this.margin = this.getVal(node, 'figure', 'style', 'margin'); }, @@ -49053,7 +49446,6 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, { */ toObject : function() { - var ret = { tag : 'td', contenteditable : 'true', // this stops cell selection from picking the table. @@ -49094,6 +49486,9 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, { this.colspan = Math.max(1,1*node.getAttribute('colspan')); this.rowspan = Math.max(1,1*node.getAttribute('rowspan')); this.html = node.innerHTML; + if (node.style.textAlign != '') { + this.textAlign = node.style.textAlign; + } }, @@ -49151,7 +49546,7 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, { c.col = cn; } - if (typeof(this.colWidths[cn]) == 'undefined') { + if (typeof(this.colWidths[cn]) == 'undefined' && c.colspan < 2) { this.colWidths[cn] = ce.style.width; if (this.colWidths[cn] != '') { all_auto = false; @@ -49220,6 +49615,9 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, { this.colspan += rc.colspan; this.node.setAttribute('colspan', this.colspan); + var table = this.toTableArray(); + this.normalizeWidths(table); + this.updateWidths(table); }, @@ -49254,19 +49652,17 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, { this.colspan = 1; for(var r = cd.row; r < cd.row + cd.rowspan; r++) { - - + for(var c = cd.col; c < cd.col + cd.colspan; c++) { if (r == cd.row && c == cd.col) { this.node.removeAttribute('rowspan'); this.node.removeAttribute('colspan'); - continue; } var ntd = this.node.cloneNode(); // which col/row should be 0.. - ntd.removeAttribute('id'); // - //ntd.style.width = ''; + ntd.removeAttribute('id'); + ntd.style.width = this.colWidths[c]; ntd.innerHTML = ''; table[r][c] = { cell : ntd, col : c, row: r , colspan : 1 , rowspan : 1 }; } @@ -49274,8 +49670,6 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, { } this.redrawAllCells(table); - - }, @@ -49324,13 +49718,21 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, { el.width = Math.floor(this.colWidths[c]) +'%'; el.updateElement(el.node); } + if (this.colWidths[0] != false && table[r][c].colspan > 1) { + var el = Roo.htmleditor.Block.factory(table[r][c].cell); + var width = 0; + for(var i = 0; i < table[r][c].colspan; i ++) { + width += Math.floor(this.colWidths[c + i]); + } + el.width = width +'%'; + el.updateElement(el.node); + } table[r][c].cell = false; // done } } }, normalizeWidths : function(table) { - if (this.colWidths[0] === false) { var nw = 100.0 / this.colWidths.length; this.colWidths.forEach(function(w,i) { @@ -49818,7 +50220,9 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component, { //Roo.log("HtmlEditorCore:syncValue (EDITOR->TEXT)"); if(this.initialized){ - this.undoManager.addEvent(); + if (this.undoManager) { + this.undoManager.addEvent(); + } var bd = (this.doc.body || this.doc.documentElement); @@ -49838,11 +50242,42 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component, { if (this.enableBlocks) { new Roo.htmleditor.FilterBlock({ node : div }); } + + var html = div.innerHTML; + //?? tidy? - var tidy = new Roo.htmleditor.TidySerializer({ - inner: true - }); - var html = tidy.serialize(div); + if (this.autoClean) { + + new Roo.htmleditor.FilterAttributes({ + node : div, + attrib_white : [ + 'href', + 'src', + 'name', + 'align', + 'colspan', + 'rowspan', + 'data-display', + 'data-width', + 'start' , + 'style', + // youtube embed. + 'class', + 'allowfullscreen', + 'frameborder', + 'width', + 'height', + 'alt' + ], + attrib_clean : ['href', 'src' ] + }); + + var tidy = new Roo.htmleditor.TidySerializer({ + inner: true + }); + html = tidy.serialize(div); + + } if(Roo.isSafari){ @@ -50049,14 +50484,14 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component, { var parser = new Roo.rtf.Parser(cd.getData('text/rtf')); images = parser.doc ? parser.doc.getElementsByType('pict') : []; } - Roo.log(images); + //Roo.log(images); //Roo.log(imgs); // fixme.. images = images.filter(function(g) { return !g.path.match(/^rtf\/(head|pgdsctbl|listtable|footerf)/); }) // ignore headers/footers etc. .map(function(g) { return g.toDataURL(); }) .filter(function(g) { return g != 'about:blank'; }); - + //Roo.log(html); html = this.cleanWordChars(html); var d = (new DOMParser().parseFromString(html, 'text/html')).body; @@ -50074,24 +50509,39 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component, { return false; } + + if (images.length > 0) { + // replace all v:imagedata - with img. + var ar = Array.from(d.getElementsByTagName('v:imagedata')); + Roo.each(ar, function(node) { + node.parentNode.insertBefore(d.ownerDocument.createElement('img'), node ); + node.parentNode.removeChild(node); + }); + + Roo.each(d.getElementsByTagName('img'), function(img, i) { img.setAttribute('src', images[i]); }); } if (this.autoClean) { + new Roo.htmleditor.FilterWord({ node : d }); + new Roo.htmleditor.FilterStyleToTag({ node : d }); new Roo.htmleditor.FilterAttributes({ node : d, - attrib_white : ['href', 'src', 'name', 'align'], + attrib_white : ['href', 'src', 'name', 'align', 'colspan', 'rowspan', 'data-display', 'data-width', 'start'], attrib_clean : ['href', 'src' ] }); new Roo.htmleditor.FilterBlack({ node : d, tag : this.black}); // should be fonts.. - new Roo.htmleditor.FilterKeepChildren({node : d, tag : [ 'FONT', 'O:P' ]} ); + new Roo.htmleditor.FilterKeepChildren({node : d, tag : [ 'FONT', ':' ]} ); new Roo.htmleditor.FilterParagraph({ node : d }); new Roo.htmleditor.FilterSpan({ node : d }); new Roo.htmleditor.FilterLongBr({ node : d }); + new Roo.htmleditor.FilterComment({ node : d }); + + } if (this.enableBlocks) { @@ -50112,7 +50562,7 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component, { if (this.enableBlocks) { Roo.htmleditor.Block.initAll(this.doc.body); } - + e.preventDefault(); return false; @@ -50775,6 +51225,7 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component, { cleanWord : function(node) { new Roo.htmleditor.FilterWord({ node : node ? node : this.doc.body }); + new Roo.htmleditor.FilterKeepChildren({node : node ? node : this.doc.body, tag : [ 'FONT', ':' ]} ); }, @@ -53881,6 +54332,9 @@ clientValidation Boolean Applies to submit only. Pass true to call fo for(id in values){ if(typeof values[id] != 'function' && (field = this.findField(id))){ + + + if (field.setFromData && field.valueField && field.displayField && @@ -53895,6 +54349,9 @@ clientValidation Boolean Applies to submit only. Pass true to call fo sd[field.displayField] = typeof(values[field.name]) == 'undefined' ? '' : values[field.name]; field.setFromData(sd); + } else if (field.inputType && field.inputType == 'radio') { + + field.setValue(values[id]); } else { field.setValue(values[id]); } @@ -53920,7 +54377,7 @@ clientValidation Boolean Applies to submit only. Pass true to call fo /** * Returns the fields in this form as an object with key/value pairs. If multiple fields exist with the same name * they are returned as an array. - * @param {Boolean} asString + * @param {Boolean} asString (def) * @return {Object} */ getValues : function(asString) @@ -54343,7 +54800,7 @@ Roo.extend(Roo.form.Form, Roo.form.BasicForm, { * @cfg {String} itemCls A css class to apply to the x-form-item of fields. This property cascades to child containers. */ /** - * @cfg {String} buttonAlign Valid values are "left," "center" and "right" (defaults to "center") + * @cfg {String} (left|center|right) buttonAlign Valid values are "left," "center" and "right" (defaults to "center") */ buttonAlign:'center', @@ -54353,7 +54810,7 @@ Roo.extend(Roo.form.Form, Roo.form.BasicForm, { minButtonWidth:75, /** - * @cfg {String} labelAlign Valid values are "left," "top" and "right" (defaults to "left"). + * @cfg {String} labelAlign (left|top|right) Valid values are "left," "top" and "right" (defaults to "left"). * This property cascades to child containers if not set. */ labelAlign:'left', @@ -55000,7 +55457,13 @@ Roo.extend(Roo.form.Action.Submit, Roo.form.Action, { } var ret = false; try { - ret = Roo.decode(response.responseText); + var rt = response.responseText; + if (rt.match(/^\