]>
Commit | Line | Data |
---|---|---|
0bb29d35 DM |
1 | /* A reader to store a single JSON Object (hash) into a storage. |
2 | * Also accepts an array containing a single hash. | |
3 | * | |
4 | * So it can read: | |
5 | * | |
6 | * example1: {data1: "xyz", data2: "abc"} | |
7 | * returns [{key: "data1", value: "xyz"}, {key: "data2", value: "abc"}] | |
8 | * | |
9 | * example2: [ {data1: "xyz", data2: "abc"} ] | |
10 | * returns [{key: "data1", value: "xyz"}, {key: "data2", value: "abc"}] | |
11 | * | |
12 | * If you set 'readArray', the reader expexts the object as array: | |
13 | * | |
14 | * example3: [ { key: "data1", value: "xyz", p2: "cde" }, { key: "data2", value: "abc", p2: "efg" }] | |
15 | * returns [{key: "data1", value: "xyz", p2: "cde}, {key: "data2", value: "abc", p2: "efg"}] | |
16 | * | |
17 | * Note: The records can contain additional properties (like 'p2' above) when you use 'readArray' | |
18 | * | |
19 | * Additional feature: specify allowed properties with default values with 'rows' object | |
20 | * | |
21 | * var rows = { | |
22 | * memory: { | |
23 | * required: true, | |
24 | * defaultValue: 512 | |
25 | * } | |
26 | * } | |
27 | * | |
28 | */ | |
29 | ||
30 | Ext.define('Proxmox.data.reader.JsonObject', { | |
31 | extend: 'Ext.data.reader.Json', | |
32 | alias : 'reader.jsonobject', | |
33 | ||
34 | readArray: false, | |
35 | ||
36 | rows: undefined, | |
37 | ||
38 | constructor: function(config) { | |
39 | var me = this; | |
40 | ||
41 | Ext.apply(me, config || {}); | |
42 | ||
43 | me.callParent([config]); | |
44 | }, | |
45 | ||
46 | getResponseData: function(response) { | |
47 | var me = this; | |
48 | ||
49 | var data = []; | |
50 | try { | |
51 | var result = Ext.decode(response.responseText); | |
52 | // get our data items inside the server response | |
53 | var root = result[me.getRootProperty()]; | |
54 | ||
55 | if (me.readArray) { | |
56 | ||
57 | var rec_hash = {}; | |
58 | Ext.Array.each(root, function(rec) { | |
59 | if (Ext.isDefined(rec.key)) { | |
60 | rec_hash[rec.key] = rec; | |
61 | } | |
62 | }); | |
63 | ||
64 | if (me.rows) { | |
65 | Ext.Object.each(me.rows, function(key, rowdef) { | |
66 | var rec = rec_hash[key]; | |
67 | if (Ext.isDefined(rec)) { | |
68 | if (!Ext.isDefined(rec.value)) { | |
69 | rec.value = rowdef.defaultValue; | |
70 | } | |
71 | data.push(rec); | |
72 | } else if (Ext.isDefined(rowdef.defaultValue)) { | |
73 | data.push({key: key, value: rowdef.defaultValue} ); | |
74 | } else if (rowdef.required) { | |
75 | data.push({key: key, value: undefined }); | |
76 | } | |
77 | }); | |
78 | } else { | |
79 | Ext.Array.each(root, function(rec) { | |
80 | if (Ext.isDefined(rec.key)) { | |
81 | data.push(rec); | |
82 | } | |
83 | }); | |
84 | } | |
85 | ||
86 | } else { | |
87 | ||
88 | var org_root = root; | |
89 | ||
90 | if (Ext.isArray(org_root)) { | |
91 | if (root.length == 1) { | |
92 | root = org_root[0]; | |
93 | } else { | |
94 | root = {}; | |
95 | } | |
96 | } | |
97 | ||
98 | if (me.rows) { | |
99 | Ext.Object.each(me.rows, function(key, rowdef) { | |
100 | if (Ext.isDefined(root[key])) { | |
101 | data.push({key: key, value: root[key]}); | |
102 | } else if (Ext.isDefined(rowdef.defaultValue)) { | |
103 | data.push({key: key, value: rowdef.defaultValue}); | |
104 | } else if (rowdef.required) { | |
105 | data.push({key: key, value: undefined}); | |
106 | } | |
107 | }); | |
108 | } else { | |
109 | Ext.Object.each(root, function(key, value) { | |
110 | data.push({key: key, value: value }); | |
111 | }); | |
112 | } | |
113 | } | |
114 | } | |
115 | catch (ex) { | |
116 | Ext.Error.raise({ | |
117 | response: response, | |
118 | json: response.responseText, | |
119 | parseError: ex, | |
120 | msg: 'Unable to parse the JSON returned by the server: ' + ex.toString() | |
121 | }); | |
122 | } | |
123 | ||
124 | return data; | |
125 | } | |
126 | }); | |
127 |