2010年6月10日木曜日

ExtJs-87 フォームはさくっと終了させたいなぁ

今日はジョギングしようと思ってたら子供の寝かしつけでぐっすりと。
ビール片手にコーディングです。

ExtJs86でフォームに搭載するコントロールの定型句は決めたので
あとは実装を。
Gridと同様、コントローラとモデルを「わざわざ」作ってあくまでFormPanelを実装から
切り離してみたかった。

で、モデルの基底クラスはこんな感じで固めた。
/// 
Ext.ns('Fwx.BasicCrud');
//abstract class
//config: class Config
//コンストラクタでinitializeメソッドコールすること。
Fwx.BasicCrud.FormModel = function () {
};
Fwx.BasicCrud.FormModel.prototype = {};
(function() {
    var me = this;
    me.form = {};
    me.configGenerator = {};
    //config:formpanel.getform()=Ext.form.Basicform
    me.initialize = function(config) {
        var me = this;
        me.configGenerator = config;
    };
    me.loadFailcallback = function(store, action, result, tran, r) {
        switch (action.failureType) {
            case Ext.form.Action.CLIENT_INVALID:
                Ext.Msg.alert('エラー', 'クライアントサイドでの異常。');
                break;
            case Ext.form.Action.CONNECT_FAILURE:
                Ext.Msg.alert('エラー', '通信エラーが発生しました。');
                break;
            case Ext.form.Action.SERVER_INVALID:
                Ext.Msg.alert('エラー', action.result.msg);
        }
    };
    me.loadSuccesscallback = function(r, options, success) {
        //Ext.Msg.alert('Failure', action.result.msg);
    };
    me.saveFailcallback = function(store, action, result, tran, r) {
        switch (action.failureType) {
            case Ext.form.Action.CLIENT_INVALID:
                Ext.Msg.alert('エラー', '入力されたフォーム情報に不備があります。');
                break;
            case Ext.form.Action.CONNECT_FAILURE:
                Ext.Msg.alert('エラー', '通信エラーが発生しました。');
                break;
            case Ext.form.Action.SERVER_INVALID:
                Ext.Msg.alert('エラー', action.result.msg);
        }
    };
    me.saveSuccesscallback = function(r, options, success) {
        Ext.Msg.alert('成功', '保存しました。');
    };
    me.deleteFailcallback = function(store, action, result, tran, r) {
        switch (action.failureType) {
            case Ext.form.Action.CLIENT_INVALID:
                Ext.Msg.alert('エラー', 'クライアントサイドでの異常');
                break;
            case Ext.form.Action.CONNECT_FAILURE:
                Ext.Msg.alert('エラー', '通信エラーが発生しました。');
                break;
            case Ext.form.Action.SERVER_INVALID:
                Ext.Msg.alert('エラー', action.result.msg);
        }
    };
    me.deleteSuccesscallback = function(r, options, success) {
        var me = this;
        Ext.Msg.alert('成功', '削除しました。');
        me.doReset();
    };
    me.doLoad = function(params) {
        var me = this;
        me.form.load({
            url: me.configGenerator.getFormAPIs().read,
            params: params,
            waitTitle: 'サーバ接続中',
            waitMsg: '読み込んでいます...',
            success: me.loadSuccesscallback,
            failure: me.loadFailcallback
        });
    };
    me.doSave = function(params) {
        var me = this;
        me.form.submit({
            clientValidation: true,
            url: me.configGenerator.getFormAPIs().write,
            params: params,
            waitTitle: 'サーバ接続中',
            waitMsg: '保存しています...',
            success: me.saveSuccesscallback,
            failure: me.saveFailcallback
        });
    };
    me.doDelete = function(params) {
        var me = this;
        me.form.submit({
            clientValidation: true,
            url: me.configGenerator.getFormAPIs().destroy,
            params: params,
            waitTitle: 'サーバ接続中',
            waitMsg: '削除しています...',
            success: me.deleteSuccesscallback,
            failure: me.deleteFailcallback
        });
    };
    me.doReset = function() {
        var me = this;
        me.form.reset();
    };
    me.setForm = function(form) {
        var me = this;
        me.form = form;
    };
}).apply(Fwx.BasicCrud.FormModel.prototype);


で、コントローラはこんなかんじだろうと。
Ext.ns('Fwx.BasicCrud');
//abstract
//config: { model: Model };
//コンストラクタでinitializeメソッドコールすること。
Fwx.BasicCrud.FormControl = function () {};
Fwx.BasicCrud.FormControl.prototype = {};
(function() {
    var me = this;
    //初期化処理
    me.initialize = function(config) {
        var me = this;
        me.model = config.model;
    };
    me.onSave = function(params) {
        var me = this;
        me.model.doSave(params);
    };
    //Loadイベントハンドラ
    me.onLoad = function(params) {
        var me = this;
        me.model.doLoad(params);
    };
    //Deleteイベントハンドラ
    me.onDelete = function(params) {
        var me = this;
        me.model.doDelete(params);
    };
    //Resetイベントハンドラ
    me.onReset = function() {
        var me = this;
        me.model.doReset();
    };
}).apply(Fwx.BasicCrud.FormControl.prototype);

動かせてないからなぁ。
これから継承した具象クラス作って。
サーバサイドをちょいちょい組んで。それから動作確認ってってあれ?24時。。

でももうチョイ。
これとGrid用とForm用のConfigパラメータクラスを作った。

Ext.ns('Owx.Crud');

Ext.ns('Fwx.BasicCrud');

//abstract
//config class for crud
Fwx.BasicCrud.Config = function () {};
Fwx.BasicCrud.Config.prototype = {};
(function() {
    var me = this;
    me.columnModelConfig = {};
    me.readerConfig = {};
    me.proxyAPIs = {};
    me.formAPIs = {};
    me.defaultRecord = {};
    me.extGridPanelConfig = {};
    me.extStoreConfig = {
        autoLoad: {},
        autoSave: {},
        proxy: {},
        reader: {},
        writer: {}
    };
    me.pageSize = 0;
    //TODO:
    me.getColumnModelConfig = function() {
        var me = this;
        return me.columnModelConfig;
    };
    me.getReaderConfig = function() {
        var me = this;
        return me.readerConfig;
    };
    me.getProxyAPIs = function() {
        var me = this;
        return me.proxyAPIs;
    };
    me.getFormAPIs = function() {
        var me = this;
        return me.formAPIs;
    }
    me.getDefaultRecord = function() {
        var me = this;
        return me.defaultRecord;
    };
    me.getExtStoreConfig = function() {
        var me = this;
        return me.extStoreConfig;
    };
    me.getExtGridPanelConfig = function() {
        var me = this;
        return me.extGridPanelConfig;
    };
    me.getPageSize = function() {
        var me = this;
        return me.pageSize;
    };
}).apply(Fwx.BasicCrud.Config.prototype);

Owx.Crud.BasicTableConfig = function() {
    var me = this;
    me.columnModelConfig = [
        { name: 'id', mapping: 'id', dataIndex: 'id', header: 'id', width: 100, sortable: true, hidden: false, hideable: true },
        { name: 'charCol', mapping: 'charCol', dataIndex: 'charCol', header: 'charCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.TextField(), allowBlank: true },
        { name: 'datetimeCol', mapping: 'datetimeCol', dataIndex: 'datetimeCol', header: 'datetimeCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.DateField() },
        { name: 'decimalCol', mapping: 'decimalCol', dataIndex: 'decimalCol', header: 'decimalCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.NumberField() },
        { name: 'ntextCol', mapping: 'ntextCol', dataIndex: 'ntextCol', header: 'ntextCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.NumberField() },
        { name: 'nvarcharCol', mapping: 'nvarcharCol', dataIndex: 'nvarcharCol', header: 'nvarcharCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.TextField() },
        { name: 'bitCol', mapping: 'bitCol', dataIndex: 'bitCol', header: 'bitCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.Checkbox()}];
    me.readerConfig = [
        { name: 'id', mapping: 'id', dataIndex: 'id', header: 'id', width: 100, sortable: true, hidden: false, hideable: true },
        { name: 'charCol', mapping: 'charCol', dataIndex: 'charCol', header: 'charCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.TextField() },
        { name: 'datetimeCol', mapping: 'datetimeCol', dataIndex: 'datetimeCol', header: 'datetimeCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.DateField() },
        { name: 'decimalCol', mapping: 'decimalCol', dataIndex: 'decimalCol', header: 'decimalCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.NumberField() },
        { name: 'ntextCol', mapping: 'ntextCol', dataIndex: 'ntextCol', header: 'ntextCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.NumberField() },
        { name: 'nvarcharCol', mapping: 'nvarcharCol', dataIndex: 'nvarcharCol', header: 'nvarcharCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.TextField() },
        { name: 'bitCol', mapping: 'bitCol', dataIndex: 'bitCol', header: 'bitCol', width: 100, sortable: true, hidden: false, hideable: true, editor: new ExtWrapper.Checkbox()}];
    me.formConfig = [
    //{ name:'id' , fieldLabel:'', width:, xtype:'', value:'', hiddenName:'', allowBlank:false},
        { name: 'id', fieldLabel: 'id', width: 100, value: '', hiddenName: '', allowBlank: true, xtype: 'ExtWrapperLabel' },
        { name: 'charCol', fieldLabel: 'charCol', width: 100, value: '', hiddenName: '', allowBlank: true, xtype: 'ExtWrapperNumberField' },
        { name: 'datetimeCol', fieldLabel: 'datetimeCol', width: 100, value: '', hiddenName: '', allowBlank: true, xtype: 'ExtWrapperDateField' },
        { name: 'decimalCol', fieldLabel: 'decimalCol', width: 100, value: '', width: 100, value: '', hiddenName: '', allowBlank: true, xtype: 'ExtWrapperNumberField' },
        { name: 'ntextCol', fieldLabel: 'ntextCol', width: 100, value: '', hiddenName: '', allowBlank: true, xtype: 'ExtWrapperTextField' },
        { name: 'nvarcharCol', fieldLabel: 'nvarcharCol', width: 100, value: '', hiddenName: '', allowBlank: true, xtype: 'ExtWrapperTextArea' },
        { name: 'bitCol', fieldLabel: 'bitCol', width: 100, value: '', hiddenName: '', allowBlank: true, xtype: 'ExtWrapperCheckbox' }
    ];
    //Grid時のAPI
    me.proxyAPIs = {
        read: '/Owx/__test/data/ReadList.aspx',
        create: '/Owx/__test/data/CreateList.aspx',
        update: '/Owx/__test/data/UpdateList.aspx',
        destroy: '/Owx/__test/data/DeleteList.aspx'
    };
    //Form時のAPI
    me.formAPIs = {
        read: '/Owx/__test/data/ReadForm.aspx',
        write: '/Owx/__test/data/CreateForm.aspx',
        destroy: '/Owx/__test/data/DeleteForm.aspx'
    };
    me.defaultRecord = {
        id: '',
        charCol: 'chardef',
        datetimeCol: '2010/10/10',
        decimalCol: '10.25',
        ntextCol: '長文フリーのデフォルトー',
        nvarcharCol: 'バーキャラノデフォルトー',
        bitCol: 'true'
    };
    //me.extGridPanelConfig = {};
    //me.extStoreConfig = {};
    me.pageSize = 40;
};
Owx.Crud.BasicTableConfig.prototype = new Owx.Crud.TableConfig();


こいつをまるっとぶち込めば
気持ちとしてはreconfigみたいなイメージで、実装とパラメータを切り離せた実装にちかずけたはず。。

コントロールの画面表示まではOK。

すごくいけてないけど、あとで何とでもなる。
詳細はWindowに載せるかなぁ。



しかし、ストレートで出してもかっこよく出るところがExtJsの好きなとこ。
やはり楽しい。

これで動作確認してパラメタだけをテーブル構成にあわせて作っていけば
最低限のCRUDを実装したシステムのガワができるはず。わくわく。
これでゼロからのスクラッチはなくなる。
フレームワークの拡張層ができる予定。
で、こいつを一通りシステムっぽくできたらOmegaに載せ変えて。
あと何ヶ月かかるんだろうか。
でものんびり楽しみだ。
それっぽくなりそうだ。

少し進んだ。
うーん、早く画面周りのエフェクトとかコントロールとかいろいろを触り触りたい。。。

0 件のコメント: