]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - grid/ObjectGrid.js
add an optional renderer for integer rows in ObjectGrid
[proxmox-widget-toolkit.git] / grid / ObjectGrid.js
CommitLineData
06694509
DM
1/* Renders a list of key values objets
2
3mandatory config parameters:
4rows: an object container where each propery is a key-value object we want to render
5 var rows = {
6 keyboard: {
7 header: gettext('Keyboard Layout'),
8 editor: 'Your.KeyboardEdit',
9 required: true
10 },
11
12optional:
13disabled: setting this parameter to true will disable selection and focus on the
14proxmoxObjectGrid as well as greying out input elements.
15Useful for a readonly tabular display
16
17*/
18
19Ext.define('Proxmox.grid.ObjectGrid', {
20 extend: 'Ext.grid.GridPanel',
21 alias: ['widget.proxmoxObjectGrid'],
22 disabled: false,
23 hideHeaders: true,
24
4297e795
DM
25 monStoreErrors: false,
26
8f7370ee
DM
27 add_combobox_row: function(name, text, opts) {
28 var me = this;
29
30 opts = opts || {};
31 me.rows = me.rows || {};
32
33 me.rows[name] = {
34 required: true,
35 defaultValue: opts.defaultValue,
36 header: text,
37 renderer: opts.renderer,
38 editor: {
39 xtype: 'proxmoxWindowEdit',
40 subject: text,
41 items: {
42 xtype: 'proxmoxKVComboBox',
43 name: name,
44 comboItems: opts.comboItems,
45 value: opts.defaultValue,
46 deleteEmpty: opts.deleteEmpty ? true : false,
47 emptyText: opts.defaultValue,
48 labelWidth: Proxmox.Utils.compute_min_label_width(
49 text, opts.labelWidth),
50 fieldLabel: text
51 }
52 }
53 };
54 },
55
5dea30d0
DM
56 add_text_row: function(name, text, opts) {
57 var me = this;
58
59 opts = opts || {};
c2ea0137 60 me.rows = me.rows || {};
5dea30d0
DM
61
62 me.rows[name] = {
63 required: true,
64 defaultValue: opts.defaultValue,
65 header: text,
66 renderer: opts.renderer,
67 editor: {
68 xtype: 'proxmoxWindowEdit',
69 subject: text,
70 items: {
71 xtype: 'proxmoxtextfield',
72 name: name,
8f7370ee 73 deleteEmpty: opts.deleteEmpty ? true : false,
5dea30d0
DM
74 emptyText: opts.defaultValue,
75 labelWidth: Proxmox.Utils.compute_min_label_width(
76 text, opts.labelWidth),
85d85d15 77 vtype: opts.vtype,
5dea30d0
DM
78 fieldLabel: text
79 }
80 }
81 };
82 },
83
0e49da6d
DM
84 add_boolean_row: function(name, text, opts) {
85 var me = this;
86
87 opts = opts || {};
c2ea0137 88 me.rows = me.rows || {};
0e49da6d 89
0e49da6d
DM
90 me.rows[name] = {
91 required: true,
92 defaultValue: opts.defaultValue || 0,
93 header: text,
94 renderer: opts.renderer || Proxmox.Utils.format_boolean,
95 editor: {
96 xtype: 'proxmoxWindowEdit',
97 subject: text,
98 items: {
99 xtype: 'proxmoxcheckbox',
100 name: name,
101 uncheckedValue: 0,
102 defaultValue: opts.defaultValue || 0,
103 checked: opts.defaultValue ? true : false,
104 deleteDefaultValue: opts.deleteDefaultValue ? true : false,
28e54f37
DM
105 labelWidth: Proxmox.Utils.compute_min_label_width(
106 text, opts.labelWidth),
0e49da6d
DM
107 fieldLabel: text
108 }
109 }
110 };
111 },
112
113 add_integer_row: function(name, text, opts) {
114 var me = this;
115
116 opts = opts || {}
c2ea0137 117 me.rows = me.rows || {};
0e49da6d 118
0e49da6d
DM
119 me.rows[name] = {
120 required: true,
121 defaultValue: opts.defaultValue,
122 header: text,
0d5c5e14 123 renderer: opts.renderer,
0e49da6d
DM
124 editor: {
125 xtype: 'proxmoxWindowEdit',
126 subject: text,
127 items: {
128 xtype: 'proxmoxintegerfield',
129 name: name,
130 minValue: opts.minValue,
131 maxValue: opts.maxValue,
132 emptyText: gettext('Default'),
8f7370ee 133 deleteEmpty: opts.deleteEmpty ? true : false,
0e49da6d 134 value: opts.defaultValue,
28e54f37
DM
135 labelWidth: Proxmox.Utils.compute_min_label_width(
136 text, opts.labelWidth),
0e49da6d
DM
137 fieldLabel: text
138 }
139 }
140 };
141 },
142
7ec6cd9e
DM
143 editorConfig: {}, // default config passed to editor
144
145 run_editor: function() {
146 var me = this;
147
148 var sm = me.getSelectionModel();
149 var rec = sm.getSelection()[0];
150 if (!rec) {
151 return;
152 }
153
154 var rows = me.rows;
155 var rowdef = rows[rec.data.key];
156 if (!rowdef.editor) {
157 return;
158 }
159
160 var win;
161 var config;
162 if (Ext.isString(rowdef.editor)) {
163 config = Ext.apply({
164 confid: rec.data.key,
165 }, me.editorConfig);
166 win = Ext.create(rowdef.editor, config);
167 } else {
168 config = Ext.apply({
169 confid: rec.data.key,
170 }, me.editorConfig);
171 Ext.apply(config, rowdef.editor);
172 win = Ext.createWidget(rowdef.editor.xtype, config);
173 win.load();
174 }
175
176 win.show();
177 win.on('destroy', me.reload, me);
178 },
179
180 reload: function() {
181 var me = this;
182 me.rstore.load();
183 },
184
06694509
DM
185 getObjectValue: function(key, defaultValue) {
186 var me = this;
187 var rec = me.store.getById(key);
188 if (rec) {
189 return rec.data.value;
190 }
191 return defaultValue;
192 },
193
194 renderKey: function(key, metaData, record, rowIndex, colIndex, store) {
195 var me = this;
196 var rows = me.rows;
197 var rowdef = (rows && rows[key]) ? rows[key] : {};
198 return rowdef.header || key;
199 },
200
201 renderValue: function(value, metaData, record, rowIndex, colIndex, store) {
202 var me = this;
203 var rows = me.rows;
204 var key = record.data.key;
205 var rowdef = (rows && rows[key]) ? rows[key] : {};
206
207 var renderer = rowdef.renderer;
208 if (renderer) {
209 return renderer(value, metaData, record, rowIndex, colIndex, store);
210 }
211
212 return value;
213 },
214
215 initComponent : function() {
216 var me = this;
217
218 var rows = me.rows;
219
220 if (!me.rstore) {
221 if (!me.url) {
222 throw "no url specified";
223 }
224
225 me.rstore = Ext.create('Proxmox.data.ObjectStore', {
226 url: me.url,
227 interval: me.interval,
228 extraParams: me.extraParams,
229 rows: me.rows
230 });
231 }
232
233 var rstore = me.rstore;
234
235 var store = Ext.create('Proxmox.data.DiffStore', { rstore: rstore,
236 sorters: [],
237 filters: []
238 });
239
240 if (rows) {
241 Ext.Object.each(rows, function(key, rowdef) {
242 if (Ext.isDefined(rowdef.defaultValue)) {
243 store.add({ key: key, value: rowdef.defaultValue });
244 } else if (rowdef.required) {
245 store.add({ key: key, value: undefined });
246 }
247 });
248 }
249
250 if (me.sorterFn) {
251 store.sorters.add(Ext.create('Ext.util.Sorter', {
252 sorterFn: me.sorterFn
253 }));
254 }
255
256 store.filters.add(Ext.create('Ext.util.Filter', {
257 filterFn: function(item) {
258 if (rows) {
259 var rowdef = rows[item.data.key];
260 if (!rowdef || (rowdef.visible === false)) {
261 return false;
262 }
263 }
264 return true;
265 }
266 }));
267
268 Proxmox.Utils.monStoreErrors(me, rstore);
269
270 Ext.applyIf(me, {
271 store: store,
272 stateful: false,
273 columns: [
274 {
275 header: gettext('Name'),
276 width: me.cwidth1 || 200,
277 dataIndex: 'key',
278 renderer: me.renderKey
279 },
280 {
281 flex: 1,
282 header: gettext('Value'),
283 dataIndex: 'value',
284 renderer: me.renderValue
285 }
286 ]
287 });
288
289 me.callParent();
4297e795
DM
290
291 if (me.monStoreErrors) {
292 Proxmox.Utils.monStoreErrors(me, me.store);
293 }
06694509
DM
294 }
295});