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