source: Dev/trunk/src/client/dojox/mvc/EditModelRefController.js @ 529

Last change on this file since 529 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 8.5 KB
Line 
1define([
2        "dojo/_base/declare",
3        "dojo/_base/lang",
4        "./getPlainValue",
5        "./getStateful",
6        "./ModelRefController"
7], function(declare, lang, getPlainValue, getStateful, ModelRefController){
8        // module:
9        //              dojox/mvc/EditModelRefController
10
11        function setRefSourceModel(/*dojox/mvc/EditModelRefController*/ ctrl, /*Anything*/ old, /*Anything*/ current){
12                // summary:
13                //              A function called when this controller gets newer value as the data source.
14                // ctrl: dojox/mvc/EditModelRefController
15                //              The controller.
16                // old: Anything
17                //              The older value.
18                // current: Anything
19                //              The newer value.
20
21                if(old !== current){
22                        ctrl.set(ctrl._refOriginalModelProp, ctrl.holdModelUntilCommit ? current : ctrl.cloneModel(current));
23                        ctrl.set(ctrl._refEditModelProp, ctrl.holdModelUntilCommit ? ctrl.cloneModel(current) : current);
24                }
25        }
26
27        return declare("dojox.mvc.EditModelRefController", ModelRefController, {
28                // summary:
29                //              A child class of dojox/mvc/ModelRefController.
30                //              Keeps a copy (originalModel) of given data model (sourceModel) so that it can manage the data model of before/after the edit.
31                // description:
32                //              Has two modes:
33                //
34                //              - Directly reflect the edits to sourceModel (holdModelUntilCommit=false)
35                //              - Don't reflect the edits to sourceModel, until commit() is called (holdModelUntilCommit=true)
36                //
37                //              For the 1st case, dojo/Stateful get()/set()/watch() interfaces will work with sourceModel.
38                //              For the 2nd case, dojo/Stateful get()/set()/watch() interfaces will work with a copy of sourceModel, and sourceModel will be replaced with such copy when commit() is called.
39                //
40                //              NOTE - If this class is used with a widget by data-dojo-mixins, make sure putting the widget in data-dojo-type and putting this class to data-dojo-mixins.
41                // example:
42                //              The check box refers to "value" property in the controller (with "ctrl" ID).
43                //              The controller provides the "value" property on behalf of the model ("model" property in the controller, which comes from "sourceModel" property).
44                //              Two seconds later, the check box changes from unchecked to checked, and the controller saves the state.
45                //              Two seconds later then, the check box changes from checked to unchecked.
46                //              Two seconds later then, the controller goes back to the last saved state, and the check box changes from unchecked to checked as the result.
47                // |            <html>
48                // |                    <head>
49                // |                            <script src="/path/to/dojo-toolkit/dojo/dojo.js" type="text/javascript" data-dojo-config="parseOnLoad: 0"></script>
50                // |                            <script type="text/javascript">
51                // |                                    require([
52                // |                                            "dojo/dom", "dojo/parser", "dojo/Stateful", "dijit/registry", "dijit/form/CheckBox", "dojox/mvc/EditModelRefController", "dojo/domReady!"
53                // |                                    ], function(ddom, parser, Stateful, registry){
54                // |                                            model = new Stateful({value: false});
55                // |                                            setTimeout(function(){
56                // |                                                    ddom.byId("check").click();
57                // |                                                    registry.byId("ctrl").commit();
58                // |                                                    setTimeout(function(){
59                // |                                                            ddom.byId("check").click();
60                // |                                                            setTimeout(function(){
61                // |                                                                    registry.byId("ctrl").reset();
62                // |                                                            }, 2000);
63                // |                                                    }, 2000);
64                // |                                            }, 2000);
65                // |                                            parser.parse();
66                // |                                    });
67                // |                            </script>
68                // |                    </head>
69                // |                    <body>
70                // |                            <script type="dojo/require">at: "dojox/mvc/at"</script>
71                // |                            <span id="ctrl" data-dojo-type="dojox/mvc/EditModelRefController" data-dojo-props="sourceModel: model"></span>
72                // |                            <input id="check" type="checkbox" data-dojo-type="dijit/form/CheckBox" data-dojo-props="checked: at('widget:ctrl', 'value')">
73                // |                    </body>
74                // |            </html>
75                // example:
76                //              The controller with "ctrlSource" ID specifies holding changes until commit() is called (by setting true to holdModelUntilCommit).
77                //              As the change in the second check box is committed two seconds later from the change, the first check box is checked at then (when the change is committed).
78                // |            <html>
79                // |                    <head>
80                // |                            <script src="/path/to/dojo-toolkit/dojo/dojo.js" type="text/javascript" data-dojo-config="parseOnLoad: 0"></script>
81                // |                            <script type="text/javascript">
82                // |                                    require([
83                // |                                            "dojo/dom", "dojo/parser", "dojo/Stateful", "dijit/registry",
84                // |                                            "dijit/form/CheckBox", "dojox/mvc/ModelRefController", "dojox/mvc/EditModelRefController", "dojo/domReady!"
85                // |                                    ], function(ddom, parser, Stateful, registry){
86                // |                                            model = new Stateful({value: false});
87                // |                                            setTimeout(function(){
88                // |                                                    ddom.byId("checkEdit").click();
89                // |                                                    setTimeout(function(){
90                // |                                                            registry.byId("ctrlEdit").commit();
91                // |                                                    }, 2000);
92                // |                                            }, 2000);
93                // |                                            parser.parse();
94                // |                                    });
95                // |                            </script>
96                // |                    </head>
97                // |                    <body>
98                // |                            <script type="dojo/require">at: "dojox/mvc/at"</script>
99                // |                            <span id="ctrlSource" data-dojo-type="dojox/mvc/ModelRefController" data-dojo-props="model: model"></span>
100                // |                            <span id="ctrlEdit" data-dojo-type="dojox/mvc/EditModelRefController"
101                // |                             data-dojo-props="sourceModel: at('widget:ctrlSource', 'model'), holdModelUntilCommit: true"></span>
102                // |                            Source:
103                // |                            <input id="checkSource" type="checkbox" data-dojo-type="dijit/form/CheckBox"
104                // |                             data-dojo-props="checked: at('widget:ctrlSource', 'value')">
105                // |                            Edit:
106                // |                            <input id="checkEdit" type="checkbox" data-dojo-type="dijit/form/CheckBox"
107                // |                             data-dojo-props="checked: at('widget:ctrlEdit', 'value')">
108                // |                    </body>
109                // |            </html>
110
111                // getStatefulOptions: dojox/mvc/getStatefulOptions
112                //              The options to get stateful object from plain value.
113                getStatefulOptions: null,
114
115                // getPlainValueOptions: dojox/mvc/getPlainValueOptions
116                //              The options to get plain value from stateful object.
117                getPlainValueOptions: null,
118
119                // holdModelUntilCommit: Boolean
120                //              True not to send the change in model back to sourceModel until commit() is called.
121                holdModelUntilCommit: false,
122
123                // originalModel: dojo/Stateful
124                //              The data model, that serves as the original data.
125                originalModel: null,
126
127                // originalModel: dojo/Stateful
128                //              The data model, that serves as the data source.
129                sourceModel: null,
130
131                // _refOriginalModelProp: String
132                //              The property name for the data model, that serves as the original data.
133                _refOriginalModelProp: "originalModel",
134
135                // _refSourceModelProp: String
136                //              The property name for the data model, that serves as the data source.
137                _refSourceModelProp: "sourceModel",
138
139                // _refEditModelProp: String
140                //              The property name for the data model, that is being edited.
141                _refEditModelProp: "model",
142
143                postscript: function(/*Object?*/ params, /*DomNode|String?*/ srcNodeRef){
144                        // summary:
145                        //              Sets certain properties before setting models.
146
147                        for(var s in {getStatefulOptions: 1, getPlainValueOptions: 1, holdModelUntilCommit: 1}){
148                                var value = (params || {})[s];
149                                if(typeof value != "undefined"){
150                                        this[s] = value;
151                                }
152                        }
153                        this.inherited(arguments);
154                },
155
156                set: function(/*String*/ name, /*Anything*/ value){
157                        // summary:
158                        //              Set a property to this.
159                        // name: String
160                        //              The property to set.
161                        // value: Anything
162                        //              The value to set in the property.
163
164                        if(name == this._refSourceModelProp){
165                                setRefSourceModel(this, this[this._refSourceModelProp], value);
166                        }
167                        this.inherited(arguments);
168                },
169
170                cloneModel: function(/*Anything*/ value){
171                        // summary:
172                        //              Create a clone object of the data source.
173                        //              Child classes of this controller can override it to achieve its specific needs.
174                        // value: Anything
175                        //              The data serving as the data source.
176
177                        var plain = lang.isFunction((value || {}).set) && lang.isFunction((value || {}).watch) ? getPlainValue(value, this.getPlainValueOptions) : value;
178                        return getStateful(plain, this.getStatefulOptions);
179                },
180
181                commit: function(){
182                        // summary:
183                        //              Send the change back to the data source.
184
185                        this.set(this.holdModelUntilCommit ? this._refSourceModelProp : this._refOriginalModelProp, this.cloneModel(this.get(this._refEditModelProp)));
186                },
187
188                reset: function(){
189                        // summary:
190                        //              Change the model back to its original state.
191
192                        this.set(this.holdModelUntilCommit ? this._refEditModelProp : this._refSourceModelProp, this.cloneModel(this.get(this._refOriginalModelProp)));
193                },
194
195                hasControllerProperty: function(/*String*/ name){
196                        // summary:
197                        //              Returns true if this controller itself owns the given property.
198                        // name: String
199                        //              The property name.
200
201                        return this.inherited(arguments) || name == this._refOriginalModelProp || name == this._refSourceModelProp;
202                }
203        });
204});
Note: See TracBrowser for help on using the repository browser.