]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/storage/Base.js
ui: pbs key show: improve labelWidth for 'Key' in translations
[pve-manager.git] / www / manager6 / storage / Base.js
CommitLineData
f28ec3e4
TL
1Ext.define('PVE.panel.StorageBase', {
2 extend: 'Proxmox.panel.InputPanel',
3 controller: 'storageEdit',
4
5 type: '',
6
7 onGetValues: function(values) {
8 var me = this;
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
22 initComponent : function() {
23 var me = this;
24
25 me.column1.unshift({
26 xtype: me.isCreate ? 'textfield' : 'displayfield',
27 name: 'storage',
28 value: me.storageId || '',
29 fieldLabel: 'ID',
30 vtype: 'StorageId',
31 allowBlank: false
32 });
33
e194ea7c 34 me.column2 = me.column2 || [];
f28ec3e4
TL
35 me.column2.unshift(
36 {
37 xtype: 'pveNodeSelector',
38 name: 'nodes',
39 disabled: me.storageId === 'local',
40 fieldLabel: gettext('Nodes'),
41 emptyText: gettext('All') + ' (' + gettext('No restrictions') +')',
42 multiSelect: true,
43 autoSelect: false
44 },
45 {
46 xtype: 'proxmoxcheckbox',
47 name: 'enable',
48 checked: true,
49 uncheckedValue: 0,
50 fieldLabel: gettext('Enable')
51 }
52 );
53
54 me.callParent();
55 }
56});
57
017889f1
TL
58Ext.define('PVE.panel.StoragePruneInputPanel', {
59 extend: 'Proxmox.panel.PruneInputPanel',
60 xtype: 'pveStoragePruneInputPanel',
61 mixins: ['Proxmox.Mixin.CBind'],
62
54a589be
TL
63 onlineHelp: 'vzdump_retention',
64
017889f1
TL
65 keepLastEmptyText: gettext('1'),
66
67 onGetValues: function(formValues) {
a55b3b71
TL
68 if (this.needMask) { // isMasked() may not yet be true if not rendered once
69 return {};
70 }
017889f1
TL
71 delete formValues.delete;
72 let retention = PVE.Parser.printPropertyString(formValues)
017889f1 73 if (retention === '') {
93489d89
DJ
74 if (this.isCreate) {
75 return {};
93489d89 76 }
c2d24034
TL
77 // always delete old 'maxfiles' on edit, we map it to keep-last on window load
78 return {
79 delete: ['prune-backups','maxfiles'],
80 };
017889f1 81 }
93489d89
DJ
82 let options = { 'prune-backups': retention };
83 if (!this.isCreate) {
84 options.delete = 'maxfiles';
017889f1 85 }
93489d89 86 return options;
017889f1
TL
87 },
88
56fad7c4
FE
89 updateComponents: function() {
90 let panel = this;
91
92 let keepAll = panel.down('proxmoxcheckbox[name=keep-all]').getValue();
93 let anyValue = false;
94 panel.query('pmxPruneKeepField').forEach(field => {
95 anyValue = anyValue || field.getValue() !== null;
96 field.setDisabled(keepAll);
97 });
98 panel.down('component[name=no-keeps-hint]').setHidden(anyValue || keepAll);
99 },
100
017889f1
TL
101 listeners: {
102 afterrender: function(panel) {
103 if (panel.needMask) {
104 panel.down('component[name=no-keeps-hint]').setHtml('');
105 panel.mask(
106 gettext('Backup content type not available for this storage.'),
107 );
108 } else if (panel.isCreate) {
017889f1
TL
109 panel.down('proxmoxcheckbox[name=keep-all]').setValue(true);
110 }
5b7ab402 111 panel.down('component[name=pbs-hint]').setHidden(!panel.isPBS);
56fad7c4
FE
112
113 panel.query('pmxPruneKeepField').forEach(field => {
114 field.on('change', panel.updateComponents, panel);
115 });
116 panel.updateComponents();
017889f1
TL
117 },
118 },
119
120 columnT: {
121 xtype: 'proxmoxcheckbox',
122 name: 'keep-all',
123 boxLabel: gettext('Keep all backups'),
124 listeners: {
125 change: function(field, newValue) {
126 let panel = field.up('pveStoragePruneInputPanel');
56fad7c4 127 panel.updateComponents();
017889f1
TL
128 },
129 },
130 },
131
5b7ab402
TL
132 columnB: [
133 {
134 xtype: 'component',
135 userCls: 'pmx-hint',
136 name: 'no-keeps-hint',
137 hidden: true,
138 padding: '5 1',
139 html: gettext('Without any keep option, the nodes vzdump.conf or `keep-last 1` is used as fallback for backup jobs'),
140 },
141 {
142 xtype: 'component',
143 userCls: 'pmx-hint',
144 name: 'pbs-hint',
145 hidden: true,
146 padding: '5 1',
147 html: gettext("It's preferred to configure backup retention directly on the Proxmox Backup Server."),
148 },
149 ],
017889f1
TL
150});
151
f28ec3e4
TL
152Ext.define('PVE.storage.BaseEdit', {
153 extend: 'Proxmox.window.Edit',
154
71dec88f
TL
155 apiCallDone: function(success, response, options) {
156 let me = this;
157 if (typeof me.ipanel.apiCallDone === "function") {
158 me.ipanel.apiCallDone(success, response, options);
159 }
160 },
161
f28ec3e4
TL
162 initComponent : function() {
163 var me = this;
164
165 me.isCreate = !me.storageId;
166
167 if (me.isCreate) {
f3c1eac7
TL
168 me.url = '/api2/extjs/storage';
169 me.method = 'POST';
170 } else {
171 me.url = '/api2/extjs/storage/' + me.storageId;
172 me.method = 'PUT';
173 }
f28ec3e4 174
71dec88f 175 me.ipanel = Ext.create(me.paneltype, {
232415d9 176 title: gettext('General'),
f28ec3e4
TL
177 type: me.type,
178 isCreate: me.isCreate,
179 storageId: me.storageId
180 });
181
182 Ext.apply(me, {
183 subject: PVE.Utils.format_storage_type(me.type),
184 isAdd: true,
232415d9
TL
185 bodyPadding: 0,
186 items: {
187 xtype: 'tabpanel',
188 region: 'center',
189 layout: 'fit',
190 bodyPadding: 10,
191 items: [
192 me.ipanel,
017889f1
TL
193 {
194 xtype: 'pveStoragePruneInputPanel',
195 title: gettext('Backup Retention'),
196 isCreate: me.isCreate,
5b7ab402 197 isPBS: me.ipanel.isPBS,
017889f1 198 },
232415d9
TL
199 ],
200 },
f28ec3e4
TL
201 });
202
d994d2a7
TL
203 if (me.ipanel.extraTabs) {
204 me.ipanel.extraTabs.forEach(panel => {
205 panel.isCreate = me.isCreate;
206 me.items.items.push(panel);
207 });
208 }
209
f28ec3e4
TL
210 me.callParent();
211
017889f1
TL
212 let contentTypeField = me.ipanel.down('pveContentTypeSelector');
213 if (contentTypeField && !contentTypeField.cts.includes('backup')) {
214 // cannot mask now, not fully rendered until activated
215 me.down('pmxPruneInputPanel').needMask = true;
216 }
217
f28ec3e4
TL
218 if (!me.isCreate) {
219 me.load({
220 success: function(response, options) {
221 var values = response.result.data;
222 var ctypes = values.content || '';
223
224 values.content = ctypes.split(',');
225
226 if (values.nodes) {
227 values.nodes = values.nodes.split(',');
228 }
229 values.enable = values.disable ? 0 : 1;
017889f1
TL
230 if (values['prune-backups']) {
231 let retention = PVE.Parser.parsePropertyString(values['prune-backups']);
232 delete values['prune-backups'];
233 Object.assign(values, retention);
234 } else if (values.maxfiles !== undefined) {
235 if (values.maxfiles > 0) {
236 values['keep-last'] = values.maxfiles;
237 }
238 delete values.maxfiles;
239 }
f28ec3e4 240
232415d9
TL
241 me.query('inputpanel').forEach(panel => {
242 panel.setValues(values);
243 });
f28ec3e4
TL
244 }
245 });
246 }
247 }
248});