]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/Directory.js
ui: zfs create: switch to using widget-toolkit's multiDiskSelector
[pve-manager.git] / www / manager6 / node / Directory.js
1 Ext.define('PVE.node.CreateDirectory', {
2 extend: 'Proxmox.window.Edit',
3 xtype: 'pveCreateDirectory',
4
5 subject: Proxmox.Utils.directoryText,
6
7 showProgress: true,
8
9 onlineHelp: 'chapter_storage',
10
11 initComponent: function() {
12 var me = this;
13
14 if (!me.nodename) {
15 throw "no node name specified";
16 }
17
18 me.isCreate = true;
19
20 Ext.applyIf(me, {
21 url: "/nodes/" + me.nodename + "/disks/directory",
22 method: 'POST',
23 items: [
24 {
25 xtype: 'pmxDiskSelector',
26 name: 'device',
27 nodename: me.nodename,
28 diskType: 'unused',
29 fieldLabel: gettext('Disk'),
30 allowBlank: false,
31 },
32 {
33 xtype: 'proxmoxKVComboBox',
34 comboItems: [
35 ['ext4', 'ext4'],
36 ['xfs', 'xfs'],
37 ],
38 fieldLabel: gettext('Filesystem'),
39 name: 'filesystem',
40 value: '',
41 allowBlank: false,
42 },
43 {
44 xtype: 'proxmoxtextfield',
45 name: 'name',
46 fieldLabel: gettext('Name'),
47 allowBlank: false,
48 },
49 {
50 xtype: 'proxmoxcheckbox',
51 name: 'add_storage',
52 fieldLabel: gettext('Add Storage'),
53 value: '1',
54 },
55 ],
56 });
57
58 me.callParent();
59 },
60 });
61
62 Ext.define('PVE.node.Directorylist', {
63 extend: 'Ext.grid.Panel',
64 xtype: 'pveDirectoryList',
65
66 viewModel: {
67 data: {
68 path: '',
69 },
70 formulas: {
71 dirName: (get) => get('path')?.replace('/mnt/pve/', '') || undefined,
72 },
73 },
74
75 controller: {
76 xclass: 'Ext.app.ViewController',
77
78 destroyDirectory: function() {
79 let me = this;
80 let vm = me.getViewModel();
81 let view = me.getView();
82
83 const dirName = vm.get('dirName');
84
85 if (!view.nodename) {
86 throw "no node name specified";
87 }
88
89 if (!dirName) {
90 throw "no directory name specified";
91 }
92
93 Ext.create('PVE.window.SafeDestroyStorage', {
94 url: `/nodes/${view.nodename}/disks/directory/${dirName}`,
95 item: { id: dirName },
96 taskName: 'dirremove',
97 taskDone: () => { view.reload(); },
98 }).show();
99 },
100 },
101
102 stateful: true,
103 stateId: 'grid-node-directory',
104 columns: [
105 {
106 text: gettext('Path'),
107 dataIndex: 'path',
108 flex: 1,
109 },
110 {
111 header: gettext('Device'),
112 flex: 1,
113 dataIndex: 'device',
114 },
115 {
116 header: gettext('Type'),
117 width: 100,
118 dataIndex: 'type',
119 },
120 {
121 header: gettext('Options'),
122 width: 100,
123 dataIndex: 'options',
124 },
125 {
126 header: gettext('Unit File'),
127 hidden: true,
128 dataIndex: 'unitfile',
129 },
130 ],
131
132 rootVisible: false,
133 useArrows: true,
134
135 tbar: [
136 {
137 text: gettext('Reload'),
138 iconCls: 'fa fa-refresh',
139 handler: function() {
140 this.up('panel').reload();
141 },
142 },
143 {
144 text: `${gettext('Create')}: ${gettext('Directory')}`,
145 handler: function() {
146 let view = this.up('panel');
147 Ext.create('PVE.node.CreateDirectory', {
148 nodename: view.nodename,
149 listeners: {
150 destroy: () => view.reload(),
151 },
152 autoShow: true,
153 });
154 },
155 },
156 '->',
157 {
158 xtype: 'tbtext',
159 data: {
160 dirName: undefined,
161 },
162 bind: {
163 data: {
164 dirName: "{dirName}",
165 },
166 },
167 tpl: [
168 '<tpl if="dirName">',
169 gettext('Directory') + ' {dirName}:',
170 '<tpl else>',
171 Ext.String.format(gettext('No {0} selected'), gettext('directory')),
172 '</tpl>',
173 ],
174 },
175 {
176 text: gettext('More'),
177 iconCls: 'fa fa-bars',
178 disabled: true,
179 bind: {
180 disabled: '{!dirName}',
181 },
182 menu: [
183 {
184 text: gettext('Destroy'),
185 itemId: 'remove',
186 iconCls: 'fa fa-fw fa-trash-o',
187 handler: 'destroyDirectory',
188 disabled: true,
189 bind: {
190 disabled: '{!dirName}',
191 },
192 },
193 ],
194 },
195 ],
196
197 reload: function() {
198 let me = this;
199 me.store.load();
200 me.store.sort();
201 },
202
203 listeners: {
204 activate: function() {
205 this.reload();
206 },
207 selectionchange: function(model, selected) {
208 let me = this;
209 let vm = me.getViewModel();
210
211 vm.set('path', selected[0]?.data.path || '');
212 },
213 },
214
215 initComponent: function() {
216 let me = this;
217
218 me.nodename = me.pveSelNode.data.node;
219 if (!me.nodename) {
220 throw "no node name specified";
221 }
222
223 Ext.apply(me, {
224 store: {
225 fields: ['path', 'device', 'type', 'options', 'unitfile'],
226 proxy: {
227 type: 'proxmox',
228 url: `/api2/json/nodes/${me.nodename}/disks/directory`,
229 },
230 sorters: 'path',
231 },
232 });
233
234 me.callParent();
235
236 Proxmox.Utils.monStoreErrors(me, me.getStore(), true);
237 me.reload();
238 },
239 });
240