1. #1
    Sencha User
    Join Date
    Nov 2007
    Posts
    243
    Vote Rating
    0
    JamesC is on a distinguished road

      0  

    Default Ext.layout.TableFormLayout (v2)

    Ext.layout.TableFormLayout (v2)


    This is a replacement for the old unmaintained TableFormLayout (here), and allows form elements to be rendered in a table. It supports anchoring and the standard table layout column spanning etc.

    Code is attached and can be dropped directly into examples directory

    N.B
    The columnWidths in the layoutConfig are optional, if not specified the columns will be evenly distributed.

    -------------------------------- 3.0 update
    Currently this is not supported by ext js 3.0 due to the overriding of fieldTpl in container layout which breaks *everything*. I'm working on a 3.0 compatible version (nearly finished), but will post it in the 3.0 forums when its done and the forums exist...
    Attached Images
    Attached Files
    Last edited by JamesC; 18 Apr 2009 at 1:33 AM. Reason: 3.0 info

  2. #2
    Ext User
    Join Date
    Sep 2008
    Posts
    1
    Vote Rating
    0
    Einar is on a distinguished road

      0  

    Default Hidden Fields

    Hidden Fields


    I would like to be able to hide some of the form fields depending on the current user's role. If I hide a textfield, only the text field it self gets hidden, not the fieldlabel. I'm not very familiar with forms in ExtJs in general so I don't know if this is also the case when the layout is set to "form".

    Shouldn't the label get display:none when I set the hidden configuration property?

    Code:
    {
        xtype: "textfield",
        fieldLabel: "Password",
        allowBlank: false,
        hidden:true
    }

  3. #3
    Sencha User
    Join Date
    Nov 2007
    Posts
    243
    Vote Rating
    0
    JamesC is on a distinguished road

      0  

    Default


    I believe this is a known issue in extjs form fields and not related to this extension... suggest you seach elsewhere on the forums for it!

  4. #4
    Ext JS Premium Member
    Join Date
    Oct 2008
    Location
    Atlanta
    Posts
    3
    Vote Rating
    0
    ComputerSnacks is on a distinguished road

      0  

    Question Apply classes to individual rows?

    Apply classes to individual rows?


    Is there a way to apply a class to an individual row in a table?

    I'd like to apply a background image to certain rows and individually applying the class to the cells individually does not produce the desired effect.

  5. #5
    Ext JS Premium Member
    Join Date
    Oct 2008
    Location
    Atlanta
    Posts
    3
    Vote Rating
    0
    ComputerSnacks is on a distinguished road

      0  

    Default


    @Einar:

    You may want to try setting the hideLabel property on the form items you want to hide to true:

    {
    xtype: "textfield",
    fieldLabel: "Password",
    allowBlank: false,
    hidden:true,
    hideLabel: true
    }

  6. #6
    Ext JS Premium Member
    Join Date
    Oct 2007
    Location
    Herndon, VA
    Posts
    265
    Vote Rating
    3
    durlabh is on a distinguished road

      0  

    Default


    Is there a way to set different labelWidths for different columns?

  7. #7
    Sencha User
    Join Date
    Nov 2007
    Posts
    243
    Vote Rating
    0
    JamesC is on a distinguished road

      0  

    Default


    Nope that's not supported at the minute sorry!

  8. #8
    Ext JS Premium Member
    Join Date
    Oct 2007
    Location
    Herndon, VA
    Posts
    265
    Vote Rating
    3
    durlabh is on a distinguished road

      0  

    Default


    In my case, in TableFormLayout, I needed to specify individual labelWidths for columns. Hence, I expanded on the OP's code a bit. Now, you should be able to say something like:

    Code:
                    {
                        xtype: 'panel',
                        layout: 'tableform',
                        border: false,
                        layoutConfig: { columns: 2, columnWidths: [0.65, 0.35], columnLabelWidths: [73, 20] },
                        items: [
                            { fieldLabel: 'Created By:', xtype: 'textfield', colspan: 2 },
                            { fieldLabel: 'Creation Date:', xtype: 'datefield' },
                            { fieldLabel: 'to:', xtype: 'datefield' },
                            { fieldLabel: 'Modified By', xtype: 'textfield', colspan: 2 },
                            { fieldLabel: 'Modified Date:', xtype: 'datefield' },
                            { fieldLabel: 'to:', xtype: 'datefield' }
                        ]
                    }
    Here are the changes:

    Code:
    Ext.ux.TableFormLayout = Ext.extend(Ext.layout.TableLayout, {
        monitorResize: true,
        setContainer: function() {
            Ext.layout.FormLayout.prototype.setContainer.apply(this, arguments);
            this.currentRow = 0;
            this.currentColumn = 0;
            this.cells = [];
        },
        renderItem: function(c, position, target) {
            if (c && !c.rendered) {
                var cell = Ext.get(this.getNextCell(c));
                cell.addClass("x-table-layout-column-" + this.currentColumn);
                if (c && !c.rendered && c.isFormField && c.inputType != 'hidden') {
                    var elementStyle = this.elementStyle;
                    var labelStyle = this.labelStyle;
    
                    if (this.columnLabelWidths) {
                        var labelWidth = this.columnLabelWidths[this.currentColumn];
                        if (labelWidth) {
                            var pad = (typeof this.labelPad == 'number' ? this.labelPad : 5);
                            labelStyle = "width:" + labelWidth + "px;";
                            elementStyle = "padding-left:" + (labelWidth + pad) + 'px';
                        }
                    }
    
                    var args = [
                       c.id, c.fieldLabel,
                       this.getLabelStyle(labelStyle, c.labelStyle),
                       elementStyle || '',
                       typeof c.labelSeparator == 'undefined' ? this.labelSeparator : c.labelSeparator,
                       (c.itemCls || this.container.itemCls || '') + (c.hideLabel ? ' x-hide-label' : ''),
                       c.clearCls || 'x-form-clear-left'
                    ];
                    if (typeof position == 'number') {
                        position = cell.dom.childNodes[position] || null;
                    }
                    if (position) {
                        this.fieldTpl.insertBefore(position, args);
                    } else {
                        this.fieldTpl.append(cell, args);
                    }
                    c.render('x-form-el-' + c.id);
                } else {
                    Ext.layout.FormLayout.superclass.renderItem.call(this, c, 0, cell);
                }
            }
        },
        getAnchorViewSize: function(ct, target) {
            return target.dom == document.body ? target.getViewSize() : target.getStyleSize();
        },
        onLayout: function(ct, target) {
            Ext.ux.TableFormLayout.superclass.onLayout.call(this, ct, target);
            if (!target.hasClass("x-table-form-layout-ct")) {
                target.addClass("x-table-form-layout-ct");
            }
            var viewSize = this.getAnchorViewSize(ct, target);
            var aw, ah;
            if (ct.anchorSize) {
                if (typeof ct.anchorSize == "number") {
                    aw = ct.anchorSize;
                } else {
                    aw = ct.anchorSize.width;
                    ah = ct.anchorSize.height;
                }
            } else {
                aw = ct.initialConfig.width;
                ah = ct.initialConfig.height;
            }
            var cs = ct.items.items, len = cs.length, i, j, c, a, cw, ch;
            var x, w, h, col, colWidth, offset;
            for (i = 0; i < len; i++) {
                c = cs[i];
                // get table cell
                x = c.getEl().parent(".x-table-layout-cell");
                if (this.columnWidths) {
                    // get column
                    col = parseInt(x.dom.className.replace(/.*x\-table\-layout\-column\-([\d]+).*/, "$1"));
                    // get cell width (based on column widths)
                    colWidth = 0, offset = 0;
                    for (j = col; j < (col + (c.colspan || 1)); j++) {
                        colWidth += this.columnWidths[j];
                        offset += 10;
                    }
                    w = (viewSize.width * colWidth) - offset;
                } else {
                    // get cell width
                    w = (viewSize.width / this.columns) * (c.colspan || 1);
                }
                // set table cell width
                x.setWidth(w);
                // get cell width (-10 for spacing between cells) & height to be base width of anchored component
                w = w - 10;
                h = x.getHeight();
                // perform anchoring
                if (c.anchor) {
                    a = c.anchorSpec;
                    if (!a) {
                        var vs = c.anchor.split(" ");
                        c.anchorSpec = a = {
                            right: this.parseAnchor(vs[0], c.initialConfig.width, aw),
                            bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah)
                        };
                    }
                    cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined;
                    ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined;
                    if (cw || ch) {
                        c.setSize(cw || undefined, ch || undefined);
                    }
                }
            }
        },
        parseAnchor: function(a, start, cstart) {
            if (a && a != "none") {
                var last;
                if (/^(r|right|b|bottom)$/i.test(a)) {
                    var diff = cstart - start;
                    return function(v) {
                        if (v !== last) {
                            last = v;
                            return v - diff;
                        }
                    };
                } else if (a.indexOf("%") != -1) {
                    var ratio = parseFloat(a.replace("%", "")) * .01;
                    return function(v) {
                        if (v !== last) {
                            last = v;
                            return Math.floor(v * ratio);
                        }
                    };
                } else {
                    a = parseInt(a, 10);
                    if (!isNaN(a)) {
                        return function(v) {
                            if (v !== last) {
                                last = v;
                                return v + a;
                            }
                        };
                    }
                }
            }
            return false;
        },
        adjustWidthAnchor: function(value, comp) {
            return value - (comp.isFormField ? (comp.hideLabel ? 0 : this.labelAdjust) : 0);
        },
        adjustHeightAnchor: function(value, comp) {
            return value;
        },
        getLabelStyle: function(labelBaseStyle, s) {
            var ls = '', items = [labelBaseStyle, s];
            for (var i = 0, len = items.length; i < len; ++i) {
                if (items[i]) {
                    ls += items[i];
                    if (ls.substr(-1, 1) != ';') {
                        ls += ';'
                    }
                }
            }
            return ls;
        }
    });

  9. #9
    Ext User
    Join Date
    Feb 2009
    Posts
    53
    Vote Rating
    0
    MacSimon is on a distinguished road

      0  

    Default


    Hi,

    I've implemented the TableFormLayout and it works quite nicely for me.
    I just have one problem.

    I would like to vertically align a cell to the top (the cell has a rowspan and is now centered)

    Thanks

  10. #10
    Ext JS Premium Member
    Join Date
    Oct 2008
    Location
    Nuremberg, Germany
    Posts
    49
    Vote Rating
    0
    dreas is on a distinguished road

      0  

    Default


    Any news on the 3.0 compatible version?

Turkiyenin en sevilen filmlerinin yer aldigi xnxx internet sitemiz olan ve porn sex tarzi bir site olan mobil porno izle sitemiz gercekten dillere destan bir durumda herkesin sevdigi bir site olarak tarihe gececege benziyor. Sitenin en belirgin ozelliklerinden birisi de Turkiyede gercekten kaliteli ve muntazam, duzenli porno izle siteleri olmamasidir. Bu yuzden iste. Ayrica en net goruntu kalitesine sahip adresinde yayinlanmaktadir. Mesela diğer sitelerimizden bahsedecek olursak, en iyi hd porno video arşivine sahip bir siteyiz. "The Best anal porn videos and slut anus, big asses movies set..."