]>
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:
5 rows: an object container where each propery 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(
113 text
, opts
.labelWidth
),
121 add_boolean_row: function(name
, text
, opts
) {
125 me
.rows
= me
.rows
|| {};
129 defaultValue
: opts
.defaultValue
|| 0,
131 renderer
: opts
.renderer
|| Proxmox
.Utils
.format_boolean
,
133 xtype
: 'proxmoxWindowEdit',
135 onlineHelp
: opts
.onlineHelp
,
137 labelWidth
: opts
.labelWidth
|| 100,
140 xtype
: 'proxmoxcheckbox',
143 defaultValue
: opts
.defaultValue
|| 0,
144 checked
: !!opts
.defaultValue
,
145 deleteDefaultValue
: !!opts
.deleteDefaultValue
,
146 labelWidth
: Proxmox
.Utils
.compute_min_label_width(
147 text
, opts
.labelWidth
),
154 add_integer_row: function(name
, text
, opts
) {
158 me
.rows
= me
.rows
|| {};
162 defaultValue
: opts
.defaultValue
,
164 renderer
: opts
.renderer
,
166 xtype
: 'proxmoxWindowEdit',
168 onlineHelp
: opts
.onlineHelp
,
170 labelWidth
: opts
.labelWidth
|| 100,
173 xtype
: 'proxmoxintegerfield',
175 minValue
: opts
.minValue
,
176 maxValue
: opts
.maxValue
,
177 emptyText
: gettext('Default'),
178 deleteEmpty
: !!opts
.deleteEmpty
,
179 value
: opts
.defaultValue
,
180 labelWidth
: Proxmox
.Utils
.compute_min_label_width(
181 text
, opts
.labelWidth
),
188 editorConfig
: {}, // default config passed to editor
190 run_editor: function() {
193 let sm
= me
.getSelectionModel();
194 let rec
= sm
.getSelection()[0];
200 let rowdef
= rows
[rec
.data
.key
];
201 if (!rowdef
.editor
) {
207 if (Ext
.isString(rowdef
.editor
)) {
209 confid
: rec
.data
.key
,
211 win
= Ext
.create(rowdef
.editor
, config
);
214 confid
: rec
.data
.key
,
216 Ext
.apply(config
, rowdef
.editor
);
217 win
= Ext
.createWidget(rowdef
.editor
.xtype
, config
);
222 win
.on('destroy', me
.reload
, me
);
230 getObjectValue: function(key
, defaultValue
) {
232 let rec
= me
.store
.getById(key
);
234 return rec
.data
.value
;
239 renderKey: function(key
, metaData
, record
, rowIndex
, colIndex
, store
) {
242 let rowdef
= rows
&& rows
[key
] ? rows
[key
] : {};
243 return rowdef
.header
|| key
;
246 renderValue: function(value
, metaData
, record
, rowIndex
, colIndex
, store
) {
249 let key
= record
.data
.key
;
250 let rowdef
= rows
&& rows
[key
] ? rows
[key
] : {};
252 let renderer
= rowdef
.renderer
;
254 return renderer(value
, metaData
, record
, rowIndex
, colIndex
, store
);
261 itemkeydown: function(view
, record
, item
, index
, e
) {
262 if (e
.getKey() === e
.ENTER
) {
263 this.pressedIndex
= index
;
266 itemkeyup: function(view
, record
, item
, index
, e
) {
267 if (e
.getKey() === e
.ENTER
&& index
=== this.pressedIndex
) {
271 this.pressedIndex
= undefined;
275 initComponent: function() {
278 for (const rowdef
of me
.gridRows
|| []) {
279 let addFn
= me
[`add_${rowdef.xtype}_row`];
280 if (typeof addFn
!== 'function') {
281 throw `unknown object-grid row xtype '${rowdef.xtype}'`;
282 } else if (typeof rowdef
.name
!== 'string') {
283 throw `object-grid row need a valid name string-property!`;
285 addFn
.call(me
, rowdef
.name
, rowdef
.text
|| rowdef
.name
, rowdef
);
293 throw "no url specified";
296 me
.rstore
= Ext
.create('Proxmox.data.ObjectStore', {
298 interval
: me
.interval
,
299 extraParams
: me
.extraParams
,
304 let rstore
= me
.rstore
;
305 let store
= Ext
.create('Proxmox.data.DiffStore', {
312 for (const [key
, rowdef
] of Object
.entries(rows
)) {
313 if (Ext
.isDefined(rowdef
.defaultValue
)) {
314 store
.add({ key
: key
, value
: rowdef
.defaultValue
});
315 } else if (rowdef
.required
) {
316 store
.add({ key
: key
, value
: undefined });
322 store
.sorters
.add(Ext
.create('Ext.util.Sorter', {
323 sorterFn
: me
.sorterFn
,
327 store
.filters
.add(Ext
.create('Ext.util.Filter', {
328 filterFn: function(item
) {
330 let rowdef
= rows
[item
.data
.key
];
331 if (!rowdef
|| rowdef
.visible
=== false) {
339 Proxmox
.Utils
.monStoreErrors(me
, rstore
);
346 header
: gettext('Name'),
347 width
: me
.cwidth1
|| 200,
349 renderer
: me
.renderKey
,
353 header
: gettext('Value'),
355 renderer
: me
.renderValue
,
362 if (me
.monStoreErrors
) {
363 Proxmox
.Utils
.monStoreErrors(me
, me
.store
);