]>
Commit | Line | Data |
---|---|---|
7c0a43d9 | 1 | Ext.define('PVE.form.StorageSelector', { |
0fc95a12 | 2 | extend: 'Proxmox.form.ComboGrid', |
4cb75dd9 | 3 | alias: 'widget.pveStorageSelector', |
76fae470 FE |
4 | mixins: ['Proxmox.Mixin.CBind'], |
5 | ||
6 | cbindData: { | |
7 | clusterView: false, | |
8 | }, | |
7c0a43d9 | 9 | |
a13842bf EK |
10 | allowBlank: false, |
11 | valueField: 'storage', | |
12 | displayField: 'storage', | |
13 | listConfig: { | |
76fae470 FE |
14 | cbind: { |
15 | clusterView: '{clusterView}', | |
16 | }, | |
eb89111d | 17 | width: 450, |
a13842bf EK |
18 | columns: [ |
19 | { | |
20 | header: gettext('Name'), | |
21 | dataIndex: 'storage', | |
22 | hideable: false, | |
f6710aac | 23 | flex: 1, |
a13842bf EK |
24 | }, |
25 | { | |
26 | header: gettext('Type'), | |
eb89111d | 27 | width: 75, |
f6710aac | 28 | dataIndex: 'type', |
a13842bf EK |
29 | }, |
30 | { | |
31 | header: gettext('Avail'), | |
eb89111d | 32 | width: 90, |
a13842bf | 33 | dataIndex: 'avail', |
f6710aac | 34 | renderer: Proxmox.Utils.format_size, |
76fae470 FE |
35 | cbind: { |
36 | hidden: '{clusterView}', | |
37 | }, | |
a13842bf EK |
38 | }, |
39 | { | |
40 | header: gettext('Capacity'), | |
eb89111d | 41 | width: 90, |
a13842bf | 42 | dataIndex: 'total', |
f6710aac | 43 | renderer: Proxmox.Utils.format_size, |
76fae470 FE |
44 | cbind: { |
45 | hidden: '{clusterView}', | |
46 | }, | |
47 | }, | |
48 | { | |
49 | header: gettext('Nodes'), | |
50 | width: 120, | |
51 | dataIndex: 'nodes', | |
52 | renderer: (value) => value ? value : '-- ' + gettext('All') + ' --', | |
53 | cbind: { | |
54 | hidden: '{!clusterView}', | |
55 | }, | |
56 | }, | |
57 | { | |
58 | header: gettext('Shared'), | |
59 | width: 70, | |
60 | dataIndex: 'shared', | |
61 | renderer: Proxmox.Utils.format_boolean, | |
62 | cbind: { | |
63 | hidden: '{!clusterView}', | |
64 | }, | |
f6710aac TL |
65 | }, |
66 | ], | |
a13842bf EK |
67 | }, |
68 | ||
7c0a43d9 | 69 | reloadStorageList: function() { |
4fe1ea25 | 70 | let me = this; |
7c0a43d9 | 71 | |
76fae470 FE |
72 | if (me.clusterView) { |
73 | me.getStore().setProxy({ | |
74 | type: 'proxmox', | |
75 | url: `/api2/json/storage`, | |
76 | }); | |
77 | ||
78 | // filter here, back-end does not support it currently | |
79 | let filters = [(storage) => !storage.data.disable]; | |
80 | ||
81 | if (me.storageContent) { | |
82 | filters.push( | |
83 | (storage) => storage.data.content.split(',').includes(me.storageContent), | |
84 | ); | |
85 | } | |
86 | ||
87 | if (me.nodename) { | |
88 | filters.push( | |
89 | (storage) => !storage.data.nodes || storage.data.nodes.includes(me.nodename), | |
90 | ); | |
91 | } | |
92 | ||
93 | me.getStore().clearFilter(); | |
94 | me.getStore().setFilters(filters); | |
95 | } else { | |
96 | if (!me.nodename) { | |
97 | return; | |
98 | } | |
99 | ||
100 | let params = { | |
101 | format: 1, | |
102 | }; | |
103 | if (me.storageContent) { | |
104 | params.content = me.storageContent; | |
105 | } | |
106 | if (me.targetNode) { | |
107 | params.target = me.targetNode; | |
108 | params.enabled = 1; // skip disabled storages | |
109 | } | |
110 | me.store.setProxy({ | |
111 | type: 'proxmox', | |
112 | url: `/api2/json/nodes/${me.nodename}/storage`, | |
113 | extraParams: params, | |
114 | }); | |
7c0a43d9 | 115 | } |
7c0a43d9 | 116 | |
00c3ac53 | 117 | me.store.load(() => me.validate()); |
7c0a43d9 DM |
118 | }, |
119 | ||
120 | setTargetNode: function(targetNode) { | |
121 | var me = this; | |
122 | ||
53e3ea84 | 123 | if (!targetNode || me.targetNode === targetNode) { |
7c0a43d9 DM |
124 | return; |
125 | } | |
126 | ||
76fae470 FE |
127 | if (me.clusterView) { |
128 | throw "setting targetNode with clusterView is not implemented"; | |
129 | } | |
130 | ||
7c0a43d9 DM |
131 | me.targetNode = targetNode; |
132 | ||
133 | me.reloadStorageList(); | |
134 | }, | |
135 | ||
136 | setNodename: function(nodename) { | |
137 | var me = this; | |
138 | ||
1c646aa2 FE |
139 | nodename = nodename || ''; |
140 | ||
141 | if (me.nodename === nodename) { | |
7c0a43d9 DM |
142 | return; |
143 | } | |
144 | ||
145 | me.nodename = nodename; | |
146 | ||
147 | me.reloadStorageList(); | |
148 | }, | |
149 | ||
150 | initComponent: function() { | |
151 | var me = this; | |
152 | ||
00c3ac53 | 153 | let nodename = me.nodename; |
2a4971d8 | 154 | me.nodename = undefined; |
7c0a43d9 DM |
155 | |
156 | var store = Ext.create('Ext.data.Store', { | |
157 | model: 'pve-storage-status', | |
158 | sorters: { | |
2a4971d8 | 159 | property: 'storage', |
392e3cf1 | 160 | direction: 'ASC', |
f6710aac | 161 | }, |
7c0a43d9 DM |
162 | }); |
163 | ||
164 | Ext.apply(me, { | |
f6710aac | 165 | store: store, |
7c0a43d9 DM |
166 | }); |
167 | ||
00c3ac53 | 168 | me.callParent(); |
7c0a43d9 | 169 | |
1c646aa2 | 170 | me.setNodename(nodename); |
f6710aac | 171 | }, |
7c0a43d9 | 172 | }, function() { |
7c0a43d9 DM |
173 | Ext.define('pve-storage-status', { |
174 | extend: 'Ext.data.Model', | |
76fae470 | 175 | fields: ['storage', 'active', 'type', 'avail', 'total', 'nodes', 'shared'], |
f6710aac | 176 | idProperty: 'storage', |
7c0a43d9 | 177 | }); |
7c0a43d9 | 178 | }); |