]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - data/reader/JsonObject.js
use eslint and execute as check target
[proxmox-widget-toolkit.git] / data / reader / JsonObject.js
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 * let 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 let me = this;
40
41 Ext.apply(me, config || {});
42
43 me.callParent([config]);
44 },
45
46 getResponseData: function(response) {
47 let me = this;
48
49 let data = [];
50 try {
51 let result = Ext.decode(response.responseText);
52 // get our data items inside the server response
53 let root = result[me.getRootProperty()];
54
55 if (me.readArray) {
56 let rec_hash = {};
57 Ext.Array.each(root, function(rec) {
58 if (Ext.isDefined(rec.key)) {
59 rec_hash[rec.key] = rec;
60 }
61 });
62
63 if (me.rows) {
64 Ext.Object.each(me.rows, function(key, rowdef) {
65 let rec = rec_hash[key];
66 if (Ext.isDefined(rec)) {
67 if (!Ext.isDefined(rec.value)) {
68 rec.value = rowdef.defaultValue;
69 }
70 data.push(rec);
71 } else if (Ext.isDefined(rowdef.defaultValue)) {
72 data.push({ key: key, value: rowdef.defaultValue });
73 } else if (rowdef.required) {
74 data.push({ key: key, value: undefined });
75 }
76 });
77 } else {
78 Ext.Array.each(root, function(rec) {
79 if (Ext.isDefined(rec.key)) {
80 data.push(rec);
81 }
82 });
83 }
84 } else {
85 let org_root = root;
86
87 if (Ext.isArray(org_root)) {
88 if (root.length === 1) {
89 root = org_root[0];
90 } else {
91 root = {};
92 }
93 }
94
95 if (me.rows) {
96 Ext.Object.each(me.rows, function(key, rowdef) {
97 if (Ext.isDefined(root[key])) {
98 data.push({ key: key, value: root[key] });
99 } else if (Ext.isDefined(rowdef.defaultValue)) {
100 data.push({ key: key, value: rowdef.defaultValue });
101 } else if (rowdef.required) {
102 data.push({ key: key, value: undefined });
103 }
104 });
105 } else {
106 Ext.Object.each(root, function(key, value) {
107 data.push({ key: key, value: value });
108 });
109 }
110 }
111 } catch (ex) {
112 Ext.Error.raise({
113 response: response,
114 json: response.responseText,
115 parseError: ex,
116 msg: 'Unable to parse the JSON returned by the server: ' + ex.toString(),
117 });
118 }
119
120 return data;
121 },
122 });
123