]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/storage/Base.js
api: add proxmox-firewall to versions pkg list
[pve-manager.git] / www / manager6 / storage / Base.js
1 Ext.define('PVE.panel.StorageBase', {
2 extend: 'Proxmox.panel.InputPanel',
3 controller: 'storageEdit',
4
5 type: '',
6
7 onGetValues: function(values) {
8 let 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 let 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
34 me.column2 = me.column2 || [];
35 me.column2.unshift(
36 {
37 xtype: 'pveNodeSelector',
38 name: 'nodes',
39 reference: 'storageNodeRestriction',
40 disabled: me.storageId === 'local',
41 fieldLabel: gettext('Nodes'),
42 emptyText: gettext('All') + ' (' + gettext('No restrictions') +')',
43 multiSelect: true,
44 autoSelect: false,
45 },
46 {
47 xtype: 'proxmoxcheckbox',
48 name: 'enable',
49 checked: true,
50 uncheckedValue: 0,
51 fieldLabel: gettext('Enable'),
52 },
53 );
54
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,
63 deleteEmpty: !me.isCreate,
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
76 me.callParent();
77 },
78 });
79
80 Ext.define('PVE.storage.BaseEdit', {
81 extend: 'Proxmox.window.Edit',
82
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
90 initComponent: function() {
91 let me = this;
92
93 me.isCreate = !me.storageId;
94
95 if (me.isCreate) {
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 }
102
103 me.ipanel = Ext.create(me.paneltype, {
104 title: gettext('General'),
105 type: me.type,
106 isCreate: me.isCreate,
107 storageId: me.storageId,
108 });
109
110 Ext.apply(me, {
111 subject: PVE.Utils.format_storage_type(me.type),
112 isAdd: true,
113 bodyPadding: 0,
114 items: {
115 xtype: 'tabpanel',
116 region: 'center',
117 layout: 'fit',
118 bodyPadding: 10,
119 items: [
120 me.ipanel,
121 {
122 xtype: 'pveBackupJobPrunePanel',
123 title: gettext('Backup Retention'),
124 hasMaxProtected: true,
125 isCreate: me.isCreate,
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'),
129 },
130 ],
131 },
132 });
133
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
141 me.callParent();
142
143 if (!me.canDoBackups) {
144 // cannot mask now, not fully rendered until activated
145 me.down('pmxPruneInputPanel').needMask = true;
146 }
147
148 if (!me.isCreate) {
149 me.load({
150 success: function(response, options) {
151 let values = response.result.data;
152 let ctypes = values.content || '';
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;
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 }
170
171 me.query('inputpanel').forEach(panel => {
172 panel.setValues(values);
173 });
174 },
175 });
176 }
177 },
178 });