1
|
define([
|
2
|
'steam2/user',
|
3
|
'steam2/stores',
|
4
|
'dijit/Dialog',
|
5
|
'dojox/html/entities'
|
6
|
], function(user, stores){
|
7
|
|
8
|
var griddialog = function(grid){
|
9
|
|
10
|
var self = {
|
11
|
item:null
|
12
|
};
|
13
|
|
14
|
var
|
15
|
_dialog,
|
16
|
_structure = grid.dialogStructure,
|
17
|
_dialog_id = "editDialog",
|
18
|
_handle,
|
19
|
|
20
|
_getAttrsStr = function(obj){
|
21
|
var attrs = [];
|
22
|
for(var k in obj){
|
23
|
var kv = k + '="' + obj[k] + '"';
|
24
|
attrs.push(kv);
|
25
|
}
|
26
|
return attrs.join(' ');
|
27
|
},
|
28
|
|
29
|
// inserts buttons for each action in dialogActions
|
30
|
_insertDialogButtons = function(){
|
31
|
var ihtml = grid.getActionButtons(self.item, true);
|
32
|
if (dojo.byId('dialogButtons')) dojo.byId('dialogButtons').innerHTML = ihtml;
|
33
|
if(grid.onDialogButtons){ grid.onDialogButtons(self.item);}
|
34
|
},
|
35
|
|
36
|
_insertDialogExtras = function(){
|
37
|
if(grid.dialogExtras){
|
38
|
dojo.byId("editDialogExtras").innerHTML = grid.dialogExtras(self.item);
|
39
|
}
|
40
|
},
|
41
|
|
42
|
_getTitle = function() {
|
43
|
if(self.item.status == "new"){
|
44
|
if (grid.name == "networks") return "Connection: Create New";
|
45
|
else return grid.name + ": Create New";
|
46
|
}
|
47
|
else{
|
48
|
if (grid.name == "users") return grid.name.substring(0,grid.name.length-1) + ": " + self.item.username;
|
49
|
else return grid.name.substring(0,grid.name.length-1) + ": " + self.item.name;
|
50
|
}
|
51
|
};
|
52
|
|
53
|
self.save = function() {
|
54
|
var form = dijit.byId('dialogForm');
|
55
|
var dstatus = self.item.status;
|
56
|
// side effect: shows warnings in UI
|
57
|
if(form.validate()) {
|
58
|
if(self.item.status == "new"){
|
59
|
if (grid.name == "users") {
|
60
|
self.item.username = dijit.byId("username").get('value');
|
61
|
}
|
62
|
self.item = grid.store.newItem(self.item);
|
63
|
}
|
64
|
|
65
|
dojo.forEach(_structure,function(s){
|
66
|
if(s.field && dijit.byId(s.field)){ // A field may be restricted to only admins /co
|
67
|
var value = dijit.byId(s.field).get('value');
|
68
|
if ((s.field.endsWith("storagequota") || s.field.endsWith("memoryquota")) && value>0) value = value * 1024;
|
69
|
var gridvalue = grid.store.getValue(self.item, s.field);
|
70
|
if (typeof value == "boolean") value = value+'';
|
71
|
if (value != gridvalue && (grid.name=='monitors' || typeof gridvalue !== "undefined" )) {
|
72
|
grid.store.setValue(self.item, s.field, value);
|
73
|
}
|
74
|
}
|
75
|
});
|
76
|
|
77
|
//console.log("saving", self.item, grid.store);
|
78
|
if(grid.onBeforeSave){grid.onBeforeSave(self.item);}
|
79
|
grid.save({
|
80
|
onComplete: function(){
|
81
|
if(grid.name == "servers"){
|
82
|
// home.grid.updatePending = images.grid.updatePending = networks.grid.updatePending = true;
|
83
|
// home.grid.refresh();
|
84
|
} else if (grid.name == "images" || grid.name == "networks") {
|
85
|
home.grid.refresh();
|
86
|
servers.grid.refresh();
|
87
|
servers.grid.updatePending = home.grid.updatePending = true;
|
88
|
}
|
89
|
if(dstatus == 'new'){
|
90
|
//dojo.publish(grid.name + ':create');
|
91
|
} else { // Update corresponding fields in systems store
|
92
|
var id = self.item.uuid;
|
93
|
if(grid.name == "nodes") {
|
94
|
id = self.item.mac;
|
95
|
} else if (grid.name == "users") {
|
96
|
id = self.item.username;
|
97
|
}
|
98
|
if (grid.name == "servers") {
|
99
|
home.grid.store.fetchItemByIdentity({identity: id,
|
100
|
onItem: function(item){
|
101
|
dojo.forEach(_structure,function(s){
|
102
|
if(s.field && dijit.byId(s.field)){ // A field may be restricted to only admins /co
|
103
|
var svalue = item[s.field];
|
104
|
if (typeof svalue == "boolean") svalue = svalue+'';
|
105
|
var value = self.item[s.field];
|
106
|
if (value != svalue) {
|
107
|
console.log("setting", value, svalue);
|
108
|
item[s.field] = value;
|
109
|
home.grid.store.setValue(item, s.field, value);
|
110
|
}
|
111
|
}
|
112
|
});
|
113
|
|
114
|
}
|
115
|
})
|
116
|
}
|
117
|
}
|
118
|
self.hide();
|
119
|
},
|
120
|
onError: function() {console.log("Error saving", self);}
|
121
|
});
|
122
|
}
|
123
|
else{
|
124
|
console.log("Form not validated");
|
125
|
return false;
|
126
|
}
|
127
|
return self.item;
|
128
|
};
|
129
|
|
130
|
self.show = function(item, onlyupdate){
|
131
|
self.item = item;
|
132
|
if (onlyupdate) {
|
133
|
_insertDialogButtons();
|
134
|
}
|
135
|
else{
|
136
|
if(grid.onBeforeDialog) {
|
137
|
grid.onBeforeDialog(self.item);
|
138
|
}
|
139
|
|
140
|
// var name = self.store.getValue(item, "name");
|
141
|
var name = self.item.name;
|
142
|
var items = [];
|
143
|
|
144
|
dojo.forEach(grid.dialogStructure,
|
145
|
function(s){
|
146
|
var val = self.item[s.field];
|
147
|
if (val && (s.field=='managementlink' || s.field=='upgradelink' || s.field=='terminallink') && self.item[s.field]=='--') val = '';
|
148
|
else if (val && s.field=='mac') val = ((self.item['status']=='shutoff' && self.item['locktonode']!='true')?"":val);
|
149
|
else if (s.field=='storagepool') {val = parseInt(val);}
|
150
|
else if (val && (s.field.endsWith("storagequota") || s.field.endsWith("memoryquota"))) {val = ((val>0)? Math.round(val/1024) : val) ;}
|
151
|
else val = dojox.html.entities.encode(""+val);
|
152
|
// else if (val) val = dojox.html.entities.encode(""+val);
|
153
|
// else val = "";
|
154
|
var dict = {
|
155
|
value: val,
|
156
|
kvs: _getAttrsStr(s.attrs),
|
157
|
type: s.type,
|
158
|
field: s.field,
|
159
|
autocomplete: "off",
|
160
|
label: s.name,
|
161
|
style: s.style ? s.style : "",
|
162
|
extra: s.extra ? s.extra(self.item) : "",
|
163
|
help: s.help ? '<a href="https://www.origo.io/info/stabiledocs/web/' + s.help + '" rel="help" target="_blank" class="irigo-tooltip">help</a>' : "",
|
164
|
restricted: s.restricted ? s.restricted : "",
|
165
|
checked: (s.type=="dijit.form.CheckBox" && self.item[s.field] && (self.item[s.field]==true || self.item[s.field]=='true'))?"checked":""
|
166
|
};
|
167
|
if ((s.restricted && !user.is_admin)) {
|
168
|
dict.style = "display:none;";
|
169
|
if (s.field == "password") dict.autocomplete = "new-password";
|
170
|
if (dict.type == "dijit.form.FilteringSelect") dict.type = "dijit.form.Select";
|
171
|
var t = [
|
172
|
' <input id="${field}" style="${style}" dojoType="${type}" ${checked} value="${value}" autocomplete="${autocomplete}"></input>',
|
173
|
' ${extra}'
|
174
|
].join('');
|
175
|
items.push(dojo.string.substitute(t, dict));
|
176
|
}
|
177
|
else
|
178
|
if(s.formatter){
|
179
|
items.push(s.formatter(self.item));
|
180
|
} else{
|
181
|
var t = [
|
182
|
'<td>',
|
183
|
' <div id="${field}label">${label}${help}</div>',
|
184
|
'</td>',
|
185
|
'<td>',
|
186
|
' <input id="${field}" style="${style}" dojoType="${type}" ${kvs} ${checked} value="${value}" autocomplete="new-password"></input>',
|
187
|
' ${extra}',
|
188
|
'</td>'].join('');
|
189
|
items.push(dojo.string.substitute(t, dict));
|
190
|
}
|
191
|
});
|
192
|
|
193
|
var content = items.join('<tr/><tr>');
|
194
|
content = [
|
195
|
'<form id="dialogForm" autocomplete="off" dojoType="dijit.form.Form"">',
|
196
|
'<div id="dialogDiv">',
|
197
|
'<div style="overflow:auto;">',
|
198
|
'<table style="width:100%;" class="dialogFormTable"><tr>' + content + '</tr></table>',
|
199
|
'<div id="editDialogExtras"></div>',
|
200
|
'</div>',
|
201
|
'</div>',
|
202
|
'<div style="padding: 10px 13px 10px 10px; border-top: 1px solid #e5e5e5; height:50px;">',
|
203
|
'<div id="dialogButtons"></div>',
|
204
|
'</div>',
|
205
|
'</form>'].join('');
|
206
|
|
207
|
_dialog = dijit.byId(_dialog_id);
|
208
|
if(!_dialog){ // else reuse the last one
|
209
|
_dialog = new dijit.Dialog(
|
210
|
{
|
211
|
id: _dialog_id,
|
212
|
/*
|
213
|
onCancel: function(){
|
214
|
self.onClose();
|
215
|
self.hide();
|
216
|
return true;
|
217
|
},
|
218
|
onClose: function(){
|
219
|
self.onClose();
|
220
|
self.hide();
|
221
|
return true;
|
222
|
}, */
|
223
|
title: "Settings"
|
224
|
});
|
225
|
}
|
226
|
_dialog.set('content', content);
|
227
|
_dialog.set('title', _getTitle());
|
228
|
_dialog.show();
|
229
|
|
230
|
_insertDialogExtras();
|
231
|
_insertDialogButtons();
|
232
|
|
233
|
var q = dojo.query('.irigo-tooltip');
|
234
|
q.irigoTooltip && q.irigoTooltip();
|
235
|
if(grid.onDialog){ grid.onDialog(self.item); }
|
236
|
|
237
|
if(!_handle){
|
238
|
dojo.subscribe(grid.name + ":update", function(task){
|
239
|
self.update(task);
|
240
|
});
|
241
|
}
|
242
|
}
|
243
|
};
|
244
|
|
245
|
self.hide = function(){
|
246
|
dojo.unsubscribe(_handle);
|
247
|
_handle = null;
|
248
|
if (_dialog) {
|
249
|
_dialog.hide();
|
250
|
_dialog.destroyRecursive();
|
251
|
}
|
252
|
};
|
253
|
|
254
|
self.onClose = function(){
|
255
|
self.hide();
|
256
|
};
|
257
|
|
258
|
self.isOpen = function(){
|
259
|
return _dialog ? _dialog.open : false;
|
260
|
};
|
261
|
|
262
|
self.update = function(task){
|
263
|
if ((task.status && task.status == "new")) {
|
264
|
return;
|
265
|
} else if(task.tab == "nodes"){
|
266
|
if(self.item.mac && self.item.mac !== task.mac) return;
|
267
|
} else if(task.tab == "users"){
|
268
|
if(self.item.username && self.item.username !== task.username) return;
|
269
|
} else if(self.item.uuid && self.item.uuid !== task.uuid){
|
270
|
return;
|
271
|
}
|
272
|
|
273
|
if (dojo.byId('status') && task.status) {
|
274
|
self.item.status = task.status;
|
275
|
dijit.byId('status').set('value', task.status);
|
276
|
}
|
277
|
|
278
|
if (dojo.byId('name') && task.name) {
|
279
|
self.item.name = task.name;
|
280
|
dijit.byId('name').set('value', task.name);
|
281
|
}
|
282
|
self.show(self.item, true);
|
283
|
};
|
284
|
|
285
|
return self;
|
286
|
};
|
287
|
window.griddialog = griddialog;
|
288
|
return griddialog;
|
289
|
|
290
|
});
|
291
|
|
292
|
|