]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - src/window/SafeDestroy.js
edit window: url is optional if both loadUrl and submitUrl are set
[proxmox-widget-toolkit.git] / src / window / SafeDestroy.js
CommitLineData
8d86570c
HL
1/* Popup a message window
2 * where the user has to manually enter the resource ID
3 * to enable the destroy button
4 */
5Ext.define('Proxmox.window.SafeDestroy', {
6 extend: 'Ext.window.Window',
7 alias: 'proxmoxSafeDestroy',
8
9 title: gettext('Confirm'),
10 modal: true,
11 buttonAlign: 'center',
12 bodyPadding: 10,
13 width: 450,
90cb5faf 14 layout: { type: 'hbox' },
8d86570c
HL
15 defaultFocus: 'confirmField',
16 showProgress: false,
17
18 config: {
19 item: {
20 id: undefined,
b8b160d6 21 purgeable: false,
8d86570c
HL
22 },
23 url: undefined,
12159d2c 24 note: undefined,
b8b160d6 25 taskName: undefined,
90cb5faf 26 params: {},
8d86570c
HL
27 },
28
29 getParams: function() {
cbb36e75
HL
30 let me = this;
31 const purgeCheckbox = me.lookupReference('purgeCheckbox');
8d86570c
HL
32 if (purgeCheckbox.checked) {
33 me.params.purge = 1;
34 }
35 if (Ext.Object.isEmpty(me.params)) {
36 return '';
37 }
38 return '?' + Ext.Object.toQueryString(me.params);
39 },
40
41 controller: {
42
43 xclass: 'Ext.app.ViewController',
44
45 control: {
46 'field[name=confirm]': {
47 change: function(f, value) {
cbb36e75
HL
48 const view = this.getView();
49 const removeButton = this.lookupReference('removeButton');
8d86570c
HL
50 if (value === view.getItem().id.toString()) {
51 removeButton.enable();
52 } else {
53 removeButton.disable();
54 }
55 },
90cb5faf 56 specialkey: function(field, event) {
cbb36e75 57 const removeButton = this.lookupReference('removeButton');
90cb5faf 58 if (!removeButton.isDisabled() && event.getKey() === event.ENTER) {
8d86570c
HL
59 removeButton.fireEvent('click', removeButton, event);
60 }
90cb5faf 61 },
8d86570c
HL
62 },
63 'button[reference=removeButton]': {
64 click: function() {
cbb36e75 65 const view = this.getView();
8d86570c
HL
66 Proxmox.Utils.API2Request({
67 url: view.getUrl() + view.getParams(),
68 method: 'DELETE',
69 waitMsgTarget: view,
70 failure: function(response, opts) {
71 view.close();
72 Ext.Msg.alert('Error', response.htmlStatus);
73 },
74 success: function(response, options) {
cbb36e75 75 const hasProgressBar = !!(view.showProgress &&
90cb5faf 76 response.result.data);
8d86570c
HL
77
78 if (hasProgressBar) {
79 // stay around so we can trigger our close events
80 // when background action is completed
81 view.hide();
82
cbb36e75
HL
83 const upid = response.result.data;
84 const win = Ext.create('Proxmox.window.TaskProgress', {
8d86570c
HL
85 upid: upid,
86 listeners: {
90cb5faf 87 destroy: function() {
8d86570c 88 view.close();
90cb5faf
HL
89 },
90 },
8d86570c
HL
91 });
92 win.show();
93 } else {
94 view.close();
95 }
90cb5faf 96 },
8d86570c 97 });
90cb5faf
HL
98 },
99 },
100 },
8d86570c
HL
101 },
102
103 items: [
104 {
105 xtype: 'component',
90cb5faf 106 cls: [Ext.baseCSSPrefix + 'message-box-icon',
8d86570c 107 Ext.baseCSSPrefix + 'message-box-warning',
90cb5faf 108 Ext.baseCSSPrefix + 'dlg-icon'],
8d86570c
HL
109 },
110 {
111 xtype: 'container',
112 flex: 1,
113 layout: {
114 type: 'vbox',
90cb5faf 115 align: 'stretch',
8d86570c
HL
116 },
117 items: [
118 {
119 xtype: 'component',
90cb5faf 120 reference: 'messageCmp',
8d86570c
HL
121 },
122 {
123 itemId: 'confirmField',
124 reference: 'confirmField',
125 xtype: 'textfield',
126 name: 'confirm',
127 labelWidth: 300,
128 hideTrigger: true,
90cb5faf 129 allowBlank: false,
8d86570c
HL
130 },
131 {
132 xtype: 'proxmoxcheckbox',
133 name: 'purge',
134 reference: 'purgeCheckbox',
135 boxLabel: gettext('Purge'),
136 checked: false,
137 autoEl: {
138 tag: 'div',
90cb5faf
HL
139 'data-qtip': gettext('Remove from replication and backup jobs'),
140 },
141 },
12159d2c
HL
142 {
143 xtype: 'container',
144 reference: 'noteContainer',
145 flex: 1,
146 hidden: true,
147 layout: {
148 type: 'vbox',
149 align: 'middle',
150 },
151 height: 25,
152 items: [
153 {
154 xtype: 'component',
155 reference: 'noteCmp',
156 width: '300px',
157 style: 'font-size: smaller; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;',
158 },
159 ],
160 },
90cb5faf
HL
161 ],
162 },
8d86570c
HL
163 ],
164 buttons: [
165 {
166 reference: 'removeButton',
167 text: gettext('Remove'),
90cb5faf
HL
168 disabled: true,
169 },
8d86570c
HL
170 ],
171
90cb5faf 172 initComponent: function() {
cbb36e75 173 let me = this;
8d86570c
HL
174
175 me.callParent();
176
cbb36e75 177 const item = me.getItem();
8d86570c
HL
178
179 if (!Ext.isDefined(item.id)) {
180 throw "no ID specified";
181 }
182
cbb36e75 183 const messageCmp = me.lookupReference('messageCmp');
12159d2c 184 const noteCmp = me.lookupReference('noteCmp');
cbb36e75 185 let msg;
8d86570c 186
12159d2c
HL
187 if (Ext.isDefined(me.getNote())) {
188 noteCmp.setHtml(`<span title="${me.getNote()}">${me.getNote()}</span>`);
189 const noteContainer = me.lookupReference('noteContainer');
190 noteContainer.setHidden(false);
191 noteContainer.setDisabled(false);
192 }
193
b8b160d6
HL
194 if (Ext.isDefined(me.getTaskName())) {
195 msg = Proxmox.Utils.format_task_description(me.getTaskName(), item.id);
196 messageCmp.setHtml(msg);
8d86570c 197 } else {
b8b160d6 198 throw "no task name specified";
8d86570c
HL
199 }
200
b8b160d6 201 if (!item.purgeable) {
cbb36e75 202 const purgeCheckbox = me.lookupReference('purgeCheckbox');
8d86570c
HL
203 purgeCheckbox.setDisabled(true);
204 purgeCheckbox.setHidden(true);
205 }
206
cbb36e75 207 const confirmField = me.lookupReference('confirmField');
8d86570c
HL
208 msg = gettext('Please enter the ID to confirm') +
209 ' (' + item.id + ')';
210 confirmField.setFieldLabel(msg);
90cb5faf 211 },
8d86570c 212});