Project

General

Profile

Download (11.5 KB) Statistics
| Branch: | Revision:
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

    
(7-7/23)