| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 | Ext.require([    'Ext.data.*',    'Ext.panel.Panel',    'Ext.layout.container.Card',    'Ext.tip.QuickTipManager']);Ext.define('Customer', {    extend: 'Ext.data.Model',    fields: [{        name: 'id',        type: 'int'    }, 'name', 'phone'],    associations: [{        model: 'Order',        type: 'hasMany',        autoLoad: true    }],    proxy: {        type: 'ajax',        url: 'customer.php'    }});Ext.define('Order', {    extend: 'Ext.data.Model',    fields: [{        name: 'id',        type: 'int'    },{        name: 'customer_id',        type: 'int'    },{        name: 'date',        type: 'date',        dateFormat: 'Y-m-d'    }],    belongsTo: 'Customer',    associations: [{        model: 'OrderItem',        type: 'hasMany',        autoLoad: true    }],    proxy: {        type: 'ajax',        url: 'order.php'    }});Ext.define('OrderItem', {    extend: 'Ext.data.Model',    fields: [{        name: 'id',        type: 'int'    }, {        name: 'order_id',        type: 'int'    },'product', {        name: 'quantity',        type: 'int'    }, {        name: 'price',        type: 'float'    }],    belongsTo: 'Order',    proxy: {        type: 'ajax',        url: 'orderitem.php'    }});Ext.define('CustomerGrid', {    extend: 'Ext.grid.Panel',    alias: 'widget.customergrid',        title: 'Customers',        initComponent: function(){        Ext.apply(this, {            store: {                autoLoad: true,                model: 'Customer',                listeners: {                    load: function() {                        Logger.log('Customer store loaded', false);                    }                }            },            columns: [{                text: 'Id',                dataIndex: 'id'            },{                text: 'Name',                dataIndex: 'name',                flex: 1            }, {                text: 'Phone',                dataIndex: 'phone'            }],            dockedItems: [{                xtype: 'toolbar',                items: {                    itemId: 'load',                    text: 'Load Orders',                    scope: this,                    handler: this.loadOrders,                    disabled: true                }            }]        });        this.callParent();        this.getSelectionModel().on('selectionchange', this.onSelectChange, this);    },        onSelectChange: function(selModel, selections) {        this.active = selections[0];        this.down('#load').setDisabled(!this.active);    },        loadOrders: function(){        var rec = this.active,            name = rec.get('name'),            owner = this.ownerCt,            orders;                         orders = rec.orders();        if (orders.isLoading()) {            Logger.log('Begin loading orders: ' + rec.getId(), true);        }        orders.on('load', function(){            Logger.log('Order store loaded - ' + rec.getId(), false);        });        owner.add({            title: 'Orders - ' + rec.getId(),            customer: rec,            xtype: 'ordergrid',            store: orders        });        owner.getLayout().next();    }    });Ext.define('OrderGrid', {    extend: 'Ext.grid.Panel',    alias: 'widget.ordergrid',        initComponent: function(){        Ext.apply(this, {            columns: [{                text: 'Id',                dataIndex: 'id'            },{                flex: 1,                text: 'Date',                dataIndex: 'date',                renderer: Ext.util.Format.dateRenderer('Y-m-d')            }],            dockedItems: [{                xtype: 'toolbar',                items: [{                    text: 'Back',                    scope: this,                    handler: this.onBackClick                },{                    itemId: 'load',                    text: 'Load Order Items',                    scope: this,                    handler: this.loadItems,                    disabled: true                }]            }]        });        this.callParent();        this.getSelectionModel().on('selectionchange', this.onSelectChange, this);    },        onBackClick: function(){        this.ownerCt.getLayout().prev();        this.destroy();        },        onSelectChange: function(selModel, selections) {        this.active = selections[0];        this.down('#load').setDisabled(!this.active);    },        loadItems: function(){        var customerName = this.customer.get('name'),            rec = this.active,            date = Ext.Date.format(rec.get('date'), 'Y-m-d'),            owner = this.ownerCt,            orderitems;                orderitems = rec.orderitems();        if (orderitems.isLoading()) {            Logger.log('Begin loading order items - ' + rec.getId(), true);        }        orderitems.on('load', function(){            Logger.log('Order items loaded - ' + rec.getId(), false);        });        owner.add({            title: 'Order Items - ' + rec.getId(),            xtype: 'orderitemgrid',            store: orderitems        });        owner.getLayout().next();    }    });Ext.define('OrderItemGrid', {    extend: 'Ext.grid.Panel',    alias: 'widget.orderitemgrid',        initComponent: function(){        Ext.apply(this, {            columns: [{                text: 'Id',                dataIndex: 'id'            },{                flex: 1,                text: 'Product',                dataIndex: 'product'            }, {                text: 'Quantity',                dataIndex: 'quantity'            }, {                text: 'Price',                dataIndex: 'price',                renderer: Ext.util.Format.usMoney            }],            dockedItems: [{                xtype: 'toolbar',                items: [{                    text: 'Back',                    scope: this,                    handler: this.onBackClick                }, {                    itemId: 'load',                    text: 'Parent association loader',                    tooltip: 'Demonstrate loading parent relationships - A new record will be created so we ignore any previous associations setup',                    scope: this,                    handler: this.onLoadClick,                    disabled: true                }]            }]        });        this.callParent();        this.getSelectionModel().on('selectionchange', this.onSelectChange, this);    },        onSelectChange: function(selModel, selections) {        this.active = selections[0];        this.down('#load').setDisabled(!this.active);    },        onBackClick: function(){        this.ownerCt.getLayout().prev();        this.destroy();        },        onLoadClick: function(){        var rec = this.active,            id = rec.getId();                new ItemLoader({            width: 400,            height: 400,            modal: true,            title: this.title.replace('Order Items', 'Order Item ' + id),            orderItemData: rec.data,            orderItemId: id        }).show();    }});Ext.define('ItemLoader', {    extend: 'Ext.window.Window',        initComponent: function(){        Ext.apply(this, {            border: false,            autoScroll: true,            dockedItems: [{                xtype: 'toolbar',                items: [{                    text: 'Print order detail',                    scope: this,                    handler: this.onOrderClick                }, {                    itemId: 'company',                    text: 'Print company detail',                    disabled: true,                    scope: this,                    handler: this.onCompanyClick                }]            }],            bodyPadding: 5,            tpl: '<div>{type} {id} - {value}</div>',            tplWriteMode: 'append'        });        this.callParent();        this.orderItem = new OrderItem(this.orderItemData, this.orderItemId);    },        onOrderClick: function(){        var id = this.orderItem.get('order_id'),            hasOrder = !!this.order;                    if (!hasOrder) {            Logger.log('Begin loading order - ' + id, true);        }        this.orderItem.getOrder({            scope: this,            success: function(order){                this.order = order;                this.down('#company').enable();                if (!hasOrder) {                    Logger.log('Order loaded - ' + id, false);                }                this.update({                    type: 'Order',                    id: order.getId(),                    value: Ext.Date.format(order.get('date'), 'Y-m-d')                });            }        });    },        onCompanyClick: function(){        var id = this.order.get('customer_id'),            hasCustomer = !!this.customer;                    if (!hasCustomer) {            Logger.log('Begin loading customer - ' + id, true);        }        this.order.getCustomer({            scope: this,            success: function(customer){                this.customer = customer;                if (!hasCustomer) {                    Logger.log('Customer loaded - ' + id, false);                }                this.update({                    type: 'Customer',                    id: customer.getId(),                    value: customer.get('name')                });            }        });    }    });Logger = (function(){    var panel;        return {        init: function(log){            panel = log;        },                log: function(msg, isStart){            panel.update({                now: new Date(),                cls: isStart ? 'beforeload' : 'afterload',                msg: msg            });            panel.body.scroll('b', 100000, true);        }        };})();Ext.onReady(function(){        var main = Ext.create('Ext.panel.Panel', {        renderTo: document.body,        width: 750,        height: 400,        border: false,        layout: {            type: 'vbox',            align: 'stretch'        },        items: [{            height: 200,            xtype: 'container',            layout: 'card',            margin: '0 0 5 0'        }, {            flex: 1,            title: 'Loader log',            tplWriteMode: 'append',            tpl: '<div class="{cls}">[{now:date("H:i:s")}] - {msg}</div>',            bodyPadding: 5,            autoScroll: true,            listeners: {                render: Logger.init            }        }]    });    Logger.log('Begin loading customer store', true);    main.items.first().add({        xtype: 'customergrid'    });    });
 |