]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/grid/ObjectGrid.js
1 /* Renders a list of key values objets
3 mandatory config parameters:
4 rows: an object container where each propery is a key-value object we want to render
7 header: gettext('Keyboard Layout'),
8 editor: 'Your.KeyboardEdit',
13 disabled: setting this parameter to true will disable selection and focus on the
14 proxmoxObjectGrid as well as greying out input elements.
15 Useful for a readonly tabular display
19 Ext
.define('Proxmox.grid.ObjectGrid', {
20 extend
: 'Ext.grid.GridPanel',
21 alias
: ['widget.proxmoxObjectGrid'],
23 // can be used as declarative replacement over manually calling the add_XYZ_row helpers,
24 // see top-level doc-comment above for details/example
30 monStoreErrors
: false,
32 add_combobox_row: function(name
, text
, opts
) {
36 me
.rows
= me
.rows
|| {};
40 defaultValue
: opts
.defaultValue
,
42 renderer
: opts
.renderer
,
44 xtype
: 'proxmoxWindowEdit',
46 onlineHelp
: opts
.onlineHelp
,
48 labelWidth
: opts
.labelWidth
|| 100,
51 xtype
: 'proxmoxKVComboBox',
53 comboItems
: opts
.comboItems
,
54 value
: opts
.defaultValue
,
55 deleteEmpty
: !!opts
.deleteEmpty
,
56 emptyText
: opts
.defaultValue
,
57 labelWidth
: Proxmox
.Utils
.compute_min_label_width(
58 text
, opts
.labelWidth
),
65 add_text_row: function(name
, text
, opts
) {
69 me
.rows
= me
.rows
|| {};
73 defaultValue
: opts
.defaultValue
,
75 renderer
: opts
.renderer
,
77 xtype
: 'proxmoxWindowEdit',
79 onlineHelp
: opts
.onlineHelp
,
81 labelWidth
: opts
.labelWidth
|| 100,
84 xtype
: 'proxmoxtextfield',
86 deleteEmpty
: !!opts
.deleteEmpty
,
87 emptyText
: opts
.defaultValue
,
88 labelWidth
: Proxmox
.Utils
.compute_min_label_width(
89 text
, opts
.labelWidth
),
97 add_boolean_row: function(name
, text
, opts
) {
101 me
.rows
= me
.rows
|| {};
105 defaultValue
: opts
.defaultValue
|| 0,
107 renderer
: opts
.renderer
|| Proxmox
.Utils
.format_boolean
,
109 xtype
: 'proxmoxWindowEdit',
111 onlineHelp
: opts
.onlineHelp
,
113 labelWidth
: opts
.labelWidth
|| 100,
116 xtype
: 'proxmoxcheckbox',
119 defaultValue
: opts
.defaultValue
|| 0,
120 checked
: !!opts
.defaultValue
,
121 deleteDefaultValue
: !!opts
.deleteDefaultValue
,
122 labelWidth
: Proxmox
.Utils
.compute_min_label_width(
123 text
, opts
.labelWidth
),
130 add_integer_row: function(name
, text
, opts
) {
134 me
.rows
= me
.rows
|| {};
138 defaultValue
: opts
.defaultValue
,
140 renderer
: opts
.renderer
,
142 xtype
: 'proxmoxWindowEdit',
144 onlineHelp
: opts
.onlineHelp
,
146 labelWidth
: opts
.labelWidth
|| 100,
149 xtype
: 'proxmoxintegerfield',
151 minValue
: opts
.minValue
,
152 maxValue
: opts
.maxValue
,
153 emptyText
: gettext('Default'),
154 deleteEmpty
: !!opts
.deleteEmpty
,
155 value
: opts
.defaultValue
,
156 labelWidth
: Proxmox
.Utils
.compute_min_label_width(
157 text
, opts
.labelWidth
),
164 editorConfig
: {}, // default config passed to editor
166 run_editor: function() {
169 let sm
= me
.getSelectionModel();
170 let rec
= sm
.getSelection()[0];
176 let rowdef
= rows
[rec
.data
.key
];
177 if (!rowdef
.editor
) {
183 if (Ext
.isString(rowdef
.editor
)) {
185 confid
: rec
.data
.key
,
187 win
= Ext
.create(rowdef
.editor
, config
);
190 confid
: rec
.data
.key
,
192 Ext
.apply(config
, rowdef
.editor
);
193 win
= Ext
.createWidget(rowdef
.editor
.xtype
, config
);
198 win
.on('destroy', me
.reload
, me
);
206 getObjectValue: function(key
, defaultValue
) {
208 let rec
= me
.store
.getById(key
);
210 return rec
.data
.value
;
215 renderKey: function(key
, metaData
, record
, rowIndex
, colIndex
, store
) {
218 let rowdef
= rows
&& rows
[key
] ? rows
[key
] : {};
219 return rowdef
.header
|| key
;
222 renderValue: function(value
, metaData
, record
, rowIndex
, colIndex
, store
) {
225 let key
= record
.data
.key
;
226 let rowdef
= rows
&& rows
[key
] ? rows
[key
] : {};
228 let renderer
= rowdef
.renderer
;
230 return renderer(value
, metaData
, record
, rowIndex
, colIndex
, store
);
237 itemkeydown: function(view
, record
, item
, index
, e
) {
238 if (e
.getKey() === e
.ENTER
) {
239 this.pressedIndex
= index
;
242 itemkeyup: function(view
, record
, item
, index
, e
) {
243 if (e
.getKey() === e
.ENTER
&& index
=== this.pressedIndex
) {
247 this.pressedIndex
= undefined;
251 initComponent: function() {
254 for (const rowdef
of me
.gridRows
|| []) {
255 let addFn
= me
[`add_${rowdef.xtype}_row`];
256 if (typeof addFn
!== 'function') {
257 throw `unknown object-grid row xtype '${rowdef.xtype}'`;
258 } else if (typeof rowdef
.name
!== 'string') {
259 throw `object-grid row need a valid name string-property!`;
261 addFn
.call(me
, rowdef
.name
, rowdef
.text
|| rowdef
.name
, rowdef
);
269 throw "no url specified";
272 me
.rstore
= Ext
.create('Proxmox.data.ObjectStore', {
274 interval
: me
.interval
,
275 extraParams
: me
.extraParams
,
280 let rstore
= me
.rstore
;
281 let store
= Ext
.create('Proxmox.data.DiffStore', {
288 for (const [key
, rowdef
] of Object
.entries(rows
)) {
289 if (Ext
.isDefined(rowdef
.defaultValue
)) {
290 store
.add({ key
: key
, value
: rowdef
.defaultValue
});
291 } else if (rowdef
.required
) {
292 store
.add({ key
: key
, value
: undefined });
298 store
.sorters
.add(Ext
.create('Ext.util.Sorter', {
299 sorterFn
: me
.sorterFn
,
303 store
.filters
.add(Ext
.create('Ext.util.Filter', {
304 filterFn: function(item
) {
306 let rowdef
= rows
[item
.data
.key
];
307 if (!rowdef
|| rowdef
.visible
=== false) {
315 Proxmox
.Utils
.monStoreErrors(me
, rstore
);
322 header
: gettext('Name'),
323 width
: me
.cwidth1
|| 200,
325 renderer
: me
.renderKey
,
329 header
: gettext('Value'),
331 renderer
: me
.renderValue
,
338 if (me
.monStoreErrors
) {
339 Proxmox
.Utils
.monStoreErrors(me
, me
.store
);