]>
Commit | Line | Data |
---|---|---|
f28ec3e4 TL |
1 | Ext.define('PVE.panel.StorageBase', { |
2 | extend: 'Proxmox.panel.InputPanel', | |
3 | controller: 'storageEdit', | |
4 | ||
5 | type: '', | |
6 | ||
7 | onGetValues: function(values) { | |
b9e706fb | 8 | let me = this; |
f28ec3e4 TL |
9 | |
10 | if (me.isCreate) { | |
11 | values.type = me.type; | |
12 | } else { | |
13 | delete values.storage; | |
14 | } | |
15 | ||
16 | values.disable = values.enable ? 0 : 1; | |
17 | delete values.enable; | |
18 | ||
19 | return values; | |
20 | }, | |
21 | ||
8058410f | 22 | initComponent: function() { |
b9e706fb | 23 | let me = this; |
f28ec3e4 TL |
24 | |
25 | me.column1.unshift({ | |
26 | xtype: me.isCreate ? 'textfield' : 'displayfield', | |
27 | name: 'storage', | |
28 | value: me.storageId || '', | |
29 | fieldLabel: 'ID', | |
30 | vtype: 'StorageId', | |
f6710aac | 31 | allowBlank: false, |
f28ec3e4 TL |
32 | }); |
33 | ||
e194ea7c | 34 | me.column2 = me.column2 || []; |
f28ec3e4 TL |
35 | me.column2.unshift( |
36 | { | |
37 | xtype: 'pveNodeSelector', | |
38 | name: 'nodes', | |
14d9ecc4 | 39 | reference: 'storageNodeRestriction', |
f28ec3e4 TL |
40 | disabled: me.storageId === 'local', |
41 | fieldLabel: gettext('Nodes'), | |
42 | emptyText: gettext('All') + ' (' + gettext('No restrictions') +')', | |
43 | multiSelect: true, | |
f6710aac | 44 | autoSelect: false, |
f28ec3e4 TL |
45 | }, |
46 | { | |
47 | xtype: 'proxmoxcheckbox', | |
48 | name: 'enable', | |
49 | checked: true, | |
50 | uncheckedValue: 0, | |
f6710aac TL |
51 | fieldLabel: gettext('Enable'), |
52 | }, | |
f28ec3e4 TL |
53 | ); |
54 | ||
bb157f5d LS |
55 | const qemuImgStorageTypes = ['dir', 'btrfs', 'nfs', 'cifs', 'glusterfs']; |
56 | ||
57 | if (qemuImgStorageTypes.includes(me.type)) { | |
58 | const preallocSelector = { | |
59 | xtype: 'pvePreallocationSelector', | |
60 | name: 'preallocation', | |
61 | fieldLabel: gettext('Preallocation'), | |
62 | allowBlank: false, | |
e82d3583 | 63 | deleteEmpty: !me.isCreate, |
bb157f5d LS |
64 | value: '__default__', |
65 | }; | |
66 | ||
67 | me.advancedColumn1 = me.advancedColumn1 || []; | |
68 | me.advancedColumn2 = me.advancedColumn2 || []; | |
69 | if (me.advancedColumn2.length < me.advancedColumn1.length) { | |
70 | me.advancedColumn2.unshift(preallocSelector); | |
71 | } else { | |
72 | me.advancedColumn1.unshift(preallocSelector); | |
73 | } | |
74 | } | |
75 | ||
f28ec3e4 | 76 | me.callParent(); |
f6710aac | 77 | }, |
f28ec3e4 TL |
78 | }); |
79 | ||
80 | Ext.define('PVE.storage.BaseEdit', { | |
81 | extend: 'Proxmox.window.Edit', | |
82 | ||
71dec88f TL |
83 | apiCallDone: function(success, response, options) { |
84 | let me = this; | |
85 | if (typeof me.ipanel.apiCallDone === "function") { | |
86 | me.ipanel.apiCallDone(success, response, options); | |
87 | } | |
88 | }, | |
89 | ||
8058410f | 90 | initComponent: function() { |
b9e706fb | 91 | let me = this; |
f28ec3e4 TL |
92 | |
93 | me.isCreate = !me.storageId; | |
94 | ||
95 | if (me.isCreate) { | |
f3c1eac7 TL |
96 | me.url = '/api2/extjs/storage'; |
97 | me.method = 'POST'; | |
98 | } else { | |
99 | me.url = '/api2/extjs/storage/' + me.storageId; | |
100 | me.method = 'PUT'; | |
101 | } | |
f28ec3e4 | 102 | |
71dec88f | 103 | me.ipanel = Ext.create(me.paneltype, { |
232415d9 | 104 | title: gettext('General'), |
f28ec3e4 TL |
105 | type: me.type, |
106 | isCreate: me.isCreate, | |
f6710aac | 107 | storageId: me.storageId, |
f28ec3e4 TL |
108 | }); |
109 | ||
110 | Ext.apply(me, { | |
111 | subject: PVE.Utils.format_storage_type(me.type), | |
112 | isAdd: true, | |
232415d9 TL |
113 | bodyPadding: 0, |
114 | items: { | |
115 | xtype: 'tabpanel', | |
116 | region: 'center', | |
117 | layout: 'fit', | |
118 | bodyPadding: 10, | |
119 | items: [ | |
120 | me.ipanel, | |
017889f1 | 121 | { |
57513f76 | 122 | xtype: 'pveBackupJobPrunePanel', |
017889f1 | 123 | title: gettext('Backup Retention'), |
4981660f | 124 | hasMaxProtected: true, |
017889f1 | 125 | isCreate: me.isCreate, |
9c4c5797 FE |
126 | keepAllDefaultForCreate: true, |
127 | showPBSHint: me.ipanel.isPBS, | |
128 | fallbackHintHtml: gettext('Without any keep option, the node\'s vzdump.conf or `keep-all` is used as fallback for backup jobs'), | |
017889f1 | 129 | }, |
232415d9 TL |
130 | ], |
131 | }, | |
f28ec3e4 TL |
132 | }); |
133 | ||
d994d2a7 TL |
134 | if (me.ipanel.extraTabs) { |
135 | me.ipanel.extraTabs.forEach(panel => { | |
136 | panel.isCreate = me.isCreate; | |
137 | me.items.items.push(panel); | |
138 | }); | |
139 | } | |
140 | ||
f28ec3e4 TL |
141 | me.callParent(); |
142 | ||
06c8315d | 143 | if (!me.canDoBackups) { |
017889f1 TL |
144 | // cannot mask now, not fully rendered until activated |
145 | me.down('pmxPruneInputPanel').needMask = true; | |
146 | } | |
147 | ||
f28ec3e4 TL |
148 | if (!me.isCreate) { |
149 | me.load({ | |
8058410f | 150 | success: function(response, options) { |
b9e706fb SH |
151 | let values = response.result.data; |
152 | let ctypes = values.content || ''; | |
f28ec3e4 TL |
153 | |
154 | values.content = ctypes.split(','); | |
155 | ||
156 | if (values.nodes) { | |
157 | values.nodes = values.nodes.split(','); | |
158 | } | |
159 | values.enable = values.disable ? 0 : 1; | |
017889f1 TL |
160 | if (values['prune-backups']) { |
161 | let retention = PVE.Parser.parsePropertyString(values['prune-backups']); | |
162 | delete values['prune-backups']; | |
163 | Object.assign(values, retention); | |
164 | } else if (values.maxfiles !== undefined) { | |
165 | if (values.maxfiles > 0) { | |
166 | values['keep-last'] = values.maxfiles; | |
167 | } | |
168 | delete values.maxfiles; | |
169 | } | |
f28ec3e4 | 170 | |
232415d9 TL |
171 | me.query('inputpanel').forEach(panel => { |
172 | panel.setValues(values); | |
173 | }); | |
f6710aac | 174 | }, |
f28ec3e4 TL |
175 | }); |
176 | } | |
f6710aac | 177 | }, |
f28ec3e4 | 178 | }); |