]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/grid/ObjectGrid.js
1 /** Renders a list of key values objects
3 Mandatory Config Parameters:
5 rows: an object container where each property is a key-value object we want to render
9 header: gettext('Keyboard Layout'),
10 editor: 'Your.KeyboardEdit',
18 As alternative you can use the common add-row helper like `add_text_row`, but you need to
19 call it in an overridden initComponent before `me.callParent(arguments)` gets executed.
21 For a declarative approach you can use the `gridRows` configuration to pass an array of
22 objects with each having at least a `xtype` to match `add_XTYPE_row` and a field-name
23 property, for example:
29 text: gettext('HTTP proxy'),
30 defaultValue: Proxmox.Utils.noneText,
38 disabled:: setting this parameter to true will disable selection and focus on
39 the proxmoxObjectGrid as well as greying out input elements. Useful for a
40 readonly tabular display
43 Ext
.define('Proxmox.grid.ObjectGrid', {
44 extend
: 'Ext.grid.GridPanel',
45 alias
: ['widget.proxmoxObjectGrid'],
47 // can be used as declarative replacement over manually calling the add_XYZ_row helpers,
48 // see top-level doc-comment above for details/example
54 monStoreErrors
: false,
56 add_combobox_row: function(name
, text
, opts
) {
60 me
.rows
= me
.rows
|| {};
64 defaultValue
: opts
.defaultValue
,
66 renderer
: opts
.renderer
,
68 xtype
: 'proxmoxWindowEdit',
70 onlineHelp
: opts
.onlineHelp
,
72 labelWidth
: opts
.labelWidth
|| 100,
75 xtype
: 'proxmoxKVComboBox',
77 comboItems
: opts
.comboItems
,
78 value
: opts
.defaultValue
,
79 deleteEmpty
: !!opts
.deleteEmpty
,
80 emptyText
: opts
.defaultValue
,
81 labelWidth
: Proxmox
.Utils
.compute_min_label_width(
82 text
, opts
.labelWidth
),
89 add_text_row: function(name
, text
, opts
) {
93 me
.rows
= me
.rows
|| {};
97 defaultValue
: opts
.defaultValue
,
99 renderer
: opts
.renderer
,
101 xtype
: 'proxmoxWindowEdit',
103 onlineHelp
: opts
.onlineHelp
,
105 labelWidth
: opts
.labelWidth
|| 100,
108 xtype
: 'proxmoxtextfield',
110 deleteEmpty
: !!opts
.deleteEmpty
,
111 emptyText
: opts
.defaultValue
,
112 labelWidth
: Proxmox
.Utils
.compute_min_label_width(text
, opts
.labelWidth
),
120 add_boolean_row: function(name
, text
, opts
) {
124 me
.rows
= me
.rows
|| {};
128 defaultValue
: opts
.defaultValue
|| 0,
130 renderer
: opts
.renderer
|| Proxmox
.Utils
.format_boolean
,
132 xtype
: 'proxmoxWindowEdit',
134 onlineHelp
: opts
.onlineHelp
,
136 labelWidth
: opts
.labelWidth
|| 100,
139 xtype
: 'proxmoxcheckbox',
142 defaultValue
: opts
.defaultValue
|| 0,
143 checked
: !!opts
.defaultValue
,
144 deleteDefaultValue
: !!opts
.deleteDefaultValue
,
145 labelWidth
: Proxmox
.Utils
.compute_min_label_width(text
, opts
.labelWidth
),
152 add_integer_row: function(name
, text
, opts
) {
156 me
.rows
= me
.rows
|| {};
160 defaultValue
: opts
.defaultValue
,
162 renderer
: opts
.renderer
,
164 xtype
: 'proxmoxWindowEdit',
166 onlineHelp
: opts
.onlineHelp
,
168 labelWidth
: opts
.labelWidth
|| 100,
171 xtype
: 'proxmoxintegerfield',
173 minValue
: opts
.minValue
,
174 maxValue
: opts
.maxValue
,
175 emptyText
: gettext('Default'),
176 deleteEmpty
: !!opts
.deleteEmpty
,
177 value
: opts
.defaultValue
,
178 labelWidth
: Proxmox
.Utils
.compute_min_label_width(text
, opts
.labelWidth
),
185 editorConfig
: {}, // default config passed to editor
187 run_editor: function() {
190 let sm
= me
.getSelectionModel();
191 let rec
= sm
.getSelection()[0];
197 let rowdef
= rows
[rec
.data
.key
];
198 if (!rowdef
.editor
) {
204 if (Ext
.isString(rowdef
.editor
)) {
206 confid
: rec
.data
.key
,
208 win
= Ext
.create(rowdef
.editor
, config
);
211 confid
: rec
.data
.key
,
213 Ext
.apply(config
, rowdef
.editor
);
214 win
= Ext
.createWidget(rowdef
.editor
.xtype
, config
);
219 win
.on('destroy', me
.reload
, me
);
227 getObjectValue: function(key
, defaultValue
) {
229 let rec
= me
.store
.getById(key
);
231 return rec
.data
.value
;
236 renderKey: function(key
, metaData
, record
, rowIndex
, colIndex
, store
) {
239 let rowdef
= rows
&& rows
[key
] ? rows
[key
] : {};
240 return rowdef
.header
|| key
;
243 renderValue: function(value
, metaData
, record
, rowIndex
, colIndex
, store
) {
246 let key
= record
.data
.key
;
247 let rowdef
= rows
&& rows
[key
] ? rows
[key
] : {};
249 let renderer
= rowdef
.renderer
;
251 return renderer(value
, metaData
, record
, rowIndex
, colIndex
, store
);
258 itemkeydown: function(view
, record
, item
, index
, e
) {
259 if (e
.getKey() === e
.ENTER
) {
260 this.pressedIndex
= index
;
263 itemkeyup: function(view
, record
, item
, index
, e
) {
264 if (e
.getKey() === e
.ENTER
&& index
=== this.pressedIndex
) {
268 this.pressedIndex
= undefined;
272 initComponent: function() {
275 for (const rowdef
of me
.gridRows
|| []) {
276 let addFn
= me
[`add_${rowdef.xtype}_row`];
277 if (typeof addFn
!== 'function') {
278 throw `unknown object-grid row xtype '${rowdef.xtype}'`;
279 } else if (typeof rowdef
.name
!== 'string') {
280 throw `object-grid row need a valid name string-property!`;
282 addFn
.call(me
, rowdef
.name
, rowdef
.text
|| rowdef
.name
, rowdef
);
290 throw "no url specified";
293 me
.rstore
= Ext
.create('Proxmox.data.ObjectStore', {
295 interval
: me
.interval
,
296 extraParams
: me
.extraParams
,
301 let rstore
= me
.rstore
;
302 let store
= Ext
.create('Proxmox.data.DiffStore', {
309 for (const [key
, rowdef
] of Object
.entries(rows
)) {
310 if (Ext
.isDefined(rowdef
.defaultValue
)) {
311 store
.add({ key
: key
, value
: rowdef
.defaultValue
});
312 } else if (rowdef
.required
) {
313 store
.add({ key
: key
, value
: undefined });
319 store
.sorters
.add(Ext
.create('Ext.util.Sorter', {
320 sorterFn
: me
.sorterFn
,
324 store
.filters
.add(Ext
.create('Ext.util.Filter', {
325 filterFn: function(item
) {
327 let rowdef
= rows
[item
.data
.key
];
328 if (!rowdef
|| rowdef
.visible
=== false) {
336 Proxmox
.Utils
.monStoreErrors(me
, rstore
);
343 header
: gettext('Name'),
344 width
: me
.cwidth1
|| 200,
346 renderer
: me
.renderKey
,
350 header
: gettext('Value'),
352 renderer
: me
.renderValue
,
359 if (me
.monStoreErrors
) {
360 Proxmox
.Utils
.monStoreErrors(me
, me
.store
);