Introduced a mechanism to load required javascripts at runtime

(lazy loading) using the require.js. This allows us to load the
javascript required for any node, only when it was loaded in the browser
tree. Also, introduced the mechanism to show/edit/create of any node in
a tab panel (wcDocker.Panel).
This commit is contained in:
Ashesh Vashi
2015-06-30 11:21:55 +05:30
parent 35d01bea3e
commit aa150030eb
77 changed files with 24504 additions and 1395 deletions

View File

@@ -10,75 +10,45 @@
from abc import ABCMeta, abstractmethod
import traceback
from flask import Blueprint, Response, current_app, request, render_template
import json
from flask import request, render_template, make_response, jsonify
from flask.ext.babel import gettext
from flask.ext.security import current_user, login_required
from pgadmin import current_blueprint
from pgadmin.utils.ajax import make_json_response
from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response
from pgadmin.browser import BrowserPluginModule
from pgadmin.utils.menu import MenuItem
from pgadmin.settings.settings_model import db, ServerGroup
from pgadmin.browser.utils import generate_browser_node
import config
class ServerGroupModule(BrowserPluginModule):
NODE_TYPE = "server-group"
def get_own_menuitems(self):
return {
'standard_items': [
ServerGroupMenuItem(action="drop", priority=10, function="drop_server_group"),
ServerGroupMenuItem(action="rename", priority=10, function="rename_server_group")
],
'create_items': [
ServerGroupMenuItem(name="create_server_group",
label=gettext('Server Group...'),
priority=10,
function="create_server_group",
types=[self.node_type])
],
'context_items': [
ServerGroupMenuItem(name="delete_server_group",
label=gettext('Delete server group'),
priority=10,
onclick='drop_server_group(item);'),
ServerGroupMenuItem(name="rename_server_group",
label=gettext('Rename server group...'),
priority=10,
onclick='rename_server_group(item);')
]
}
@property
def jssnippets(self):
snippets = [render_template("server_groups/server_groups.js")]
for module in self.submodules:
snippets.extend(module.jssnippets)
return snippets
def get_nodes(self, **kwargs):
def get_nodes(self, *arg, **kwargs):
"""Return a JSON document listing the server groups for the user"""
groups = ServerGroup.query.filter_by(user_id=current_user.id)
# TODO: Move this JSON generation to a Server method
# this code is duplicated somewhere else
for group in groups:
yield generate_browser_node(
group = self.generate_browser_node(
"%d" % (group.id),
None,
group.name,
"icon-%s" % self.node_type,
True,
self.node_type)
True)
yield group
@property
def node_type(self):
return self.NODE_TYPE
@property
def script_load(self):
return None
@property
def node_path(self):
return '/browser/' + self.node_type
return BrowserPluginModule.browser_url_prefix + self.node_type
class ServerGroupMenuItem(MenuItem):
@@ -97,17 +67,25 @@ class ServerGroupPluginModule(BrowserPluginModule):
@abstractmethod
def get_nodes(self, servergroup):
def get_nodes(self, *arg, **kwargs):
pass
@property
def node_path(self):
return '/browser/' + self.node_type
return BrowserPluginModule.browser_url_prefix + self.node_type
blueprint = ServerGroupModule( __name__, static_url_path='')
@blueprint.route('/module.js')
@login_required
def module():
return make_response(
render_template("server_groups/server_groups.js"),
200, {'Content-Type': 'application/x-javascript'})
# Initialise the module
from pgadmin.browser.utils import NodeView
@@ -136,14 +114,16 @@ class ServerGroupView(NodeView):
if servergroup is None:
return make_json_response(
status=417,
success=0,
errormsg=gettext('The specified server group could not be found.'))
else:
try:
db.session.delete(servergroup)
for sg in servergroup:
db.session.delete(sg)
db.session.commit()
except Exception as e:
return make_json_response(success=0, errormsg=e.message)
return make_json_response(status=410, success=0, errormsg=e.message)
return make_json_response(result=request.form)
@@ -156,17 +136,20 @@ class ServerGroupView(NodeView):
user_id=current_user.id,
id=gid).first()
data = request.form if request.form else json.loads(request.data)
if servergroup is None:
return make_json_response(
status=417,
success=0,
errormsg=gettext('The specified server group could not be found.'))
else:
try:
if 'name' in request.form:
servergroup.name = request.form['name']
if u'name' in data:
servergroup.name = data[u'name']
db.session.commit()
except Exception as e:
return make_json_response(success=0, errormsg=e.message)
return make_json_response(status=410, success=0, errormsg=e.message)
return make_json_response(result=request.form)
@@ -182,34 +165,47 @@ class ServerGroupView(NodeView):
if sg is None:
return make_json_response(
status=417,
success=0,
errormsg=gettext('The specified server group could not be found.'))
else:
return make_json_response(data={'id': sg.id, 'name': sg.name})
return ajax_response(response={'id': sg.id, 'name': sg.name},
status=200)
def create(self):
data = []
if request.form['name'] != '':
servergroup = ServerGroup(
user_id=current_user.id,
name=request.form['name'])
data = request.form if request.form else json.loads(request.data)
if data[u'name'] != '':
try:
db.session.add(servergroup)
sg = ServerGroup(
user_id=current_user.id,
name=data[u'name'])
db.session.add(sg)
db.session.commit()
data['id'] = servergroup.id
data['name'] = servergroup.name
data[u'id'] = sg.id
data[u'name'] = sg.name
return jsonify(node=blueprint.generate_browser_node(
"%d" % (sg.id),
None,
sg.name,
"icon-%s" % self.node_type,
True))
except Exception as e:
return make_json_response(success=0, errormsg=e.message)
print 'except'
return make_json_response(
status=410,
success=0,
errormsg=e.message)
else:
return make_json_response(
status=417,
success=0,
errormsg=gettext('No server group name was specified'))
return make_json_response(data=data)
def nodes(self, gid):
"""Build a list of treeview nodes from the child nodes."""
@@ -220,23 +216,23 @@ class ServerGroupView(NodeView):
def sql(self, gid):
return make_json_response(data='')
return make_json_response(status=422)
def modified_sql(self, gid):
return make_json_response(data='')
return make_json_response(status=422)
def statistics(self, gid):
return make_json_response(data='')
return make_json_response(status=422)
def dependencies(self, gid):
return make_json_response(data='')
return make_json_response(status=422)
def dependents(self, gid):
return make_json_response(data='')
return make_json_response(status=422)
ServerGroupView.register_node_view(blueprint)

View File

@@ -6,72 +6,58 @@
# This software is released under the PostgreSQL Licence
#
##########################################################################
from flask import render_template, request
from pgadmin.browser.server_groups import ServerGroupPluginModule
import json
from flask import render_template, request, make_response, jsonify
from flask.ext.security import login_required, current_user
from pgadmin.settings.settings_model import db, Server, ServerGroup
from pgadmin.utils.menu import MenuItem
from pgadmin.utils.ajax import make_json_response
from pgadmin.browser.utils import generate_browser_node, NodeView
from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response
from pgadmin.browser.utils import NodeView, generate_browser_node
import traceback
from flask.ext.babel import gettext
import pgadmin.browser.server_groups as sg
class ServerModule(ServerGroupPluginModule):
class ServerModule(sg.ServerGroupPluginModule):
NODE_TYPE = "server"
@property
def node_type(self):
return self.NODE_TYPE
@property
def script_load(self):
"""
Load the module script for server, when any of the server-group node is
initialized.
"""
return sg.ServerGroupModule.NODE_TYPE
def get_nodes(self, server_group):
"""Return a JSON document listing the server groups for the user"""
servers = Server.query.filter_by(user_id=current_user.id, servergroup_id=server_group)
servers = Server.query.filter_by(user_id=current_user.id,
servergroup_id=server_group)
# TODO: Move this JSON generation to a Server method
for server in servers:
yield generate_browser_node(
"%d" % server.id,
server.name,
"icon-%s" % self.NODE_TYPE,
True,
self.NODE_TYPE
)
def get_own_menuitems(self):
return {
'standard_items': [
ServerMenuItem(action="drop", priority=50, function='drop_server'),
ServerMenuItem(action="rename", priority=50, function='rename_server')
],
'create_items': [
ServerMenuItem(types=["server-group", "server"],
name="create_server",
label=gettext('Server...'),
priority=50,
function='create_server(item)')
],
'context_items': [
ServerMenuItem(name='delete_server',
label=gettext('Delete server'),
priority=50,
onclick='drop_server(item)'),
ServerMenuItem(name='rename_server',
label=gettext('Rename server...'),
priority=60,
onclick='rename_server(item);')
]
}
node = generate_browser_node(
"%d" % (server.id),
"%d" % server_group,
server.name,
"icon-%s-not-connected" % self.NODE_TYPE,
True,
self.NODE_TYPE)
yield node
@property
def jssnippets(self):
return [render_template("servers/servers.js")]
return []
class ServerMenuItem(MenuItem):
def __init__(self, **kwargs):
kwargs.setdefault("type", ServerModule.NODE_TYPE)
super(ServerMenuItem, self).__init__(**kwargs)
@@ -80,59 +66,74 @@ class ServerMenuItem(MenuItem):
blueprint = ServerModule(__name__)
@blueprint.route('/module.js')
@login_required
def module():
return make_response(
render_template("servers/servers.js"),
200, {'Content-Type': 'application/x-javascript'})
class ServerNode(NodeView):
node_type = ServerModule.NODE_TYPE
parent_ids = [{'type':'int', 'id':'gid'}]
ids = [{'type':'int', 'id':'sid'}]
parent_ids = [{'type': 'int', 'id': 'gid'}]
ids = [{'type': 'int', 'id': 'sid'}]
operations = dict({
'obj': [
{'get': 'properties', 'delete': 'delete', 'put': 'update'},
{'get': 'list', 'post': 'create'}
],
'nodes': [{'get': 'nodes'}],
'sql': [{'get': 'sql', 'post': 'modified_sql'}],
'stats': [{'get': 'statistics'}],
'deps': [{'get': 'dependencies', 'post': 'dependents'}],
'connect': [{'get': 'connect_status', 'post': 'connect', 'delete': 'disconnect'}]
})
def list(self, gid):
res = []
"""Return a JSON document listing the server groups for the user"""
servers = Server.query.filter_by(user_id=current_user.id,
servergroup_id=gid)
servergroup_id=gid)
for server in servers:
res.append(
generate_browser_node(
"%d/%d" % (gid, server.id),
server.name,
"icon-%s" % NODE_TYPE,
True,
NODE_TYPE
)
)
generate_browser_node(
"%s" % server.id,
"%s" % gid,
server.name,
"icon-%s-not-connected" % ServerModule.NODE_TYPE,
True,
ServerModule.NODE_TYPE)
)
return make_json_response(result=res)
def delete(self, gid, sid):
"""Delete a server node in the settings database"""
server = Server.query.filter_by(user_id=current_user.id, id=sid)
servers = Server.query.filter_by(user_id=current_user.id, id=sid)
# TODO:: A server, which is connected, can not be deleted
if server is None:
if servers is None:
return make_json_response(
success=0,
errormsg=gettext(
'The specified server could not be found.\n'
'Does the user have permission to access the '
'server?'
)
)
success=0,
errormsg=gettext(
'The specified server could not be found.\n'
'Does the user have permission to access the '
'server?'
)
)
else:
try:
db.session.delete(server)
for s in servers:
db.session.delete(s)
db.session.commit()
except Exception as e:
return make_json_response(
success=0,
errormsg=e.message)
return make_json_response(success=success,
errormsg=errormsg,
info=traceback.format_exc())
success=0,
errormsg=e.message)
return make_json_response(success=1,
info=traceback.format_exc())
def update(self, gid, sid):
"""Update the server settings"""
@@ -140,130 +141,139 @@ class ServerNode(NodeView):
if server is None:
return make_json_response(
success=0,
errormsg=gettext("Couldn't find the given server.")
)
success=0,
errormsg=gettext("Couldn't find the given server.")
)
# TODO::
# Not all parameters can be modified, while the server is connected
possible_args = {
'name': 'name',
'host': 'host',
'port': 'port',
'db': 'maintenance_db',
'username': 'username',
'sslmode': 'sslmode',
'gid': 'servergroup_id'
}
'name': 'name',
'host': 'host',
'port': 'port',
'db': 'maintenance_db',
'username': 'username',
'sslmode': 'sslmode',
'gid': 'servergroup_id',
'comment': 'comment'
}
idx = 0
data = request.form if request.form else json.loads(request.data)
for arg in possible_args:
if arg in request.form:
server[possible_args[arg]] = request.form[arg]
if arg in data:
setattr(server, possible_args[arg], data[arg])
idx += 1
if idx == 0:
return make_json_response(
success=0,
errormsg=gettext('No parameters were chagned!')
)
success=0,
errormsg=gettext('No parameters were chagned!')
)
try:
db.session.commit()
except Exception as e:
return make_json_response(
success=0,
errormsg=e.message
)
success=0,
errormsg=e.message
)
return make_json_response(
success=1,
data={
'id': server.id,
'gid': server.servergroup_id
}
)
success=1,
data={
'id': server.id,
'gid': server.servergroup_id
}
)
def properties(self, gid, sid):
"""Return list of attributes of a server"""
server = Server.query.filter_by(
user_id=current_user.id,
id=sid).first()
user_id=current_user.id,
id=sid).first()
if server is None:
return make_json_response(
success=0,
errormsg=gettext("Couldn't find the given server")
)
success=0,
errormsg=gettext("Couldn't find the given server")
)
sg = ServerGroup.query.filter_by(
user_id=current_user.id,
id=server.servergroup_id
).first()
return make_json_response(
success=1,
data={
'id':server.id,
'name':server.name,
'host':server.host,
'port':server.port,
'db':server.maintenance_db,
'username':server.username,
'gid':server.servergroup_id,
'group-name':sg.name
}
)
user_id=current_user.id,
id=server.servergroup_id
).first()
return ajax_response(
response={
'id': server.id,
'name': server.name,
'host': server.host,
'port': server.port,
'db': server.maintenance_db,
'username': server.username,
'gid': server.servergroup_id,
'group-name': sg.name,
'comment': server.comment,
# TODO:: Make sure - we do have correct values here
'connected': True,
'version': 'PostgreSQL 9.3 (linux-x64)'
}
)
def create(self, gid):
"""Add a server node to the settings database"""
required_args = [
'name',
'host',
'port',
'db',
'username',
'sslmode'
]
u'name',
u'host',
u'port',
u'db',
u'username',
u'sslmode'
]
data = request.form if request.form else json.loads(request.data)
for arg in required_args:
if arg not in request.form:
if arg not in data:
return make_json_response(
success=0,
errormsg=gettext(
"Couldn't find the required parameter (%s)." % arg
)
)
server = Server(
user_id=current_user.id,
servergroup_id=gid,
name=request.form['name'],
host=request.form['host'],
port=request.form['port'],
maintenance_db=request.form['db'],
username=request.form['username'],
sslmode=request.form['username']
status=410,
success=0,
errormsg=gettext(
"Couldn't find the required parameter (%s)." % arg
)
)
try:
server = Server(
user_id=current_user.id,
servergroup_id=gid,
name=data[u'name'],
host=data[u'host'],
port=data[u'port'],
maintenance_db=data[u'db'],
username=data[u'username'],
ssl_mode=data['sslmode'],
comment=data['comment'] if 'comment' in data else None
)
db.session.add(server)
db.session.commit()
return jsonify(node=generate_browser_node(
'%s' % server.id,
'%s' % gid,
'%s' % server.name,
"icon-{0}-not-connected".format(ServerModule.NODE_TYPE),
True,
ServerModule.NODE_TYPE))
except Exception as e:
return make_json_response(
success=0,
errormsg=e.message
)
return make_json_response(success=1,
data={
'id': server.id,
'name': server.name,
'gid': gid
})
status=410,
success=0,
errormsg=e.message
)
def nodes(self, gid, sid):
"""Build a list of treeview nodes from the child nodes."""
@@ -275,23 +285,18 @@ class ServerNode(NodeView):
nodes.extend(module.get_nodes(server=sid))
return make_json_response(data=nodes)
def sql(self, gid, sid):
return make_json_response(data='')
def modified_sql(self, gid, sid):
return make_json_response(data='')
def statistics(self, gid, sid):
return make_json_response(data='')
def dependencies(self, gid, sid):
return make_json_response(data='')
def dependents(self, gid, sid):
return make_json_response(data='')

View File

@@ -1,94 +1,169 @@
// Add a server
function create_server(item) {
var alert = alertify.prompt(
'{{ _('Create a server') }}',
'{{ _('Enter a name for the new server') }}',
'',
function(evt, value) {
var d = tree.itemData(item);
if (d._type != 'server-group') {
define(
['jquery', 'underscore', 'pgadmin', 'pgadmin.browser', 'alertify'],
function($, _, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['server']) {
pgAdmin.Browser.Nodes['server'] = pgAdmin.Browser.Node.extend({
parent_type: 'server-group',
type: 'server',
label: '{{ _('Server...') }}',
Init: function() {
/* Avoid multiple registration of same menus */
if (this.initialized)
return;
this.initialized = true;
pgBrowser.add_menus([{
name: 'create_server_on_sg', node: 'server-group', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: '{{ _('Server...') }}',
data: {action: 'create'}, icon: 'wcTabIcon icon-server'
}, {
name: 'create_server', node: 'server', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 3, label: '{{ _('Server...') }}',
data: {action: 'create'}, icon: 'wcTabIcon icon-server'
}, {
name: 'edit_server', node: 'server', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'edit', priority: 4, label: '{{ _('Edit...') }}',
data: {action: 'edit'}, icon: 'fa fa-pencil-square-o'
},{
name: 'drop_server', node: 'server', module: this,
applies: ['object', 'context'], callback: 'delete_obj',
category: 'drop', priority: 3, label: '{{ _('Drop Server...') }}',
icon: 'fa fa-trash'
}]);
},
callbacks: {
// Add a server
create_server: function (item) {
var alert = alertify.prompt(
'{{ _('Create a server') }}',
'{{ _('Enter a name for the new server') }}',
'',
function(evt, value) {
var d = tree.itemData(item);
if (d._type != 'server-group') {
d = tree.itemData(tree.parent(item));
}
$.post(
"{{ url_for('browser.index') }}server/obj/" + d.refid + '/',
}
$.post(
"{{ url_for('browser.index') }}server/obj/" + d.refid + '/' + d.id + '/',
{ name: value }
)
.done(function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var item = {
id: data.data.id,
label: data.data.name,
inode: true,
open: false,
icon: 'icon-server'
}
tree.append(null, {
itemData: item
});
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var item = {
id: data.data.id,
label: data.data.name,
inode: true,
open: false,
icon: 'icon-server-not-connected'
}
}
)
tree.append(null, {
itemData: item
});
}
});
},
null
);
alert.show();
},
null
);
alert.show();
}
// Delete a server
function drop_server(item) {
alertify.confirm(
'{{ _('Drop server?') }}',
'{{ _('Are you sure you wish to drop the server "{0}"?') }}'.replace('{0}', tree.getLabel(item)),
function() {
var id = tree.getId(item).split('/').pop()
$.ajax({
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
type:'DELETE',
success: function(data) {
/* Connect the server (if not connected), before opening this node */
beforeopen: function(o) {
o.browser.tree.removeIcon(o.item);
if (o.data.connected) {
o.browser.tree.addIcon(o.item, {icon: 'icon-server-connected'});
} else {
o.browser.tree.addIcon(o.item, {icon: 'icon-server-not-connected'});
}
var data = o.data;
if(!data || data._type != 'server') {
return false;
}
if (!data.connected) {
alertify.confirm(
'{{ _('Connect to server') }}',
'{{ _('Do you want to connect the server?') }}',
function(evt) {
$.post(
"{{ url_for('browser.index') }}server/connect/" + data.refid + '/'
).done(function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var next = tree.next(item);
var prev = tree.prev(item);
tree.remove(item);
if (next.length) {
tree.select(next);
} else if (prev.length) {
tree.select(prev);
}
report_error(data.errormsg, data.info);
}
}
})
}).fail(function() {});
return true;
},
function(evt) {
return true;
}
);
return false;
}
return true;
}
},
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
id: undefined,
name: undefined,
sslmode: 'prefer'
},
null
)
}
schema: [{
id: 'id', label: 'ID', type: 'int', group: null,
mode: ['properties']
},{
id: 'name', label:'Name', type: 'text', group: null,
mode: ['properties', 'edit', 'create']
},{
id: 'connected', label:'Connected', type: 'text', group: null,
mode: ['properties']
},{
id: 'version', label:'Version', type: 'text', group: null,
mode: ['properties'], show: 'isConnected'
},{
id: 'comment', label:'Comments:', type: 'multiline', group: null,
mode: ['properties', 'edit', 'create'], disable: 'notEditMode'
},{
id: 'host', label:'Host Name/Address', type: 'text', group: "Connection",
mode: ['properties', 'edit', 'create']
},{
id: 'port', label:'Port', type: 'int', group: "Connection",
mode: ['properties', 'edit', 'create']
},{
id: 'db', label:'Maintenance Database', type: 'text', group: "Connection",
mode: ['properties', 'edit', 'create']
},{
id: 'username', label:'User Name', type: 'text', group: "Connection",
mode: ['properties', 'edit', 'create']
},{
id: 'sslmode', label:'SSL Mode', type: 'options', group: "Connection",
mode: ['properties', 'edit', 'create'],
'options': [{label:'Allow', value:'allow'}, {label: 'Prefer', value:'prefer'}, {label: 'Require', value: 'require'}, {label: 'Disable', value:'disable'}, {label:'Verify-CA', value: 'verify-ca'}, {label:'Verify-Full', value:'verify-full'}]
}],
validate: function(attrs, options) {
if (!this.isNew() && 'id' in this.changed) {
return '{{ _('Id can not be changed!') }}';
}
if (String(this.name).replace(/^\s+|\s+$/g, '') == '') {
return '{{ _('Name can be empty!') }}';
}
return null;
},
isConnected: function(mode) {
return mode == 'properties' && this.get('connected');
},
notEditMode: function(mode) {
return mode != 'edit';
}})
});
}
// Rename a server
function rename_server(item) {
alertify.prompt(
'{{ _('Rename server') }}',
'{{ _('Enter a new name for the server') }}',
tree.getLabel(item),
function(evt, value) {
var d = tree.itemData(item);
$.ajax({
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
type:'PUT',
params: {name: value},
success: function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
tree.setLabel(item, { label: value });
}
}
})
},
null
)
}
return pgBrowser.Nodes['server'];
});

View File

@@ -1,87 +1,152 @@
// Add a server group
function create_server_group() {
var alert = alertify.prompt(
'{{ _('Add a server group') }}',
'{{ _('Enter a name for the new server group') }}',
'',
function(evt, value) {
$.post("{{ url_for('browser.index') }}server-group/obj/", { name: value })
.done(function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var item = {
id: data.data.id,
label: data.data.name,
inode: true,
open: false,
icon: 'icon-server-group'
}
define(
['jquery', 'underscore', 'pgadmin', 'backbone', 'pgadmin.browser', 'pgadmin.browser.node'],
function($, _, pgAdmin, Backbone) {
tree.append(null, {
itemData: item
});
if (!pgAdmin.Browser.Nodes['server-group']) {
pgAdmin.Browser.Nodes['server-group'] = pgAdmin.Browser.Node.extend({
parent_type: null,
type: 'server-group',
label: '{{ _('Server Group') }}',
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
}
}
)
this.initialized = true;
pgAdmin.Browser.add_menus([{
name: 'create_server_group', node: 'server-group', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: '{{ _('Server Group...') }}',
data: {'action': 'create'}, icon: 'wcTabIcon icon-server-group'
},{
name: 'edit_server_group', node: 'server-group', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
priority: 3, label: '{{ _('Edit...') }}', data: {'action': 'edit'},
icon: 'fa fa-pencil-square-o'
}, {
name: 'drop_server_group', node: 'server-group', module: this,
applies: ['object', 'context'], callback: 'delete_obj',
priority: 2, label: '{{ _('Drop Server Group...') }}',
icon: 'fa fa-trash'
}]);
},
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
id: undefined,
name: undefined
},
null
);
alert.show();
}
schema: [
{id: 'id', label: 'ID', type: 'int', group: null, mode: ['properties']},
{id: 'name', label:'Name', type: 'text', group: null, mode: ['properties', 'edit', 'create']}
],
validate: function(attrs, options) {
if (!this.isNew() && 'id' in this.changed) {
return '{{ _('Id can not be changed!') }}';
}
if (String(this.name).replace(/^\s+|\s+$/g, '') == '') {
return '{{ _('Name can be empty!') }}';
}
return null;
}
}),
canDelete: function(i) {
var s = pgAdmin.Browser.tree.siblings(i, true);
// Delete a server group
function drop_server_group(item) {
alertify.confirm(
'{{ _('Delete server group?') }}',
'{{ _('Are you sure you wish to delete the server group "{0}"?') }}'.replace('{0}', tree.getLabel(item)),
function() {
var d = tree.itemData(item);
$.ajax({
/* This is the only server group - we can't remove it*/
if (!s || s.length == 0) {
return false;
}
return true;
},
callbacks: {
// Add a server group
create_server_group: function() {
var tree = pgAdmin.Browser.tree;
var alert = alertify.prompt(
'{{ _('Add a server group') }}',
'{{ _('Enter a name for the new server group') }}',
function(evt, value) {
$.post("{{ url_for('browser.index') }}server-group/obj/", { name: value })
.done(function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var item = {
id: data.data.id,
label: data.data.name,
inode: true,
open: false,
icon: 'icon-server-group'
}
tree.append(null, {
itemData: item
});
}
})
},
function() {}
);
alert.show();
},
// Delete a server group
drop_server_group: function (item) {
var tree = pgAdmin.Browser.tree;
alertify.confirm(
'{{ _('Delete server group?') }}',
'{{ _('Are you sure you wish to delete the server group "{0}"?') }}'.replace('{0}', tree.getLabel(item)),
function() {
var d = tree.itemData(item);
$.ajax({
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
type:'DELETE',
success: function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var next = tree.next(item);
var prev = tree.prev(item);
tree.remove(item);
if (next.length) {
tree.select(next);
} else if (prev.length) {
tree.select(prev);
}
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var next = tree.next(item);
var prev = tree.prev(item);
tree.remove(item);
if (next.length) {
tree.select(next);
} else if (prev.length) {
tree.select(prev);
}
}
}
})
});
},
function() {}
).show();
},
null
)
}
// Rename a server group
function rename_server_group(item) {
alertify.prompt(
'{{ _('Rename server group') }}',
'{{ _('Enter a new name for the server group') }}',
tree.getLabel(item),
function(evt, value) {
var d = tree.itemData(item);
$.ajax({
// Rename a server group
rename_server_group: function (item) {
var tree = pgAdmin.Browser.tree;
alertify.prompt(
'{{ _('Rename server group') }}',
'{{ _('Enter a new name for the server group') }}',
tree.getLabel(item),
function(evt, value) {
var d = tree.itemData(item);
$.ajax({
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
type:'PUT',
params: { name: value },
success: function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
tree.setLabel(item, { label: value });
}
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
tree.setLabel(item, { label: value });
}
}
})
},
null
)
}
})
},
null
).show();
}
}
});
}
return pgAdmin.Browser.Nodes['server-group'];
});