]> git.proxmox.com Git - extjs.git/blame - extjs/packages/ux/src/ajax/Simlet.js
add extjs 6.0.1 sources
[extjs.git] / extjs / packages / ux / src / ajax / Simlet.js
CommitLineData
6527f429
DM
1/**\r
2 * This is a base class for more advanced "simlets" (simulated servers). A simlet is asked\r
3 * to provide a response given a {@link Ext.ux.ajax.SimXhr} instance.\r
4 */\r
5Ext.define('Ext.ux.ajax.Simlet', function () {\r
6 var urlRegex = /([^?#]*)(#.*)?$/,\r
7 dateRegex = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/,\r
8 intRegex = /^[+-]?\d+$/,\r
9 floatRegex = /^[+-]?\d+\.\d+$/;\r
10\r
11 function parseParamValue (value) {\r
12 var m;\r
13\r
14 if (Ext.isDefined(value)) {\r
15 value = decodeURIComponent(value);\r
16\r
17 if (intRegex.test(value)) {\r
18 value = parseInt(value, 10);\r
19 } else if (floatRegex.test(value)) {\r
20 value = parseFloat(value);\r
21 } else if (!!(m = dateRegex.test(value))) {\r
22 value = new Date(Date.UTC(+m[1], +m[2]-1, +m[3], +m[4], +m[5], +m[6]));\r
23 }\r
24 }\r
25\r
26 return value;\r
27 }\r
28\r
29 return {\r
30 alias: 'simlet.basic',\r
31\r
32 isSimlet: true,\r
33\r
34 responseProps: ['responseText', 'responseXML', 'status', 'statusText'],\r
35\r
36 /**\r
37 * @cfg {Number} responseText\r
38 */\r
39\r
40 /**\r
41 * @cfg {Number} responseXML\r
42 */\r
43\r
44 /**\r
45 * @cfg {Object} responseHeaders\r
46 */\r
47\r
48 /**\r
49 * @cfg {Number} status\r
50 */\r
51 status: 200,\r
52\r
53 /**\r
54 * @cfg {String} statusText\r
55 */\r
56 statusText: 'OK',\r
57\r
58 constructor: function (config) {\r
59 Ext.apply(this, config);\r
60 },\r
61\r
62 doGet: function (ctx) {\r
63 var me = this,\r
64 ret = {};\r
65\r
66 Ext.Array.forEach(me.responseProps, function (prop) {\r
67 if (prop in me) {\r
68 ret[prop] = me[prop];\r
69 }\r
70 });\r
71\r
72 return ret;\r
73 },\r
74 \r
75 doPost: function (ctx) {\r
76 var me = this,\r
77 ret = {};\r
78\r
79 Ext.Array.forEach(me.responseProps, function (prop) {\r
80 if (prop in me) {\r
81 ret[prop] = me[prop];\r
82 }\r
83 });\r
84\r
85 return ret;\r
86 },\r
87\r
88 doRedirect: function (ctx) {\r
89 return false;\r
90 },\r
91\r
92 doDelete: function (ctx) {\r
93 var me = this,\r
94 xhr = ctx.xhr,\r
95 records = xhr.options.records;\r
96 me.removeFromData(ctx,records);\r
97 },\r
98\r
99 /**\r
100 * Performs the action requested by the given XHR and returns an object to be applied\r
101 * on to the XHR (containing `status`, `responseText`, etc.). For the most part,\r
102 * this is delegated to `doMethod` methods on this class, such as `doGet`.\r
103 *\r
104 * @param {Ext.ux.ajax.SimXhr} xhr The simulated XMLHttpRequest instance.\r
105 * @return {Object} The response properties to add to the XMLHttpRequest.\r
106 */\r
107 exec: function (xhr) {\r
108 var me = this,\r
109 ret = {},\r
110 method = 'do' + Ext.String.capitalize(xhr.method.toLowerCase()), // doGet\r
111 fn = me[method];\r
112\r
113 if (fn) {\r
114 ret = fn.call(me, me.getCtx(xhr.method, xhr.url, xhr));\r
115 } else {\r
116 ret = { status: 405, statusText: 'Method Not Allowed' };\r
117 }\r
118\r
119 return ret;\r
120 },\r
121\r
122 getCtx: function (method, url, xhr) {\r
123 return {\r
124 method: method,\r
125 params: this.parseQueryString(url),\r
126 url: url,\r
127 xhr: xhr\r
128 };\r
129 },\r
130\r
131 openRequest: function (method, url, options, async) {\r
132 var ctx = this.getCtx(method, url),\r
133 redirect = this.doRedirect(ctx),\r
134 xhr;\r
135 if (options.action === 'destroy'){\r
136 method = 'delete';\r
137 }\r
138 if (redirect) {\r
139 xhr = redirect;\r
140 } else {\r
141 xhr = new Ext.ux.ajax.SimXhr({\r
142 mgr: this.manager,\r
143 simlet: this,\r
144 options: options\r
145 });\r
146 xhr.open(method, url, async);\r
147 }\r
148 \r
149 return xhr;\r
150 },\r
151\r
152 parseQueryString : function (str) {\r
153 var m = urlRegex.exec(str),\r
154 ret = {},\r
155 key,\r
156 value,\r
157 i, n;\r
158\r
159 if (m && m[1]) {\r
160 var pair, parts = m[1].split('&');\r
161\r
162 for (i = 0, n = parts.length; i < n; ++i) {\r
163 if ((pair = parts[i].split('='))[0]) {\r
164 key = decodeURIComponent(pair.shift());\r
165 value = parseParamValue((pair.length > 1) ? pair.join('=') : pair[0]);\r
166\r
167 if (!(key in ret)) {\r
168 ret[key] = value;\r
169 } else if (Ext.isArray(ret[key])) {\r
170 ret[key].push(value);\r
171 } else {\r
172 ret[key] = [ret[key], value];\r
173 }\r
174 }\r
175 }\r
176 }\r
177\r
178 return ret;\r
179 },\r
180\r
181 redirect: function (method, url, params) {\r
182 switch (arguments.length) {\r
183 case 2:\r
184 if (typeof url == 'string') {\r
185 break;\r
186 }\r
187 params = url;\r
188 // fall...\r
189 case 1:\r
190 url = method;\r
191 method = 'GET';\r
192 break;\r
193 }\r
194\r
195 if (params) {\r
196 url = Ext.urlAppend(url, Ext.Object.toQueryString(params));\r
197 }\r
198 return this.manager.openRequest(method, url);\r
199 },\r
200\r
201 removeFromData: function(ctx, records) {\r
202 var me = this,\r
203 data = me.getData(ctx),\r
204 model = (ctx.xhr.options.proxy && ctx.xhr.options.proxy.getModel()) || {},\r
205 idProperty = model.idProperty || 'id';\r
206\r
207 Ext.each(records, function(record) {\r
208 var id = record.get(idProperty);\r
209 for (var i = data.length; i-- > 0;) {\r
210 if (data[i][idProperty] === id) {\r
211 me.deleteRecord(i);\r
212 break;\r
213 }\r
214 }\r
215 });\r
216 }\r
217 };\r
218}());\r