1. #291
    Sencha Premium Member tempvalue's Avatar
    Join Date
    Apr 2012
    Location
    istanbul
    Posts
    22
    Vote Rating
    0
    tempvalue is on a distinguished road

      0  

    Default


    You saved my day. Thank you, it is working. The minor bugs that i found so far:
    1)When grouping field is selected via column context menu. Multi grouping disables.
    2)Instead of showing sub grouping field in its column position, it can be removed completely.
    I dont know if you continue to develop the code. But please dont forget to share if you improve it. I will try to add some functionality. I will share it if i can success.
    Best regards,

  2. #292
    Sencha User
    Join Date
    Sep 2008
    Posts
    3
    Vote Rating
    5
    miha is on a distinguished road

      1  

    Default


    Thank you, for searching bugs.
    Yes, I will be working on it, because I have similar task at my work.
    So , this is only first draft version - I just want to show that it is possible and how to achieve such functionality.
    Also, everyone can improve it too - and as a result we will get useful plugin.

  3. #293
    Sencha User
    Join Date
    Dec 2009
    Posts
    52
    Vote Rating
    6
    TonyBones is on a distinguished road

      0  

    Default 3.x Support?

    3.x Support?


    Has any one toyed with converting this to ExtJS 3.4? I've tried using what was on JAFFA Sourceforge but there are render issues and exceptions. Although it does seem to do the grouping.

    If not does, anyone know of any good migration guides for converting 2.x to 3.x? I'd REALLY like to get this working for 3.4. And I'm willing to do the work, just could use a push in the right direction.

    Thanks,
    Tony

  4. #294
    Ext Premium Member yyogev's Avatar
    Join Date
    Jun 2009
    Location
    Shoham, Israel
    Posts
    196
    Vote Rating
    6
    yyogev is on a distinguished road

      0  

    Default


    Quote Originally Posted by TonyBones View Post
    Has any one toyed with converting this to ExtJS 3.4? I've tried using what was on JAFFA Sourceforge but there are render issues and exceptions. Although it does seem to do the grouping.

    If not does, anyone know of any good migration guides for converting 2.x to 3.x? I'd REALLY like to get this working for 3.4. And I'm willing to do the work, just could use a push in the right direction.

    Thanks,
    Tony
    Hello Tony,

    I had it working in 3.4 before I moved to ExtJS 4 and dumped it altogether...
    If you look back at this thread you'll see I posted my fixes here.

    HTH
    Yaron Yogev

    IT Software Developer

  5. #295
    Sencha User
    Join Date
    Dec 2009
    Posts
    52
    Vote Rating
    6
    TonyBones is on a distinguished road

      0  

    Default


    Quote Originally Posted by yyogev View Post
    Hello Tony,

    I had it working in 3.4 before I moved to ExtJS 4 and dumped it altogether...
    If you look back at this thread you'll see I posted my fixes here.

    HTH
    Aaaah, I didn't find the 3.x forum thread in my searching, weird.
    I'll move over there.

    FYI, I almost have the Jaffa sources working in 3.4. Just one last bug, the same as the last post on 3.x thread,
    Code:
    Ext.fly(rows[0]) is null
    Ext.fly(rows[0]).addClass(this.firstRowCls);
    I'm gonna dig into that today. The problem is that rows is an empty array, so rows[0] is null. But what's weird is that its all Ext base code in the stack trace.

    Some other things to note:
    - I removed the drag N drop and toolbar support because my system is already using the grid's top toolbar and this plugin was overwriting my toolbar completely. I may reintegrate it later at some point but for now, its all gone and you have to use the menu pull down to add/remove groups.
    - I added support for column model's group renderer callback functions. Not sure why but this was something that was left out of the original impl and was something I am currently using. So that's in and working again.
    - Fixed a number of other 3.x bugs to get everything working again, the processEvent override, group row collapsing/expanding, regex error fix.

    My next post will be in the 3.x forum if any one else needs to follow along.
    Last edited by TonyBones; 13 Jun 2012 at 10:01 AM. Reason: removed incorrect assesment

  6. #296
    Sencha User
    Join Date
    Sep 2008
    Posts
    3
    Vote Rating
    5
    miha is on a distinguished road

      1  

    Default Multi grouping for ExtJS 4. Second draft version

    Multi grouping for ExtJS 4. Second draft version


    Hi everyone.

    I have just finished working on my project which includes Multi grouping feature for ExtJS 4. And I am sharing it with you.
    Some notes according to my plugin:
    - it is flexible
    - it is more for developers than for users
    - Store, Grouping feature, Grid, and their declarations are closely related.

    In the example I want to show all the possibilities of the plugin.

    Code:
    //some help function
    var DateDiff = {//for correct Date difference
        inDays: function(d1, d2) {
            var t2 = d2.getTime();
            var t1 = d1.getTime();
    
            return parseInt((t2 - t1) / (24 * 3600 * 1000));
        },
    
        inWeeks: function(d1, d2) {
            var t2 = d2.getTime();
            var t1 = d1.getTime();
    
            return parseInt((t2 - t1) / (24 * 3600 * 1000 * 7));
        },
    
        inMonths: function(d1, d2) {
            var d1Y = d1.getFullYear();
            var d2Y = d2.getFullYear();
            var d1M = d1.getMonth();
            var d2M = d2.getMonth();
    
            return (d2M + 12 * d2Y) - (d1M + 12 * d1Y);
        },
    
        inYears: function(d1, d2) {
            return d2.getFullYear() - d1.getFullYear();
        }
    };
    var MyExt = {};
    MyExt.val_cmp = function(v1, v2) {
        if (v1 == undefined || v2 == undefined) return false;
        switch (typeof v1) {
            case "object":
                switch (Object.prototype.toString.call(v1)) {
                    case "[object Date]"://for correct Date compare
                        return DateDiff.inDays(v1, v2) == 0;
                        break;
                }
                break;
            default:
                return v1 == v2;
        }
    };
    //END some help function
    
    //Multigrouping Plugin
    //Store
    Ext.define('Ext.data.StoreEx', {
        extend: 'Ext.data.Store',
    
        constructor: function(config) {
            this.callParent(arguments);
    
            if (this.total) this.total();
        },
    
        //the main function. in this function data is grouping and all calculations are done according to the user's defined aggregate functions
        getGroups: function(requestGroupString) {
            var me = this;
            var records = this.data.items,
                length = records.length,
                groups = [],
                pointers = {},
                record,
                groupStr,
                group,
                i;
    
            if (this.total) this.total_reset();
    
            var len = 0;
            var fields = [];
            var fns = [];
            var fn_cmp = [];
            var agr = [];
            var collapsed = [];
            var row_cls = [];
    
    
            this.groupers.each(function(item) {
                fields.push(item.property);
                fns.push(item.fn);
                fn_cmp.push(item.fn_cmp);
                agr.push(new Array());
                collapsed.push(item.collapsed);
                row_cls.push(item.row_cls);
                len++;
            });
    
            var arr_val = new Array(len);
            var arr_iter = new Array(len);
    
            var val, iter, new_per, grp_td;
            iter = groups;
            for (i = 0; i < length; i++) {
    
                record = records[i];
    
                if (this.total) this.total_call(record);
    
                new_per = false;
                grp_td = "";
                for (var j = 0; j < len; j++) {
                    val = record.get(fields[j]);
                    if (new_per || (fn_cmp[j] ? !fn_cmp[j](val, arr_val[j]) : !MyExt.val_cmp(val, arr_val[j]))) {
    
                        if (arr_iter[j]) {
                            arr_iter[j].agrval = fns[j](agr[j]);
                            arr_iter[j].collapsed = (Ext.isFunction(collapsed[j]) ? collapsed[j](arr_iter[j].agrval, arr_iter[j].ind) : collapsed[j]);
                            agr[j].length = 0;
                        }
                        
                        iter.push({
                            name: val,
                            children: [],
                            last_grp: (j == len - 1),                        
                            row_cls: row_cls[j],
                            ind: iter.length                        
                        });
                        arr_iter[j] = iter[iter.length - 1];
    
                        arr_val[j] = val;
                        new_per = true;
                        iter = iter[iter.length - 1].children;
                    }
                    else {
                        iter = iter[iter.length - 1].children;
                    }
                }
                iter.push(record);
                for (var ii = 0; ii < len; ii++) {
                    agr[ii].push(record);
                }
    
                iter = groups;
            }
    
            //calculate last groups
            for (var j = 0; j < len; j++) {
                if (arr_iter[j]) {
                    arr_iter[j].agrval = fns[j](agr[j]);
                    arr_iter[j].collapsed = (Ext.isFunction(collapsed[j]) ? collapsed[j](arr_iter[j].agrval, arr_iter[j].ind) : collapsed[j]);
                    agr[j].length = 0;
                }
                iter = iter[iter.length - 1].children;
            }
    
            if (this.total) arr_iter[0].total = this.total_get();
    
            
            return groups;
        }
    });
    //Grouping feature
    Ext.define('Ext.grid.feature.GroupingEx', {
        extend: 'Ext.grid.feature.Grouping',
        alias: 'feature.groupingex',
    
        //storeGroupers: [],
    
        eventSelector: '.' + Ext.baseCSSPrefix + 'grid-group-hd1',
    
        mixins: {
            summary: 'Ext.grid.feature.AbstractSummary'
        },
    
        getGroupRows: function(group, records, preppedRecords, fullWidth) {
            var me = this,
                children = group.children,
                rows = group.rows = [],
                view = me.view;
            group.viewId = view.id;
    
            if (group.last_grp) {
                Ext.Array.each(records, function(record, idx) {
                    if (Ext.Array.indexOf(children, record) != -1) {
                        rows.push(Ext.apply(preppedRecords[idx], {
                            depth: 1
                        }));
                    }
                });
            }
            else {
                Ext.Array.each(children, function(chl, idx) {
                    rows.push(me.getGroupRows(chl, records, preppedRecords, fullWidth));
                });
            }
    
    
            delete group.children;
    
    
            group.fullWidth = fullWidth;
            if (me.collapsedState[view.id + '-gp-' + group.name] || group.collapsed) {
                group.collapsedCls = me.collapsedCls;
                group.hdCollapsedCls = me.hdCollapsedCls;
            }
    
            return group;
        },
        getFeatureTpl: function(values, parent, x, xcount) {
            var me = this;
    
            return [
                '<tpl if="typeof rows !== \'undefined\'">',
    
                    '{[this.printGroupRow(values)]}',
    
                    '<tr id="{viewId}-gp-{name}" class="' + Ext.baseCSSPrefix + 'grid-group-body ' + (me.startCollapsed ? me.collapsedCls : '') + ' {collapsedCls}"><td colspan="' + parent.columns.length + '">{[this.recurse(values)]}</td></tr>',
    
                    '{[(values.agrval ? ( values.agrval.sum ? this.printSummaryRow(values) : "") : "" )]}',
    
                    '{[(values.total ? this.printTotalRow(values.total) : "" )]}',
    
                '</tpl>'
            ].join('');
        },
        //reload metaRowTpl for customizing group row. is called from printGroupRow
        metaRowTpl: [
            '<tr class="{row_cls} ' + Ext.baseCSSPrefix + 'grid-group-hd1 {addlSelector} {[this.embedRowCls()]} {hdCollapsedCls} ' + (this.startCollapsed ? this.hdCollapsedCls : '') + '" {[this.embedRowAttr()]}>',
            //'<tr class="{addlSelector} {[this.embedRowCls()]} {hdCollapsedCls} ' + (this.startCollapsed ? this.hdCollapsedCls : '') + '" {[this.embedRowAttr()]}>',
                '<tpl for="columns">',
                    '<td class="{cls} ' + Ext.baseCSSPrefix + 'grid-cell {grp_cls} ' + Ext.baseCSSPrefix + 'grid-cell-{columnId} {{id}-modified} {{id}-tdCls} {[this.firstOrLastCls(xindex, xcount)]}" {{id}-tdAttr} colspan="{grp_spn}">',
                        '<div unselectable="on" class="' + Ext.baseCSSPrefix + 'grid-cell-inner ' + Ext.baseCSSPrefix + 'unselectable" style="{{id}-style}; text-align: {align};">',
                            '<div class="{grp_title}">{collapsed} {gridGroupValue} </div>',
                        '</div>',
                    '</td>',
                '</tpl>',
            '</tr>'
        ],
    
        getFragmentTpl: function() {
            var me = this,
                fragments = me.callParent();
    
            Ext.apply(fragments, me.getGroupFragments());//custom function getGroupFragments        
            Ext.apply(fragments, me.getTotalFragments());//custom function getTotalFragments
            
            Ext.apply(fragments, me.getSummaryFragments());//use standard function getSummaryFragments
            
            //all calculations are done in the store
            /*if (me.showSummaryRow) {        
                me.summaryGroups = me.view.store.getGroups();
                me.summaryData = me.generateSummaryData();
            }*/
            return fragments;
        },
        getGroupFragments: function() {
            var fragments = {};
            if (true) {
                Ext.apply(fragments, {
                    printGroupRow: Ext.bind(this.printGroupRow, this)                
                });
            }
            return fragments;
        },
        getTotalFragments: function() {
            var fragments = {};
            if (true) {
                Ext.apply(fragments, {
                    printTotalRow: Ext.bind(this.printTotalRow, this)
                });
            }
            return fragments;
        },
    
        //control collapsing and expanding
        _onGroupClick: function() { },
        onGroupClick: function(view, group, idx, foo, e) {
            if (foo.target.className.indexOf('grid-group-title') != -1) {//if click only on group cell (not row)
                //group = group.parentElement;
                var me = this,
                    toggleCls = me.toggleCls,
                    groupBd = Ext.fly(group.nextSibling, '_grouping');
                if (groupBd.hasCls(me.collapsedCls)) {
                    me.expand(groupBd);
                } else {
                    me.collapse(groupBd);
                }
            }
            else this._onGroupClick(view, group, idx, foo, e);
        },
    
    
        //print summary
        //printSummaryRow calls getPrintData
        getPrintData: function(values) {
            var me = this,
                columns = me.view.headerCt.getColumnsForTpl(),
                i = 0,
                length = columns.length,
                data = [],
                //name = me.summaryGroups[index - 1].name,
                //active = me.summaryData[name],
                column;
    
            for (; i < length; ++i) {
                column = columns[i];
    
                //var active = {};
                if (values.agrval) {
                    if (values.agrval.sum) {
                        if (values.agrval.sum.hasOwnProperty(column.dataIndex)) {
                            //active[column.id] = values.agrval.sum[column.dataIndex];
                            column.gridSummaryValue = values.agrval.sum[column.dataIndex];
                        }
                    }
                }
                //column.gridSummaryValue = this.getColumnValue(column, active);
    
                data.push(column);
            }
            return data;
        },
    
        //print total
        printTotalRow: function(total) {
            var inner = this.view.getTableChunker().metaRowTpl.join(''),
                    prefix = Ext.baseCSSPrefix;
            inner = inner.replace(prefix + 'grid-row', prefix + 'grid-row-summary grid-row-summary-total');
            inner = inner.replace('{{id}}', '{gridTotalValue}');
            inner = inner.replace(this.nestedIdRe, '{id$1}');
            inner = inner.replace('{[this.embedRowCls()]}', '{rowCls}');
            inner = inner.replace('{[this.embedRowAttr()]}', '{rowAttr}');
            inner = Ext.create('Ext.XTemplate', inner, {
                firstOrLastCls: Ext.view.TableChunker.firstOrLastCls
            });
    
            return /*this.printBeforeTotal() + */inner.applyTemplate({
                columns: this.getTotalData(total)
            });
        },
        getTotalData: function(total) {
            var me = this,
                columns = me.view.headerCt.getColumnsForTpl(),
                i = 0,
                length = columns.length,
                data = [],
                column;
            for (; i < length; ++i) {
                column = columns[i];
    
                if (total.hasOwnProperty(column.dataIndex)) {
                    //if (total[column.dataIndex].render) column.gridTotalValue = total[column.dataIndex].render;
                    //else column.gridTotalValue = total[column.dataIndex].val;
                    column.gridTotalValue = total[column.dataIndex];
                }
    
                data.push(column);
            }
            return data;
        },
    
        //print group
        printGroupRow: function(values) {
    
            var inner = this.metaRowTpl.join(''),
                prefix = Ext.baseCSSPrefix;
    
            inner = inner.replace(prefix + 'grid-row', prefix + 'grid-row-summary');
            //inner = inner.replace('{{id}}', '{gridGroupValue}');
            inner = inner.replace(this.nestedIdRe, '{id$1}');
            inner = inner.replace('{[this.embedRowCls()]}', '{rowCls}');
            inner = inner.replace('{[this.embedRowAttr()]}', '{rowAttr}');
            inner = Ext.create('Ext.XTemplate', inner, {
                firstOrLastCls: Ext.view.TableChunker.firstOrLastCls
            });
    
            return inner.applyTemplate({
                columns: this.getPrintDataGroup(values),
                row_cls: values.row_cls,
                collapsedCls: values.collapsedCls,
                hdCollapsedCls: values.hdCollapsedCls
            });
        },
    
        getPrintDataGroup: function(values) {
            var me = this,
                    columns = me.view.headerCt.getColumnsForTpl(),
                    i = 0,
                    length = columns.length,
                    data = [],
                    column;
    
            for (; i < length; ++i) {
                column = columns[i];
    
                //var active = {};
                if (values.agrval) {
                    if (values.agrval.grp) {
                        if (values.agrval.grp.hasOwnProperty(column.dataIndex)) {
                            //active[column.id] = values.agrval.grp[column.dataIndex];
    
                            if (values.agrval.grp[column.dataIndex].render) column.gridGroupValue = values.agrval.grp[column.dataIndex].render;
                            else column.gridGroupValue = values.agrval.grp[column.dataIndex].val;
    
                            if (values.agrval.grp[column.dataIndex].sp) {
                                column.grp_spn = values.agrval.grp[column.dataIndex].sp;
                                column.grp_cls = 'grp-td';
                                column.grp_title = Ext.baseCSSPrefix + 'grid-group-title';
                                i += values.agrval.grp[column.dataIndex].sp - 1;
                            }
                            else {
                                column.grp_spn = 1;
                                column.grp_cls = '';
                                column.grp_title = '';
                            }
    
                        }
                    }
                }
                //column.gridSummaryValue = this.getColumnValue(column, active);
                data.push(column);
            }
            return data;
        }
    
    });
    //END Multigrouping Plugin
    
    Ext.onReady(function(){    
    
        var Store = new Ext.data.StoreEx({
            groupers: [
                {
                    property: 'name',
                    collapsed: function(agrval/*object retruned in fn function*/, ind/*index*/) {
                        //determine if current group is collapsed
                        return ind != 0;                    
                    },
                    row_cls: 'border-row-gtr',// some stylesheet class for grouping row
                    fn_cmp: function(a, b) {
                        //some custom function for comparison
                        return a==b;
                    },
                    fn: function(arr/*array of records in the current group*/) {//this function is called in StoreEx.getGroups for each group
                        if (!arr[0]) return;
    
                        var val1 = 0;
                        var val2 = 0;
                        
                        var header = arr[0].get('name');;
    
                        for (var i = 0; i < arr.length; i++) {
                            val1 += arr[i].get('val1');
                            val2 += arr[i].get('val2');
                        }
                        /*
                        have to return such object
                        {
                            'sum': {},//if need to show sum row
                            'grp': {}//obligatory
                        }
                        */
                        return {
                            'sum': { 'name'/*field in the store*/: 'Total'/*value to show in this column*/, "val1": val1 },
                            'grp': {
                                'name': { 'val': header/*value to show in this column*/, 'sp': 2/*collspan property for current column (default 1)*/ },
                                "val2": { 'val': val2 }
                            }
                        };
                    }
                }, {
                    property: 'email',
                    collapsed: true,
                    fn: function(arr) {
                        if (!arr[0]) return;
    
                        var val = arr[0].get('email');
    
                        var val2 = 0;
                        var val3 = true;
    
                        for (var i = 0; i < arr.length; i++) {
                            val2 += arr[i].get('val2');
                            val3 = val3 && arr[i].get('val3');                        
                        }
    
                        return {
                            'grp': {
                                'email': { 'val': val, 'sp': 1 },
                                "val2": { 'val': val2 },
                                "val3G": { 'val': val3, 'render': '<div class="grid-checkheader">click on me: ' + val3 + '</div>' }                            
                            }
                        };
                    }
                }
            ],
            total: function() {//if you need Total row for whole
                var sum = 0;
    
                this.total_reset = function(r) {//is called in the start of StoreEx.getGroups
                    sum = 0;
                };
    
                this.total_call = function(r) {//is called for every record
                    sum += r.get('val1');
                };
    
                this.total_get = function() {//is called in the end to show total row
                    return { 'name': 'Total', "val1": sum };
                };
            },
            fields:['name', 'email', 'val1', 'val2', 'val3'],
            //DATA HAS TO BE SORTED BY GROUPING FIELDS
            //in current example - by name, email
            data:[
                { 'name': 'name1', "email":"em_1_1", "phone":"555-111-1224", "val1": 11, "val2": 10, "val3": true },
                { 'name': 'name1', "email":"em_1_1", "phone":"555-111-1224", "val1": 10, "val2": 10, "val3": true },
                { 'name': 'name1', "email":"em_1_2", "phone":"555-111-1224", "val1": 23, "val2": 53, "val3": false },
                { 'name': 'name2', "email":"em_2_1", "phone":"555-222-1234", "val1": 45, "val2": 67, "val3": false },
                { 'name': 'name2', "email":"em_2_1", "phone":"555-222-1234", "val1": 56, "val2": 45, "val3": true },
                { 'name': 'name2', "email":"em_2_2", "phone":"555-222-1244", "val1": 56, "val2": 43, "val3": false },
                { 'name': 'name2', "email":"em_2_2", "phone":"555-222-1254", "val1": 78, "val2": 23, "val3": true }
            ]
        });
    
        var grid = Ext.create('Ext.grid.Panel', {
            title: 'Multigrouping grid',        
            store: Store,
            columns: [
                { groupable: false, sortable: false,/*disable standard features, also disable in css*/ header: 'Name',  dataIndex: 'name' },
                { groupable: false, sortable: false, header: 'Email', dataIndex: 'email' },
                { groupable: false, sortable: false, header: 'Val1', dataIndex: 'val1' },
                { groupable: false, sortable: false, header: 'Val2', dataIndex: 'val2' },
                { groupable: false, sortable: false, header: 'Val3', dataIndex: 'val3' },
                { groupable: false, sortable: false, header: 'Val3G', dataIndex: 'val3G', flex: 1 }//column which is shown only in group row
            ],
            height: 400,
            width: 700,
            features: [
                {
                    ftype: 'groupingex',
                    strTotal: 'TOTAL',
                    //storeGroupers: Store.groupers,
                    _onGroupClick: function(view, group, idx, foo, e) {
                        if (foo.target.className.indexOf('grid-checkheader') != -1) {
                            alert("some action");
                        }
                    }
                }
            ],
            renderTo: Ext.getBody()
        });
        
    });
    And some css:
    Code:
    <style>
            .border-row-gtr td {
                background: none repeat scroll 0 0 white;
                border-color: #99BBE8;
                border-style: solid;
                border-width: 0 0 2px;
            }
            .grp-td div {
                cursor: pointer !important;
            }
            .x-column-header-trigger{/*disable standard grouping and sorting*/
                display:none !important;
            }
     </style>

  7. #297
    Sencha User
    Join Date
    Oct 2012
    Posts
    2
    Vote Rating
    0
    shrujan07 is on a distinguished road

      0  

    Default help

    help


    can any one please help me out the detailed steps for creating multi groups in grid panel

  8. #298
    Sencha User
    Join Date
    Oct 2012
    Posts
    2
    Vote Rating
    0
    shrujan07 is on a distinguished road

      0  

    Default issue on gridpanel multi grouping

    issue on gridpanel multi grouping


    hello all,
    i have seen the JS for multi grouping, i issue is how can i add this script to the page...
    currently my page has one gridpanel with <view> tag in it,
    so how can i add this script with in the page and where should i call this script
    please help me out from this issue..
    Thanks and regards
    Shrujan Kumar

  9. #299
    Sencha User
    Join Date
    Nov 2012
    Posts
    7
    Vote Rating
    0
    raffyaslanbeily is on a distinguished road

      0  

    Default


    Hi guys,
    I am not completely new to extjs, but this particular matter is new for me.
    Can anyone please help me with grouping summary for this plugin in case of 3.4?
    All code samples found in this thread are related to previous versions, unfortunately
    I have never worked with previous versions and therefore don't know what changes should I do to make it work.
    Kindest regards,
    Raff

  10. #300
    Touch Premium Member
    Join Date
    Sep 2011
    Posts
    9
    Vote Rating
    0
    ilmcon is on a distinguished road

      0  

    Default


    is there any new development in mutlilevel grids for extjs 4.1.3 ?

Thread Participants: 115

  1. galdaka (34 Posts)
  2. karimchebani (1 Post)
  3. mdissel (2 Posts)
  4. mystix (3 Posts)
  5. wayne_o (8 Posts)
  6. akannu (1 Post)
  7. tchitani (8 Posts)
  8. timmy (1 Post)
  9. dhenning23 (1 Post)
  10. DServe (1 Post)
  11. tdikarim (4 Posts)
  12. Nam (1 Post)
  13. ljkmchale (8 Posts)
  14. StaticVoidMain (2 Posts)
  15. sawan (1 Post)
  16. vicirst (1 Post)
  17. jaquet (1 Post)
  18. jerrybrown5 (4 Posts)
  19. ut_paule (10 Posts)
  20. nnextjs (1 Post)
  21. sergeiw (1 Post)
  22. st_gross (1 Post)
  23. emily (5 Posts)
  24. ENEMYoftheSUN (1 Post)
  25. smarttdv (1 Post)
  26. JDevloper (1 Post)
  27. Maharshi (2 Posts)
  28. pbuyle (2 Posts)
  29. cujo13 (2 Posts)
  30. johnstontrav (1 Post)
  31. Jack_S (8 Posts)
  32. DamienValentine (7 Posts)
  33. source78 (1 Post)
  34. cgs1999 (1 Post)
  35. Karmaresh (5 Posts)
  36. praveen.infra (2 Posts)
  37. pops (1 Post)
  38. mcouillard (2 Posts)
  39. maquejp (2 Posts)
  40. bvutukur (3 Posts)
  41. sim (2 Posts)
  42. tBSTAR (4 Posts)
  43. randymay (5 Posts)
  44. Rothariger (1 Post)
  45. shankys_4u (3 Posts)
  46. hpandey (1 Post)
  47. miha (3 Posts)
  48. wp.joju (4 Posts)
  49. oliverseitz (1 Post)
  50. tklever (1 Post)
  51. codingvista (3 Posts)
  52. iamdman (2 Posts)
  53. rene.klatt (1 Post)
  54. yrobla (1 Post)
  55. dmichael (1 Post)
  56. Helton Gon (1 Post)
  57. giovanni (2 Posts)
  58. nacha (1 Post)
  59. Tewr (2 Posts)
  60. snowy8781 (1 Post)
  61. rpnoble (1 Post)
  62. denyall (2 Posts)
  63. vladcd (3 Posts)
  64. rickonodera (1 Post)
  65. yyogev (21 Posts)
  66. daltonjorge (6 Posts)
  67. janasri (1 Post)
  68. dbojdo (1 Post)
  69. Azadi (1 Post)
  70. isit.gd (4 Posts)
  71. blackghost (3 Posts)
  72. dileep singhal (8 Posts)
  73. mrbeig9 (2 Posts)
  74. rupidas (1 Post)
  75. xiaofei (1 Post)
  76. extjsnewb (3 Posts)
  77. nestore2k (1 Post)
  78. TonyBones (2 Posts)
  79. Haron (1 Post)
  80. thorben (1 Post)
  81. amsoft (1 Post)
  82. paivajose (1 Post)
  83. Karthikeyan.rajmohan (1 Post)
  84. alexpotemkin (1 Post)
  85. cristinadelosa (1 Post)
  86. justusvm (4 Posts)
  87. Kunha (1 Post)
  88. rogerio.carrasqueira (1 Post)
  89. krishnaswamy (2 Posts)
  90. jdamani (1 Post)
  91. chavocarlos (2 Posts)
  92. raghuramgreddy (1 Post)
  93. garrythebest (1 Post)
  94. Komal Vaswani (1 Post)
  95. Hari1611 (3 Posts)
  96. sri_dev (1 Post)
  97. Ferny (1 Post)
  98. mosull2 (1 Post)
  99. Manjula (1 Post)
  100. roman.savko (2 Posts)
  101. grace.lawrence (3 Posts)
  102. leolox69 (5 Posts)
  103. fvchapa (1 Post)
  104. ilmcon (1 Post)
  105. pardhu (1 Post)
  106. psianil9 (1 Post)
  107. Golden.Vulture (1 Post)
  108. tempvalue (1 Post)
  109. Vishnu C (1 Post)
  110. shrujan07 (2 Posts)
  111. raffyaslanbeily (1 Post)
  112. srautpyaa (1 Post)
  113. ocr (1 Post)
  114. henriquebotega (1 Post)
  115. rajkumargvrs (2 Posts)

film izle

hd film izle

film sitesi

takipci kazanma sitesi

takipci kazanma sitesi

güzel olan herşey

takipci alma sitesi

komik eğlenceli videolar