Fixed the warnings/errors reported by eslint for all the static

javascripts.
This commit is contained in:
Ashesh Vashi 2018-01-12 12:59:51 +05:30
parent b78b97d89b
commit c32eb6bd37
102 changed files with 25830 additions and 24548 deletions

View File

@ -1,13 +1,13 @@
define(
['jquery', 'alertify', 'sources/pgadmin', 'underscore.string', 'sources/gettext',
'sources/url_for'
'sources/url_for',
],
function($, alertify, pgAdmin, S, gettext, url_for) {
pgAdmin = pgAdmin || window.pgAdmin || {};
/* Return back, this has been called more than once */
if (pgAdmin.About)
return;
return;
pgAdmin.About = {
about_show: function() {
@ -20,14 +20,14 @@ define(
},
setup: function() {
return {
buttons:[{ text: gettext("OK"), key: 27, className: "btn btn-primary" }],
buttons:[{ text: gettext('OK'), key: 27, className: 'btn btn-primary' }],
options: {
modal: false,
resizable: true,
maximizable: true,
pinnable: false,
closableByDimmer: false
}
closableByDimmer: false,
},
};
},
build: function() {
@ -35,19 +35,18 @@ define(
},
prepare:function() {
this.setContent(this.message);
}
},
};
});
}
var content = '';
$.get(url_for('about.index'),
function(data) {
alertify.aboutDialog(
S(gettext("About %s")).sprintf(pgAdmin.Browser.utils.app_name).value(), data
S(gettext('About %s')).sprintf(pgAdmin.Browser.utils.app_name).value(), data
).resizeTo(800, 450);
});
}
},
};
return pgAdmin.About;

View File

@ -1,101 +1,102 @@
define('pgadmin.node.cast', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'pgadmin.alertifyjs', 'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
'pgadmin.alertifyjs', 'pgadmin.backform', 'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Backform) {
// Extend the collection class for cast
if (!pgBrowser.Nodes['coll-cast']) {
var casts = pgAdmin.Browser.Nodes['coll-cast'] =
pgAdmin.Browser.Collection.extend({
node: 'cast',
label: gettext('Casts'),
type: 'coll-cast',
columns: ['name', 'description']
});
};
if (!pgBrowser.Nodes['coll-cast']) {
pgAdmin.Browser.Nodes['coll-cast'] =
pgAdmin.Browser.Collection.extend({
node: 'cast',
label: gettext('Casts'),
type: 'coll-cast',
columns: ['name', 'description'],
});
}
// Extend the node class for cast
if (!pgBrowser.Nodes['cast']) {
pgAdmin.Browser.Nodes['cast'] = pgAdmin.Browser.Node.extend({
parent_type: 'database',
type: 'cast',
sqlAlterHelp: 'sql-altercast.html',
sqlCreateHelp: 'sql-createcast.html',
dialogHelp: url_for('help.static', {'filename': 'cast_dialog.html'}),
canDrop: true,
canDropCascade: true,
label: gettext('Cast'),
hasSQL: true,
hasDepends: true,
Init: function() {
if (!pgBrowser.Nodes['cast']) {
pgAdmin.Browser.Nodes['cast'] = pgAdmin.Browser.Node.extend({
parent_type: 'database',
type: 'cast',
sqlAlterHelp: 'sql-altercast.html',
sqlCreateHelp: 'sql-createcast.html',
dialogHelp: url_for('help.static', {'filename': 'cast_dialog.html'}),
canDrop: true,
canDropCascade: true,
label: gettext('Cast'),
hasSQL: true,
hasDepends: true,
Init: function() {
// Avoid multiple registration of menus
if (this.initialized)
return;
if (this.initialized)
return;
this.initialized = true;
this.initialized = true;
// Add context menus for cast
pgBrowser.add_menus([{
name: 'create_cast_on_database', node: 'database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Cast...'),
icon: 'wcTabIcon icon-cast', data: {action: 'create'},
enable: pgBrowser.Nodes['database'].is_conn_allow
},{
name: 'create_cast_on_coll', node: 'coll-cast', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Cast...'),
icon: 'wcTabIcon icon-cast', data: {action: 'create'}
},{
name: 'create_cast', node: 'cast', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Cast...'),
icon: 'wcTabIcon icon-cast', data: {action: 'create'}
}]);
pgBrowser.add_menus([{
name: 'create_cast_on_database', node: 'database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Cast...'),
icon: 'wcTabIcon icon-cast', data: {action: 'create'},
enable: pgBrowser.Nodes['database'].is_conn_allow,
},{
name: 'create_cast_on_coll', node: 'coll-cast', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Cast...'),
icon: 'wcTabIcon icon-cast', data: {action: 'create'},
},{
name: 'create_cast', node: 'cast', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Cast...'),
icon: 'wcTabIcon icon-cast', data: {action: 'create'},
}]);
},
},
// Define the backform model for cast node
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
name: undefined, // Name of the cast
encoding: 'UTF8',
srctyp: undefined, // Source type
trgtyp: undefined, // Target type
proname: undefined, // Function
castcontext: undefined, // Context (IMPLICIT/EXPLICIT/ASSIGNMENT)
syscast: undefined, // Is this cast is system object? Yes/No
description: undefined // Comment on the cast
},
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
name: undefined, // Name of the cast
encoding: 'UTF8',
srctyp: undefined, // Source type
trgtyp: undefined, // Target type
proname: undefined, // Function
castcontext: undefined, // Context (IMPLICIT/EXPLICIT/ASSIGNMENT)
syscast: undefined, // Is this cast is system object? Yes/No
description: undefined, // Comment on the cast
},
// Define the schema for cast
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
editable: false, type: 'text', disabled: true, cellHeaderClasses: 'width_percent_50'
},{
id: 'oid', label: gettext('OID'), cell: 'string',
editable: false, type: 'text', disabled: true, mode: ['properties'],
},{
id: 'srctyp', label: gettext('Source type'), url: 'get_type',
type: 'text', group: gettext('Definition'), disabled: function(m) {
return !m.isNew()
}, mode: ['create'],
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
editable: false, type: 'text', disabled: true, cellHeaderClasses: 'width_percent_50',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
editable: false, type: 'text', disabled: true, mode: ['properties'],
},{
id: 'srctyp', label: gettext('Source type'), url: 'get_type',
type: 'text', group: gettext('Definition'), disabled: function(m) {
return !m.isNew();
}, mode: ['create'],
transform: function(rows) {
_.each(rows, function(r) {
r['image'] = 'icon-cast';
});
return rows;
},
transform: function(rows) {
_.each(rows, function(r) {
r['image'] = 'icon-cast';
});
return rows;
},
/*
* Control is extended to create cast name from source type and destination type
* once their values are changed
*/
control: Backform.NodeAjaxOptionsControl.extend({
control: Backform.NodeAjaxOptionsControl.extend({
onChange: function() {
Backform.NodeAjaxOptionsControl.prototype.onChange.apply(
onChange: function() {
Backform.NodeAjaxOptionsControl.prototype.onChange.apply(
this, arguments
);
@ -104,44 +105,44 @@ define('pgadmin.node.cast', [
* target type are set, if yes then fetch values from both
* controls and generate cast name
*/
var srctype = this.model.get('srctyp');
var trgtype = this.model.get('trgtyp');
if(srctype != undefined && srctype != '' &&
var srctype = this.model.get('srctyp');
var trgtype = this.model.get('trgtyp');
if(srctype != undefined && srctype != '' &&
trgtype != undefined && trgtype != '')
this.model.set("name", srctype+"->"+trgtype);
else
this.model.unset("name");
}
})
},
this.model.set('name', srctype+'->'+trgtype);
else
this.model.unset('name');
},
}),
},
/*
* Text control for viewing source type in properties and
* edit mode only
*/
{
id: 'srctyp', label: gettext('Source type'), type: 'text',
group: gettext('Definition'), disabled: true, mode:['properties','edit']
},{
id: 'trgtyp', label: gettext('Target type'), url: 'get_type',
type: 'text', group: gettext('Definition'), disabled: function(m) {
return !m.isNew()
}, mode: ['create'],
transform: function(rows) {
_.each(rows, function(r) {
r['image'] = 'icon-cast';
});
return rows;
},
{
id: 'srctyp', label: gettext('Source type'), type: 'text',
group: gettext('Definition'), disabled: true, mode:['properties','edit'],
},{
id: 'trgtyp', label: gettext('Target type'), url: 'get_type',
type: 'text', group: gettext('Definition'), disabled: function(m) {
return !m.isNew();
}, mode: ['create'],
transform: function(rows) {
_.each(rows, function(r) {
r['image'] = 'icon-cast';
});
return rows;
},
/*
* Control is extended to create cast name from source type and destination type
* once their values are changed
*/
control: Backform.NodeAjaxOptionsControl.extend({
control: Backform.NodeAjaxOptionsControl.extend({
onChange: function() {
Backform.NodeAjaxOptionsControl.prototype.onChange.apply(
onChange: function() {
Backform.NodeAjaxOptionsControl.prototype.onChange.apply(
this, arguments
);
@ -150,76 +151,78 @@ define('pgadmin.node.cast', [
* target type are set, if yes then fetch values from both
* controls and generate cast name
*/
var srcType = this.model.get('srctyp');
var trgtype = this.model.get('trgtyp');
if(srcType != undefined && srcType != '' &&
var srcType = this.model.get('srctyp');
var trgtype = this.model.get('trgtyp');
if(srcType != undefined && srcType != '' &&
trgtype != undefined && trgtype != '')
this.model.set("name", srcType+"->"+trgtype);
else
this.model.unset("name");
}
})
},
this.model.set('name', srcType+'->'+trgtype);
else
this.model.unset('name');
},
}),
},
/*
* Text control for viewing target type in properties and
* edit mode only
*/
{
id: 'trgtyp', label: gettext('Target type'), type: 'text',
group: gettext('Definition'), disabled: true, mode:['properties','edit']
},
{
id: 'trgtyp', label: gettext('Target type'), type: 'text',
group: gettext('Definition'), disabled: true, mode:['properties','edit'],
},
/*
* Proname field is dependent on source type and target type.
* On source and target type changed event,
* associated functions will be fetch using ajax call
*/
{
id: 'proname', label: gettext('Function'), deps:['srctyp', 'trgtyp'],
type: 'text', disabled: function(m) { return !m.isNew(); },
group: gettext('Definition'), mode: ['create'],
control: 'node-ajax-options',
options: function(control) {
var srcTyp = control.model.get('srctyp');
var trgtyp = control.model.get('trgtyp');
var res = [];
{
id: 'proname', label: gettext('Function'), deps:['srctyp', 'trgtyp'],
type: 'text', disabled: function(m) { return !m.isNew(); },
group: gettext('Definition'), mode: ['create'],
control: 'node-ajax-options',
options: function(control) {
var srcTyp = control.model.get('srctyp');
var trgtyp = control.model.get('trgtyp');
var res = [];
if(srcTyp != undefined && srcTyp != '' &&
if(srcTyp != undefined && srcTyp != '' &&
trgtyp != undefined && trgtyp != '')
{
var node = control.field.get('schema_node'),
_url = node.generate_url.apply(
var node = control.field.get('schema_node'),
_url = node.generate_url.apply(
node, [
null, 'get_functions', control.field.get('node_data'), false,
control.field.get('node_info')
control.field.get('node_info'),
]);
$.ajax({
type: 'POST',
timeout: 30000,
url: _url,
cache: false,
async: false,
data: {"srctyp" : srcTyp, "trgtyp" : trgtyp},
$.ajax({
type: 'POST',
timeout: 30000,
url: _url,
cache: false,
async: false,
data: {'srctyp' : srcTyp, 'trgtyp' : trgtyp},
// On success return function list from server
success: function(result) {
res = result.data;
return res;
},
success: function(result) {
res = result.data;
return res;
},
// On failure show error appropriate error message to user
error: function(xhr, status, error) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
}
} catch (e) {}
}
});
}
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
}
} catch (e) {
// Do nothing
}
},
});
}
return res;
}
},
},
/*
* Text type control for viewing function name in properties and
@ -227,7 +230,7 @@ define('pgadmin.node.cast', [
*/
{
id: 'proname', label: gettext('Function'), type: 'text',
group: gettext('Definition'), disabled: true, mode:['properties','edit']
group: gettext('Definition'), disabled: true, mode:['properties','edit'],
},{
id: 'castcontext', label: gettext('Context'),
options:{'onText':'IMPLICIT','offText':'EXPLICIT'},
@ -236,8 +239,8 @@ define('pgadmin.node.cast', [
control: Backform.SwitchControl.extend({
getValueFromDOM: function() {
return this.$input.prop('checked') ? 'IMPLICIT' : 'EXPLICIT';
}
})
},
}),
},
/*
* Text control for viewing context in properties and
@ -246,25 +249,25 @@ define('pgadmin.node.cast', [
{
id: 'castcontext', label: gettext('Context'), disabled: true,
options:[{
label: 'IMPLICIT', value: 'IMPLICIT'
label: 'IMPLICIT', value: 'IMPLICIT',
},{
label: 'EXPLICIT', value: 'EXPLICIT'
label: 'EXPLICIT', value: 'EXPLICIT',
},{
label: 'ASSIGNMENT', value: 'ASSIGNMENT'
label: 'ASSIGNMENT', value: 'ASSIGNMENT',
}], editable: false, type: 'select2', group: gettext('Definition'),
mode:['properties', 'edit']
mode:['properties', 'edit'],
},{
id: 'syscast', label: gettext('System cast?'),
cell: 'switch', type: 'switch', mode: ['properties'], disabled: true,
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},{
id: 'description', label: gettext('Comment'),type: 'text',
type: 'multiline', cellHeaderClasses: 'width_percent_50'
}
id: 'description', label: gettext('Comment'),
type: 'multiline', cellHeaderClasses: 'width_percent_50',
},
],
/*
@ -272,38 +275,41 @@ define('pgadmin.node.cast', [
* target type if any one of them is not selected while creating
* new cast
*/
validate: function(keys){
validate: function() {
var srctype = this.get('srctyp');
var trgtype = this.get('trgtyp');
var srctype = this.get('srctyp'),
trgtype = this.get('trgtyp'),
msg;
// validate source type control
if (_.isUndefined(srctype) || _.isNull(srctype) || String(srctype).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Source type must be selected.');
if (
_.isUndefined(srctype) || _.isNull(srctype) ||
String(srctype).replace(/^\s+|\s+$/g, '') == ''
) {
msg = gettext('Source type must be selected.');
this.errorModel.set('srctyp', msg);
return msg;
}
else
{
} else {
this.errorModel.unset('srctyp');
}
// validate target type control
if (_.isUndefined(trgtype) || _.isNull(trgtype) || String(trgtype).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Target type must be selected.');
if (
_.isUndefined(trgtype) || _.isNull(trgtype) ||
String(trgtype).replace(/^\s+|\s+$/g, '') == ''
) {
msg = gettext('Target type must be selected.');
this.errorModel.set('trgtyp', msg);
return msg;
}
else
{
} else {
this.errorModel.unset('trgtyp');
}
this.trigger('on-status-clear');
return null;
}
})
});
},
}),
});
}
return pgBrowser.Nodes['coll-cast'];
return pgBrowser.Nodes['coll-cast'];
});

View File

@ -1,19 +1,19 @@
define('pgadmin.node.event_trigger', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
'pgadmin.backform', 'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
// Extend the browser's collection class for event trigger collection
if (!pgBrowser.Nodes['coll-event_trigger']) {
var databases = pgAdmin.Browser.Nodes['coll-event_trigger'] =
pgAdmin.Browser.Nodes['coll-event_trigger'] =
pgAdmin.Browser.Collection.extend({
node: 'event_trigger',
label: gettext('Event Trigger'),
type: 'coll-event_trigger',
columns: ['name', 'eventowner', 'comment']
columns: ['name', 'eventowner', 'comment'],
});
};
}
// Extend the browser's node class for event triggers node
if (!pgBrowser.Nodes['event_trigger']) {
@ -30,7 +30,7 @@ define('pgadmin.node.event_trigger', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -38,19 +38,19 @@ define('pgadmin.node.event_trigger', [
name: 'create_event_trigger_on_coll', node: 'coll-event_trigger', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Event Trigger...'),
icon: 'wcTabIcon icon-event_trigger', data: {action: 'create'}
icon: 'wcTabIcon icon-event_trigger', data: {action: 'create'},
},{
name: 'create_event_trigger', node: 'event_trigger', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Event Trigger...'),
icon: 'wcTabIcon icon-event_trigger', data: {action: 'create'}
icon: 'wcTabIcon icon-event_trigger', data: {action: 'create'},
},{
name: 'create_event_trigger', node: 'database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Event Trigger...'),
icon: 'wcTabIcon icon-event_trigger', data: {action: 'create'},
enable: pgBrowser.Nodes['database'].is_conn_allow
}
enable: pgBrowser.Nodes['database'].is_conn_allow,
},
]);
},
// Define the model for event trigger node
@ -60,14 +60,14 @@ define('pgadmin.node.event_trigger', [
name: undefined,
eventowner: undefined,
comment: undefined,
enabled: "O",
enabled: 'O',
eventfuncoid: undefined,
eventfunname: undefined,
eventname: "DDL_COMMAND_START",
eventname: 'DDL_COMMAND_START',
when: undefined,
xmin: undefined,
source: undefined,
language: undefined
language: undefined,
},
// Default values!
@ -85,46 +85,46 @@ define('pgadmin.node.event_trigger', [
// Define the schema for the event trigger node
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text'
type: 'text',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', mode: ['properties']
type: 'text', mode: ['properties'],
},{
id: 'eventowner', label: gettext('Owner'), cell: 'string',
type: 'text', mode: ['properties', 'edit','create'], node: 'role',
control: Backform.NodeListByNameControl
control: Backform.NodeListByNameControl,
},{
id: 'comment', label: gettext('Comment'), type: 'multiline'
id: 'comment', label: gettext('Comment'), type: 'multiline',
},{
id: 'enabled', label: gettext('Enabled status'),
type:"radio", group: gettext("Definition"), mode: ['properties', 'edit','create'],
type:'radio', group: gettext('Definition'), mode: ['properties', 'edit','create'],
options: [
{label: "Enable", value: "O"},
{label: "Disable", value: "D"},
{label: "Replica", value: "R"},
{label: "Always", value: "A"}
]
{label: 'Enable', value: 'O'},
{label: 'Disable', value: 'D'},
{label: 'Replica', value: 'R'},
{label: 'Always', value: 'A'},
],
},{
id: 'eventfunname', label: gettext('Trigger function'),
type: 'text', control: 'node-ajax-options', group: gettext("Definition"),
url:'fopts', cache_node: 'trigger_function'
type: 'text', control: 'node-ajax-options', group: gettext('Definition'),
url:'fopts', cache_node: 'trigger_function',
},{
id: 'eventname', label: gettext('Events'),
type:"radio", group: gettext("Definition"), cell: 'string',
type:'radio', group: gettext('Definition'), cell: 'string',
options: [
{label: "DDL COMMAND START", value: "DDL_COMMAND_START"},
{label: "DDL COMMAND END", value: "DDL_COMMAND_END"},
{label: "SQL DROP", value: "SQL_DROP"}
]
{label: 'DDL COMMAND START', value: 'DDL_COMMAND_START'},
{label: 'DDL COMMAND END', value: 'DDL_COMMAND_END'},
{label: 'SQL DROP', value: 'SQL_DROP'},
],
},{
id: 'when', label: gettext('When'), type: 'multiline', group: gettext("Definition"),
id: 'when', label: gettext('When'), type: 'multiline', group: gettext('Definition'),
},{
id: 'seclabels', label: gettext('Security Labels'),
model: pgBrowser.SecLabelModel, editable: false, type: 'collection',
group: gettext('Security'), mode: ['edit', 'create'],
min_version: 90200, canAdd: true,
canEdit: false, canDelete: true, control: 'unique-col-collection'
}
canEdit: false, canDelete: true, control: 'unique-col-collection',
},
],
// event trigger model data validation.
validate: function() {
@ -166,9 +166,9 @@ define('pgadmin.node.event_trigger', [
}
return null;
}
})
});
},
}),
});
}

View File

@ -1,8 +1,8 @@
define('pgadmin.node.extension', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser) {
'pgadmin.backform', 'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
/*
* Create and Add an Extension Collection into nodes
@ -12,14 +12,14 @@ define('pgadmin.node.extension', [
* columns - List of columns to show under under properties.
*/
if (!pgBrowser.Nodes['coll-extension']) {
var extensions = pgAdmin.Browser.Nodes['coll-extension'] =
pgAdmin.Browser.Nodes['coll-extension'] =
pgAdmin.Browser.Collection.extend({
node: 'extension',
label: gettext('Extension'),
type: 'coll-extension',
columns: ['name', 'owner', 'comment']
columns: ['name', 'owner', 'comment'],
});
};
}
/*
* Create and Add an Extension Node into nodes
@ -63,19 +63,19 @@ define('pgadmin.node.extension', [
name: 'create_extension_on_coll', node: 'coll-extension', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Extension...'),
icon: 'wcTabIcon icon-extension', data: {action: 'create'}
icon: 'wcTabIcon icon-extension', data: {action: 'create'},
},{
name: 'create_extension', node: 'extension', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Extension...'),
icon: 'wcTabIcon icon-extension', data: {action: 'create'}
icon: 'wcTabIcon icon-extension', data: {action: 'create'},
},{
name: 'create_extension', node: 'database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Extension...'),
icon: 'wcTabIcon icon-extension', data: {action: 'create'},
enable: pgBrowser.Nodes['database'].is_conn_allow
}
enable: pgBrowser.Nodes['database'].is_conn_allow,
},
]);
},
@ -93,8 +93,8 @@ define('pgadmin.node.extension', [
},
transform: function(data, cell) {
var res = [],
control = cell || this,
label = control.model.get('name');
control = cell || this,
label = control.model.get('name');
if (!control.model.isNew()) {
res.push({label: label, value: label});
@ -112,7 +112,7 @@ define('pgadmin.node.extension', [
* convert Array Object as [Object] string
*/
res.push({label: d.name, value: JSON.stringify(d)});
})
});
}
}
return res;
@ -128,7 +128,7 @@ define('pgadmin.node.extension', [
control: Backform.NodeAjaxOptionsControl.extend({
getValueFromDOM: function() {
var data = this.formatter.toRaw(
_.unescape(this.$el.find("select").val()), this.model);
_.unescape(this.$el.find('select').val()), this.model);
/*
* return null if data is empty to prevent it from
* throwing parsing error. Adds check as name can be empty
@ -147,35 +147,37 @@ define('pgadmin.node.extension', [
* set attributes values into the model
*/
onChange: function() {
Backform.NodeAjaxOptionsControl.prototype.onChange.apply(this, arguments);
var selectedValue = this.$el.find("select").val();
if (selectedValue.trim() != "") {
Backform.NodeAjaxOptionsControl.prototype.onChange.apply(
this, arguments
);
var selectedValue = this.$el.find('select').val();
if (selectedValue.trim() != '') {
var d = this.formatter.toRaw(selectedValue, this.model);
if(typeof(d) === 'string')
d=JSON.parse(d);
var changes = {
this.model.set({
'version' : '',
'relocatable': (
(!_.isNull(d.relocatable[0]) && !_.isUndefined(d.relocatable[0])) ?
d.relocatable[0]: '')
};
this.model.set(changes);
}
else {
var changes = {'version': '', 'relocatable': true, 'schema': ''};
this.model.set(changes);
(!_.isNull(d.relocatable[0]) &&
!_.isUndefined(d.relocatable[0])) ? d.relocatable[0]: ''
),
});
} else {
this.model.set({
'version': '', 'relocatable': true, 'schema': '',
});
}
},
})
}),
},
{
id: 'eid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},
{
id: 'owner', label: gettext('Owner'), control: 'node-list-by-name',
mode: ['properties'], node: 'role', cell: 'string',
cache_level: 'server'
cache_level: 'server',
},
{
id: 'schema', label: gettext('Schema'), type: 'text',
@ -188,7 +190,7 @@ define('pgadmin.node.extension', [
* attribute is True or False
*/
return (m.has('relocatable') ? !m.get('relocatable') : false);
}
},
},
{
id: 'relocatable', label: gettext('Relocatable?'), cell: 'switch',
@ -196,8 +198,8 @@ define('pgadmin.node.extension', [
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},
{
id: 'version', label: gettext('Version'), cell: 'string',
@ -207,8 +209,8 @@ define('pgadmin.node.extension', [
// Transform the data into version for the selected extension.
transform: function(data, cell) {
var res = [],
control = cell || this,
extension = control.model.get('name');
control = cell || this,
extension = control.model.get('name');
_.each(data, function(dt) {
if(dt.name == extension) {
@ -220,12 +222,12 @@ define('pgadmin.node.extension', [
}
});
return res;
}
},
},
{
id: 'comment', label: gettext('Comment'), cell: 'string',
type: 'multiline', disabled: true
}
type: 'multiline', disabled: true,
},
],
validate: function() {
@ -247,10 +249,10 @@ define('pgadmin.node.extension', [
this.errorModel.unset('name');
}
return null;
}
})
})
};
},
}),
});
}
return pgBrowser.Nodes['coll-extension'];
});

View File

@ -1,52 +1,52 @@
define('pgadmin.node.foreign_server', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
'pgadmin.browser', 'pgadmin.backform', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege',
], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform) {
// Extend the browser's node model class to create a Options model
var OptionsModel = pgAdmin.Browser.Node.Model.extend({
idAttribute: 'fsrvoption',
defaults: {
fsrvoption: undefined,
fsrvvalue: undefined
},
idAttribute: 'fsrvoption',
defaults: {
fsrvoption: undefined,
fsrvvalue: undefined,
},
// Defining schema for the Options model
schema: [
schema: [
{id: 'fsrvoption', label: gettext('Options'), type:'text', cellHeaderClasses:'width_percent_50', group: null, editable: true},
{id: 'fsrvvalue', label: gettext('Value'), type: 'text', cellHeaderClasses:'width_percent_50', group:null, editable: true},
],
],
/* validate function is used to validate the input given by
* the user. In case of error, message will be displayed on
* the browser for the respective control.
*/
validate: function() {
validate: function() {
// Validation for the option name
if (_.isUndefined(this.get('fsrvoption')) ||
if (_.isUndefined(this.get('fsrvoption')) ||
_.isNull(this.get('fsrvoption')) ||
String(this.get('fsrvoption')).replace(/^\s+|\s+$/g, '') == '') {
var msg = 'Please enter an option name';
this.errorModel.set('fsrvoption', msg);
return msg;
} else {
this.errorModel.unset('fsrvoption');
}
return null;
}
});
var msg = 'Please enter an option name';
this.errorModel.set('fsrvoption', msg);
return msg;
} else {
this.errorModel.unset('fsrvoption');
}
return null;
},
});
// Extend the browser's collection class for foreign server collection
if (!pgBrowser.Nodes['coll-foreign_server']) {
var foreign_data_wrappers = pgAdmin.Browser.Nodes['coll-foreign_server'] =
pgAdmin.Browser.Nodes['coll-foreign_server'] =
pgAdmin.Browser.Collection.extend({
node: 'foreign_server',
label: gettext('Foreign Servers'),
type: 'coll-foreign_server',
columns: ['name','fsrvowner','description']
columns: ['name','fsrvowner','description'],
});
};
}
// Extend the browser's node class for foreign server node
if (!pgBrowser.Nodes['foreign_server']) {
@ -64,7 +64,7 @@ define('pgadmin.node.foreign_server', [
// Avoid multiple registration of menus
if (this.initialized)
return;
return;
this.initialized = true;
@ -75,18 +75,18 @@ define('pgadmin.node.foreign_server', [
name: 'create_foreign_server_on_coll', node: 'coll-foreign_server', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Server...'),
icon: 'wcTabIcon icon-foreign_server', data: {action: 'create'}
icon: 'wcTabIcon icon-foreign_server', data: {action: 'create'},
},{
name: 'create_foreign_server', node: 'foreign_server', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Server...'),
icon: 'wcTabIcon icon-foreign_server', data: {action: 'create'}
icon: 'wcTabIcon icon-foreign_server', data: {action: 'create'},
},{
name: 'create_foreign_server', node: 'foreign_data_wrapper', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Server...'),
icon: 'wcTabIcon icon-foreign_server', data: {action: 'create'}
}
icon: 'wcTabIcon icon-foreign_server', data: {action: 'create'},
},
]);
},
@ -100,7 +100,7 @@ define('pgadmin.node.foreign_server', [
fsrvoptions: [],
fsrvowner: undefined,
description: undefined,
fsrvacl: []
fsrvacl: [],
},
// Default values!
@ -118,44 +118,42 @@ define('pgadmin.node.foreign_server', [
// Defining schema for the foreign server node
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: function(m) {
if (this.mode == 'edit' && this.node_info.server.version < 90200) {
return true;
}
else
return false;
}
type: 'text', disabled: function() {
return (
this.mode == 'edit' && this.node_info.server.version < 90200
);
},
},{
id: 'fsrvid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},{
id: 'fsrvowner', label: gettext('Owner'), type: 'text',
control: Backform.NodeListByNameControl, node: 'role',
mode: ['edit', 'create', 'properties'], select2: { allowClear: false }
mode: ['edit', 'create', 'properties'], select2: { allowClear: false },
},{
id: 'fsrvtype', label: gettext('Type'), cell: 'string',
group: gettext('Definition'), type: 'text', mode: ['edit','create','properties'], disabled: function(m) {
return !m.isNew();
}
},
},{
id: 'fsrvversion', label: gettext('Version'), cell: 'string',
group: gettext('Definition'), type: 'text'
group: gettext('Definition'), type: 'text',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'fsrvoptions', label: gettext('Options'), type: 'collection', group: gettext("Options"),
id: 'fsrvoptions', label: gettext('Options'), type: 'collection', group: gettext('Options'),
model: OptionsModel, control: 'unique-col-collection', mode: ['edit', 'create'],
canAdd: true, canDelete: true, uniqueCol : ['fsrvoption'],
columns: ['fsrvoption','fsrvvalue']
}, pgBrowser.SecurityGroupSchema, {
id: 'fsrvacl', label: gettext('Privileges'), type: 'collection', group: 'security',
model: pgAdmin.Browser.Node.PrivilegeRoleModel.extend({privileges: ['U']}), control: 'unique-col-collection',
mode: ['edit', 'create'], canAdd: true, canDelete: true, uniqueCol : ['grantee']
},{
columns: ['fsrvoption','fsrvvalue'],
}, pgBrowser.SecurityGroupSchema, {
id: 'fsrvacl', label: gettext('Privileges'), type: 'collection', group: 'security',
model: pgAdmin.Browser.Node.PrivilegeRoleModel.extend({privileges: ['U']}), control: 'unique-col-collection',
mode: ['edit', 'create'], canAdd: true, canDelete: true, uniqueCol : ['grantee'],
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
}
group: gettext('Security'), mode: ['properties'], disabled: true,
},
],
/* validate function is used to validate the input given by
@ -174,9 +172,9 @@ define('pgadmin.node.foreign_server', [
this.errorModel.unset('name');
}
return null;
}
})
});
},
}),
});
}

View File

@ -1,54 +1,55 @@
define('pgadmin.node.user_mapping', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
'pgadmin.backform', 'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
// Extend the browser's node model class to create a Options model
var OptionsModel = pgAdmin.Browser.Node.Model.extend({
idAttribute: 'umoption',
defaults: {
umoption: undefined,
umvalue: undefined
},
var OptionsModel = pgAdmin.Browser.Node.Model.extend({
idAttribute: 'umoption',
defaults: {
umoption: undefined,
umvalue: undefined,
},
// Defining schema for the Options model
schema: [{
id: 'umoption', label: gettext('Options'), type:'text',
cellHeaderClasses:'width_percent_50', group: null, editable: true
}, {
id: 'umvalue', label: gettext('Value'), type: 'text',
cellHeaderClasses:'width_percent_50', group:null, editable: true
}],
schema: [{
id: 'umoption', label: gettext('Options'), type:'text',
cellHeaderClasses:'width_percent_50', group: null, editable: true,
}, {
id: 'umvalue', label: gettext('Value'), type: 'text',
cellHeaderClasses:'width_percent_50', group:null, editable: true,
}],
/* validate function is used to validate the input given by
* the user. In case of error, message will be displayed on
* the browser for the respective control.
*/
validate: function() {
validate: function() {
// Validation for the option value
if (_.isUndefined(this.get('umoption')) ||
if (_.isUndefined(this.get('umoption')) ||
_.isNull(this.get('umoption')) ||
String(this.get('umoption')).replace(/^\s+|\s+$/g, '') == '') {
var msg = 'Please enter an option name';
this.errorModel.set('umoption', msg);
return msg;
} else {
this.errorModel.unset('umoption');
}
return null;
}
});
var msg = 'Please enter an option name';
this.errorModel.set('umoption', msg);
return msg;
} else {
this.errorModel.unset('umoption');
}
return null;
},
});
// Extend the browser's collection class for user mapping collection
if (!pgBrowser.Nodes['coll-user_mapping']) {
var foreign_data_wrappers = pgAdmin.Browser.Nodes['coll-user_mapping'] =
pgAdmin.Browser.Nodes['coll-user_mapping'] =
pgAdmin.Browser.Collection.extend({
node: 'user_mapping',
label: gettext('User Mappings'),
type: 'coll-user_mapping',
columns: ['name']
columns: ['name'],
});
};
}
// Extend the browser's node class for user mapping node
if (!pgBrowser.Nodes['user_mapping']) {
@ -67,7 +68,7 @@ define('pgadmin.node.user_mapping', [
// Avoid multiple registration of menus
if (this.initialized)
return;
return;
this.initialized = true;
@ -78,18 +79,18 @@ define('pgadmin.node.user_mapping', [
name: 'create_user_mapping_on_coll', node: 'coll-user_mapping', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('User Mapping...'),
icon: 'wcTabIcon icon-user_mapping', data: {action: 'create'}
icon: 'wcTabIcon icon-user_mapping', data: {action: 'create'},
},{
name: 'create_user_mapping', node: 'user_mapping', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('User Mapping...'),
icon: 'wcTabIcon icon-user_mapping', data: {action: 'create'}
icon: 'wcTabIcon icon-user_mapping', data: {action: 'create'},
},{
name: 'create_user_mapping', node: 'foreign_server', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('User Mapping...'),
icon: 'wcTabIcon icon-user_mapping', data: {action: 'create'}
}
icon: 'wcTabIcon icon-user_mapping', data: {action: 'create'},
},
]);
},
@ -97,7 +98,7 @@ define('pgadmin.node.user_mapping', [
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
name: undefined,
um_options: []
um_options: [],
},
// Default values!
@ -118,25 +119,29 @@ define('pgadmin.node.user_mapping', [
control: Backform.NodeListByNameControl, node: 'role',
mode: ['edit', 'create', 'properties'], select2: { allowClear: false },
disabled: function(m) { return !m.isNew(); },
transform: function(data) {
transform: function() {
var self = this,
node = self.field.get('schema_node');
var res =
Backform.NodeListByNameControl.prototype.defaults.transform.apply(
this, arguments
);
res.unshift({label: 'CURRENT_USER', value: 'CURRENT_USER', image: 'icon-' + node.type},
{label: 'PUBLIC', value: 'PUBLIC', image: 'icon-' + node.type});
res.unshift({
label: 'CURRENT_USER', value: 'CURRENT_USER',
image: 'icon-' + node.type,
},{
label: 'PUBLIC', value: 'PUBLIC', image: 'icon-' + node.type,
});
return res;
}
},
},{
id: 'um_oid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties'],
},{
id: 'umoptions', label: gettext('Options'), type: 'collection', group: gettext("Options"),
id: 'umoptions', label: gettext('Options'), type: 'collection', group: gettext('Options'),
model: OptionsModel, control: 'unique-col-collection', mode: ['create', 'edit'],
canAdd: true, canDelete: true, uniqueCol : ['umoption']
}
canAdd: true, canDelete: true, uniqueCol : ['umoption'],
},
],
/* validate function is used to validate the input given by
@ -155,9 +160,9 @@ define('pgadmin.node.user_mapping', [
this.errorModel.unset('name');
}
return null;
}
})
});
},
}),
});
}

View File

@ -1,53 +1,53 @@
define('pgadmin.node.foreign_data_wrapper', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
// Extend the browser's node model class to create a Options model
var OptionsModel = pgBrowser.Node.Model.extend({
idAttribute: 'fdwoption',
defaults: {
fdwoption: undefined,
fdwvalue: undefined
},
var OptionsModel = pgBrowser.Node.Model.extend({
idAttribute: 'fdwoption',
defaults: {
fdwoption: undefined,
fdwvalue: undefined,
},
// Defining schema for the Options model
schema: [{
id: 'fdwoption', label: gettext('Option'), type:'text',
cellHeaderClasses:'width_percent_50', editable: true
},{
id: 'fdwvalue', label: gettext('Value'), type: 'text',
cellHeaderClasses:'width_percent_50', group:null, editable: true
}],
schema: [{
id: 'fdwoption', label: gettext('Option'), type:'text',
cellHeaderClasses:'width_percent_50', editable: true,
},{
id: 'fdwvalue', label: gettext('Value'), type: 'text',
cellHeaderClasses:'width_percent_50', group:null, editable: true,
}],
/* validate function is used to validate the input given by
* the user. In case of error, message will be displayed on
* the browser for the respective control.
*/
validate: function() {
validate: function() {
// Validation for the option name
if (_.isUndefined(this.get('fdwoption')) ||
if (_.isUndefined(this.get('fdwoption')) ||
_.isNull(this.get('fdwoption')) ||
String(this.get('fdwoption')).replace(/^\s+|\s+$/g, '') == '') {
var msg = 'Please enter an option name';
this.errorModel.set('fdwoption', msg);
return msg;
} else {
this.errorModel.unset('fdwoption');
}
return null;
}
});
var msg = 'Please enter an option name';
this.errorModel.set('fdwoption', msg);
return msg;
} else {
this.errorModel.unset('fdwoption');
}
return null;
},
});
// Extend the browser's collection class for foreign data wrapper collection
if (!pgBrowser.Nodes['coll-foreign_data_wrapper']) {
var foreign_data_wrappers = pgBrowser.Nodes['coll-foreign_data_wrapper'] =
pgBrowser.Nodes['coll-foreign_data_wrapper'] =
pgBrowser.Collection.extend({
node: 'foreign_data_wrapper',
label: gettext('Foreign Data Wrappers'),
type: 'coll-foreign_data_wrapper',
columns: ['name','fdwowner','description']
columns: ['name','fdwowner','description'],
});
};
}
// Extend the browser's node class for foreign data wrapper node
if (!pgBrowser.Nodes['foreign_data_wrapper']) {
@ -66,7 +66,7 @@ define('pgadmin.node.foreign_data_wrapper', [
// Avoid multiple registration of menus
if (this.initialized)
return;
return;
this.initialized = true;
@ -77,19 +77,19 @@ define('pgadmin.node.foreign_data_wrapper', [
name: 'create_foreign_data_wrapper_on_coll', node: 'coll-foreign_data_wrapper', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Data Wrapper...'),
icon: 'wcTabIcon icon-foreign_data_wrapper', data: {action: 'create'}
icon: 'wcTabIcon icon-foreign_data_wrapper', data: {action: 'create'},
},{
name: 'create_foreign_data_wrapper', node: 'foreign_data_wrapper', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Data Wrapper...'),
icon: 'wcTabIcon icon-foreign_data_wrapper', data: {action: 'create'}
icon: 'wcTabIcon icon-foreign_data_wrapper', data: {action: 'create'},
},{
name: 'create_foreign_data_wrapper', node: 'database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Data Wrapper...'),
icon: 'wcTabIcon icon-foreign_data_wrapper', data: {action: 'create'},
enable: pgBrowser.Nodes['database'].is_conn_allow
}
enable: pgBrowser.Nodes['database'].is_conn_allow,
},
]);
},
@ -102,7 +102,7 @@ define('pgadmin.node.foreign_data_wrapper', [
fdwvalue: undefined,
fdwhan: undefined,
fdwoption: undefined,
fdwacl: []
fdwacl: [],
},
// Default values!
@ -120,67 +120,64 @@ define('pgadmin.node.foreign_data_wrapper', [
// Defining schema for the foreign data wrapper node
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: function(m) {
type: 'text', disabled: function() {
// name field will be disabled only if edit mode and server version is below 9.2
if (this.mode == 'edit' && this.node_info.server.version < 90200) {
return true;
}
else
return false;
}
return (
this.mode == 'edit' && this.node_info.server.version < 90200
);
},
},{
id: 'fdwoid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},{
id: 'fdwowner', label: gettext('Owner'), type: 'text',
control: Backform.NodeListByNameControl, node: 'role',
mode: ['edit', 'create', 'properties'], select2: { allowClear: false }
mode: ['edit', 'create', 'properties'], select2: { allowClear: false },
},{
id: 'fdwhan', label: gettext('Handler'), type: 'text', control: 'node-ajax-options',
group: gettext('Definition'), mode: ['edit', 'create', 'properties'], url:'get_handlers'
group: gettext('Definition'), mode: ['edit', 'create', 'properties'], url:'get_handlers',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'fdwoptions', label: gettext('Options'), type: 'collection', group: gettext('Options'),
model: OptionsModel, control: 'unique-col-collection', mode: ['edit', 'create'],
canAdd: true, canDelete: true, uniqueCol : ['fdwoption'],
columns: ['fdwoption','fdwvalue']
columns: ['fdwoption','fdwvalue'],
},{
id: 'fdwvalue', label: gettext('Validator'), type: 'text', control: 'node-ajax-options',
group: gettext('Definition'), mode: ['edit', 'create', 'properties'], url:'get_validators'
group: gettext('Definition'), mode: ['edit', 'create', 'properties'], url:'get_validators',
},{
id: 'security', label: gettext('Security'), type: 'group'
id: 'security', label: gettext('Security'), type: 'group',
},{
id: 'fdwacl', label: gettext('Privileges'), type: 'collection',
group: 'security', mode: ['edit', 'create'], canAdd: true,
canDelete: true, uniqueCol : ['grantee'],
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['U'],
}), control: 'unique-col-collection',
},{
id: 'fdwacl', label: gettext('Privileges'), type: 'collection',
group: 'security', mode: ['edit', 'create'], canAdd: true,
canDelete: true, uniqueCol : ['grantee'],
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['U']
}), control: 'unique-col-collection'
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
}],
group: gettext('Security'), mode: ['properties'], disabled: true,
}],
/* validate function is used to validate the input given by
* the user. In case of error, message will be displayed on
* the browser for the respective control.
*/
validate: function() {
var name = this.get('name');
validate: function() {
var name = this.get('name');
if (_.isUndefined(name) || _.isNull(name) ||
if (_.isUndefined(name) || _.isNull(name) ||
String(name).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Name cannot be empty.');
this.errorModel.set('name', msg);
return msg;
} else {
this.errorModel.unset('name');
}
return null;
}
})
var msg = gettext('Name cannot be empty.');
this.errorModel.set('name', msg);
return msg;
} else {
this.errorModel.unset('name');
}
return null;
},
}),
});
}

View File

@ -1,19 +1,19 @@
define('pgadmin.node.language', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
// Extend the browser's collection class for languages collection
if (!pgBrowser.Nodes['coll-language']) {
var languages = pgBrowser.Nodes['coll-language'] =
pgBrowser.Nodes['coll-language'] =
pgBrowser.Collection.extend({
node: 'language',
label: gettext('Languages'),
type: 'coll-language',
columns: ['name', 'lanowner', 'description']
columns: ['name', 'lanowner', 'description'],
});
};
}
// Extend the browser's node class for language node
if (!pgBrowser.Nodes['language']) {
@ -32,7 +32,7 @@ define('pgadmin.node.language', [
// Avoid multiple registration of menus
if (this.initialized)
return;
return;
this.initialized = true;
@ -43,17 +43,17 @@ define('pgadmin.node.language', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Language...'),
icon: 'wcTabIcon icon-language', data: {action: 'create'},
enable: pgBrowser.Nodes['database'].is_conn_allow
enable: pgBrowser.Nodes['database'].is_conn_allow,
},{
name: 'create_language_on_coll', node: 'coll-language', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Language...'),
icon: 'wcTabIcon icon-language', data: {action: 'create'}
icon: 'wcTabIcon icon-language', data: {action: 'create'},
},{
name: 'create_language', node: 'language', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Language...'),
icon: 'wcTabIcon icon-language', data: {action: 'create'}
icon: 'wcTabIcon icon-language', data: {action: 'create'},
}]);
},
@ -70,7 +70,7 @@ define('pgadmin.node.language', [
laninl: undefined,
lanval: undefined,
is_template: false,
template_list: []
template_list: [],
},
// Default values!
@ -91,8 +91,8 @@ define('pgadmin.node.language', [
url:'get_templates', select2: { allowClear: false, tags: true, multiple: false },
transform: function(data, cell) {
var res = [],
control = cell || this,
label = control.model.get('name');
control = cell || this,
label = control.model.get('name');
if (!control.model.isNew()) {
res.push({label: label, value: label});
@ -103,32 +103,32 @@ define('pgadmin.node.language', [
_.each(data, function(d) {
res.push({label: d.tmplname, value: d.tmplname});
tmp_list.push(d.tmplname);
})
});
}
this.model.set({'template_list': tmp_list});
}
return res;
}
},
},{
id: 'oid', label: gettext('OID'), cell: 'string', mode: ['properties'],
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'lanowner', label: gettext('Owner'), type: 'text',
control: Backform.NodeListByNameControl, node: 'role',
mode: ['edit', 'properties', 'create'], select2: { allowClear: false }
mode: ['edit', 'properties', 'create'], select2: { allowClear: false },
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'trusted', label: gettext('Trusted?'), type: 'switch',
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
'size': 'small',
},
group: gettext('Definition'), mode: ['edit', 'properties', 'create'], deps: ['name'],
disabled: function(m) {
@ -141,7 +141,7 @@ define('pgadmin.node.language', [
m.set({'is_template': true});
}
return true;
}
},
},{
id: 'lanproc', label: gettext('Handler Function'), type: 'text', control: 'node-ajax-options',
group: gettext('Definition'), mode: ['edit', 'properties', 'create'], url:'get_functions',
@ -157,7 +157,7 @@ define('pgadmin.node.language', [
if (d.prop_type == 'handler') {
res.push({label: d.label, value: d.label});
}
})
});
}
return res;
}, disabled: function(m) {
@ -166,7 +166,7 @@ define('pgadmin.node.language', [
return false;
}
return true;
}
},
},{
id: 'laninl', label: gettext('Inline Function'), type: 'text', control: 'node-ajax-options',
group: gettext('Definition'), mode: ['edit', 'properties', 'create'], url:'get_functions',
@ -182,7 +182,7 @@ define('pgadmin.node.language', [
if (d.prop_type == 'inline') {
res.push({label: d.label, value: d.label});
}
})
});
}
return res;
}, disabled: function(m) {
@ -191,7 +191,7 @@ define('pgadmin.node.language', [
return false;
}
return true;
}
},
},{
id: 'lanval', label: gettext('Validator Function'), type: 'text', control: 'node-ajax-options',
group: gettext('Definition'), mode: ['edit', 'properties', 'create'], url:'get_functions',
@ -203,11 +203,11 @@ define('pgadmin.node.language', [
transform: function(data) {
var res = [];
if (data && _.isArray(data)) {
_.each(data, function(d) {
if (d.prop_type == 'validator') {
res.push({label: d.label, value: d.label});
}
})
_.each(data, function(d) {
if (d.prop_type == 'validator') {
res.push({label: d.label, value: d.label});
}
});
}
return res;
}, disabled: function(m) {
@ -216,31 +216,32 @@ define('pgadmin.node.language', [
return false;
}
return true;
}
},
}, {
id: 'lanacl', label: gettext('Privileges'), type: 'collection',
group: 'security', control: 'unique-col-collection', mode: ['edit', 'create'],
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['U']
}), canAdd: true, canDelete: true, uniqueCol : ['grantee']
},{
privileges: ['U'],
}), canAdd: true, canDelete: true, uniqueCol : ['grantee'],
},{
id: 'seclabels', label: gettext('Security Labels'), mode: ['edit', 'create'],
model: pgBrowser.SecLabelModel, editable: false,
type: 'collection', group: 'security', min_version: 90200,
canAdd: true, canEdit: false, canDelete: true,
control: 'unique-col-collection'
}
control: 'unique-col-collection',
},
],
/* validate function is used to validate the input given by
* the user. In case of error, message will be displayed on
* the GUI for the respective control.
*/
validate: function() {
var name = this.get('name');
var name = this.get('name'),
msg;
if (_.isUndefined(name) || _.isNull(name) ||
String(name).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Name cannot be empty.');
msg = gettext('Name cannot be empty.');
this.errorModel.set('name', msg);
return msg;
} else {
@ -252,7 +253,7 @@ define('pgadmin.node.language', [
var handler_func = this.get('lanproc');
if (_.isUndefined(handler_func) || _.isNull(handler_func) ||
String(handler_func).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Handler Function cannot be empty.');
msg = gettext('Handler Function cannot be empty.');
this.errorModel.set('lanproc', msg);
return msg;
} else {
@ -261,9 +262,9 @@ define('pgadmin.node.language', [
}
return null;
}
})
})
},
}),
});
}
return pgBrowser.Nodes['coll-language'];
});

View File

@ -1,70 +1,70 @@
define('pgadmin.node.catalog_object_column', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
'pgadmin.browser', 'pgadmin.browser.collection',
], function(gettext, $, _, S, pgAdmin, pgBrowser) {
if (!pgBrowser.Nodes['coll-catalog_object_column']) {
var databases = pgAdmin.Browser.Nodes['coll-catalog_object_column'] =
pgAdmin.Browser.Nodes['coll-catalog_object_column'] =
pgAdmin.Browser.Collection.extend({
node: 'catalog_object_column',
label: gettext('catalog_object_column'),
type: 'coll-catalog_object_column',
columns: ['attname', 'attnum', 'cltype', 'description']
columns: ['attname', 'attnum', 'cltype', 'description'],
});
};
}
if (!pgBrowser.Nodes['catalog_object_column']) {
pgAdmin.Browser.Nodes['catalog_object_column'] =
pgAdmin.Browser.Node.extend({
parent_type: 'catalog_object',
type: 'catalog_object_column',
label: gettext('catalog_object_column'),
hasSQL: false,
hasScriptTypes: [],
hasDepends: true,
Init: function() {
parent_type: 'catalog_object',
type: 'catalog_object_column',
label: gettext('catalog_object_column'),
hasSQL: false,
hasScriptTypes: [],
hasDepends: true,
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
if (this.initialized)
return;
this.initialized = true;
this.initialized = true;
},
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
attname: undefined,
attowner: undefined,
atttypid: undefined,
attnum: undefined,
cltype: undefined,
collspcname: undefined,
attacl: undefined,
description: undefined
},
schema: [{
id: 'attname', label: gettext('Column'), cell: 'string',
type: 'text', disabled: true
},{
id: 'attowner', label: gettext('Owner'), cell: 'string',
type: 'text', disabled: true
},{
id: 'attnum', label: gettext('Position'), cell: 'string',
type: 'text', disabled: true
},{
id: 'cltype', label: gettext('Data type'), cell: 'string',
group: gettext('Definition'), type: 'text', disabled: true
},{
id: 'collspcname', label: gettext('Collation'), cell: 'string',
group: gettext('Definition'), type: 'text', disabled: true
},{
id: 'attacl', label: gettext('Privileges'), cell: 'string',
group: gettext('Security'), type: 'text', disabled: true
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', disabled: true
}]
})
});
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
attname: undefined,
attowner: undefined,
atttypid: undefined,
attnum: undefined,
cltype: undefined,
collspcname: undefined,
attacl: undefined,
description: undefined,
},
schema: [{
id: 'attname', label: gettext('Column'), cell: 'string',
type: 'text', disabled: true,
},{
id: 'attowner', label: gettext('Owner'), cell: 'string',
type: 'text', disabled: true,
},{
id: 'attnum', label: gettext('Position'), cell: 'string',
type: 'text', disabled: true,
},{
id: 'cltype', label: gettext('Data type'), cell: 'string',
group: gettext('Definition'), type: 'text', disabled: true,
},{
id: 'collspcname', label: gettext('Collation'), cell: 'string',
group: gettext('Definition'), type: 'text', disabled: true,
},{
id: 'attacl', label: gettext('Privileges'), cell: 'string',
group: gettext('Security'), type: 'text', disabled: true,
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', disabled: true,
}],
}),
});
}
return pgBrowser.Nodes['catalog_object_column'];

View File

@ -1,17 +1,17 @@
define('pgadmin.node.catalog_object', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
'pgadmin.browser', 'pgadmin.browser.collection',
], function(gettext, $, _, S, pgAdmin, pgBrowser) {
if (!pgBrowser.Nodes['coll-catalog_object']) {
var databases = pgAdmin.Browser.Nodes['coll-catalog_object'] =
pgAdmin.Browser.Nodes['coll-catalog_object'] =
pgAdmin.Browser.Collection.extend({
node: 'catalog_object',
label: gettext('Catalog Objects'),
type: 'coll-catalog_object',
columns: ['name', 'owner', 'description']
columns: ['name', 'owner', 'description'],
});
};
}
if (!pgBrowser.Nodes['catalog_object']) {
pgAdmin.Browser.Nodes['catalog_object'] = pgAdmin.Browser.Node.extend({
@ -24,7 +24,7 @@ define('pgadmin.node.catalog_object', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -38,20 +38,20 @@ define('pgadmin.node.catalog_object', [
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline' , disabled: true
}
]
})
});
type: 'multiline' , disabled: true,
},
],
}),
});
}

View File

@ -1,18 +1,18 @@
define('pgadmin.node.collation', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser) {
if (!pgBrowser.Nodes['coll-collation']) {
var databases = pgAdmin.Browser.Nodes['coll-collation'] =
pgAdmin.Browser.Nodes['coll-collation'] =
pgAdmin.Browser.Collection.extend({
node: 'collation',
label: gettext('Collations'),
type: 'coll-collation',
columns: ['name', 'owner', 'description']
columns: ['name', 'owner', 'description'],
});
};
}
if (!pgBrowser.Nodes['collation']) {
pgAdmin.Browser.Nodes['collation'] = pgBrowser.Node.extend({
@ -37,20 +37,20 @@ define('pgadmin.node.collation', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Collation...'),
icon: 'wcTabIcon icon-collation', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_collation', node: 'collation', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Collation...'),
icon: 'wcTabIcon icon-collation', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_collation', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Collation...'),
icon: 'wcTabIcon icon-collation', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -63,7 +63,7 @@ define('pgadmin.node.collation', [
owner: undefined,
lc_type: undefined,
lc_collate: undefined,
description: undefined
description: undefined,
},
// Default values!
@ -83,15 +83,15 @@ define('pgadmin.node.collation', [
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: 'inSchema'
disabled: 'inSchema',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: 'inSchema', control: 'node-list-by-name',
node: 'role'
node: 'role',
},{
id: 'schema', label: gettext('Schema'), cell: 'string',
type: 'text', mode: ['create', 'edit'], node: 'schema',
@ -103,43 +103,42 @@ define('pgadmin.node.collation', [
}
return true;
}, control: 'node-list-by-name',
cache_node: 'database', cached_level: 'database'
cache_node: 'database', cached_level: 'database',
},{
id: 'copy_collation', label: gettext('Copy collation'), cell: 'string',
control: 'node-ajax-options',
type: 'text', mode: ['create', 'edit'], group: gettext('Definition'),
url: 'get_collations', disabled: 'inSchemaWithModelCheck',
deps: ['locale', 'lc_collate', 'lc_type']
deps: ['locale', 'lc_collate', 'lc_type'],
},{
id: 'locale', label: gettext('Locale'), cell: 'string',
type: 'text', mode: ['create', 'edit'], group: gettext('Definition'),
disabled: 'inSchemaWithModelCheck',
deps: ['lc_collate', 'lc_type', 'copy_collation']
deps: ['lc_collate', 'lc_type', 'copy_collation'],
},{
id: 'lc_collate', label: gettext('LC_COLLATE'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
deps: ['locale', 'copy_collation'], disabled: 'inSchemaWithModelCheck'
deps: ['locale', 'copy_collation'], disabled: 'inSchemaWithModelCheck',
},{
id: 'lc_type', label: gettext('LC_TYPE'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
disabled: 'inSchemaWithModelCheck',
deps: ['locale', 'copy_collation']
deps: ['locale', 'copy_collation'],
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', mode: ['properties', 'create', 'edit'],
disabled: 'inSchema'
}
disabled: 'inSchema',
},
],
validate: function() {
var err = {},
msg = undefined,
changedAttrs = this.changed,
locale_flag = false,
lc_type_flag = false,
lc_coll_flag = false,
copy_coll_flag = false,
msg = undefined,
data = this.toJSON();
msg = undefined,
changedAttrs = this.changed,
locale_flag = false,
lc_type_flag = false,
lc_coll_flag = false,
copy_coll_flag = false,
data = this.toJSON();
this.errorModel.clear();
@ -166,7 +165,7 @@ define('pgadmin.node.collation', [
}
if (locale_flag && (lc_coll_flag || lc_type_flag) && copy_coll_flag) {
msg = gettext('Definition incomplete. Please provide Locale OR Copy Collation OR LC_TYPE/LC_COLLATE.');
err['locale'] = msg
err['locale'] = msg;
}
return null;
},
@ -183,12 +182,12 @@ define('pgadmin.node.collation', [
if(this.node_info && 'schema' in this.node_info)
{
// Enable copy_collation only if locale & lc_* is not provided
if (m.isNew() && this.name == "copy_collation")
if (m.isNew() && this.name == 'copy_collation')
{
if(m.get('locale'))
return true;
if(m.get('lc_collate') || m.get('lc_type'))
return true
return true;
return false;
}
@ -198,7 +197,7 @@ define('pgadmin.node.collation', [
if(m.get('locale'))
return true;
if(m.get('copy_collation'))
return true
return true;
return false;
}
@ -208,7 +207,7 @@ define('pgadmin.node.collation', [
if(m.get('lc_collate') || m.get('lc_type'))
return true;
if(m.get('copy_collation'))
return true
return true;
return false;
}
@ -221,37 +220,37 @@ define('pgadmin.node.collation', [
}
return true;
}
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
if (data && data.check == false)
if (data && data.check == false)
return true;
var t = pgBrowser.tree, i = item, d = itemData;
// To iterate over tree to check parent node
while (i) {
// If it is schema then allow user to create collation
if (_.indexOf(['schema'], d._type) > -1)
return true;
var t = pgBrowser.tree, i = item, d = itemData;
// To iterate over tree to check parent node
while (i) {
// If it is schema then allow user to create collation
if (_.indexOf(['schema'], d._type) > -1)
return true;
if ('coll-collation' == d._type) {
if ('coll-collation' == d._type) {
//Check if we are not child of catalog
var prev_i = t.hasParent(i) ? t.parent(i) : null,
prev_d = prev_i ? t.itemData(prev_i) : null;
if( prev_d._type == 'catalog') {
return false;
} else {
return true;
}
var prev_i = t.hasParent(i) ? t.parent(i) : null,
prev_d = prev_i ? t.itemData(prev_i) : null;
if( prev_d._type == 'catalog') {
return false;
} else {
return true;
}
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// by default we do not want to allow create menu
return true;
}
});
return true;
},
});
}

View File

@ -1,20 +1,20 @@
// Domain Constraint Module: Collection and Node
define('pgadmin.node.domain_constraints', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser) {
// Define Domain Constraint Collection Node
if (!pgBrowser.Nodes['coll-domain_constraints']) {
var domain_constraints = pgAdmin.Browser.Nodes['coll-domain_constraints'] =
pgAdmin.Browser.Nodes['coll-domain_constraints'] =
pgAdmin.Browser.Collection.extend({
node: 'domain_constraints',
label: gettext('Domain Constraints'),
type: 'coll-domain_constraints',
columns: ['name', 'description']
columns: ['name', 'description'],
});
};
}
// Domain Constraint Node
if (!pgBrowser.Nodes['domain_constraints']) {
@ -31,7 +31,7 @@ define('pgadmin.node.domain_constraints', [
Init: function() {
// Avoid mulitple registration of menus
if (this.initialized)
return;
return;
this.initialized = true;
@ -40,20 +40,20 @@ define('pgadmin.node.domain_constraints', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 5, label: gettext('Domain Constraint...'),
icon: 'wcTabIcon icon-domain_constraints', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_domain_constraints', node: 'domain_constraints', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 5, label: gettext('Domain Constraint...'),
icon: 'wcTabIcon icon-domain_constraints', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_domain_constraints', node: 'domain', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 5, label: gettext('Domain Constraint...'),
icon: 'wcTabIcon icon-domain_constraints', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -65,48 +65,48 @@ define('pgadmin.node.domain_constraints', [
description: undefined,
consrc: undefined,
connoinherit: undefined,
convalidated: true
convalidated: true,
},
// Domain Constraint Schema
schema: [{
id: 'name', label: gettext('Name'), type:'text', cell:'string',
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'description', label: gettext('Comment'), type: 'multiline', cell:
'string', mode: ['properties', 'create', 'edit'], min_version: 90500,
},{
id: 'consrc', label: gettext('Check'), type: 'multiline', cel:
'string', group: gettext('Definition'), mode: ['properties',
'create', 'edit'], disabled: function(m) { return !m.isNew(); }
'create', 'edit'], disabled: function(m) { return !m.isNew(); },
},{
id: 'connoinherit', label: gettext('No inherit'), type:
'switch', cell: 'boolean', group: gettext('Definition'), mode:
['properties', 'create', 'edit'], disabled: 'isDisabled',
visible: false
visible: false,
},{
id: 'convalidated', label: gettext("Validate?"), type: 'switch', cell:
id: 'convalidated', label: gettext('Validate?'), type: 'switch', cell:
'boolean', group: gettext('Definition'), min_version: 90200,
disabled: function(m) {
if (!m.isNew()) {
var server = this.node_info.server;
if (server.version < 90200) { return true;
}
else if(m.get('convalidated')) {
if (!m.isNew()) {
var server = this.node_info.server;
if (server.version < 90200) { return true;
}
else if(m.get('convalidated')) {
return true;
}
return false;
}
return false;
}
return false;
},
mode: ['properties', 'create', 'edit']
mode: ['properties', 'create', 'edit'],
}],
// Client Side Validation
validate: function() {
var err = {},
errmsg;
errmsg;
if (_.isUndefined(this.get('name')) || String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
err['name'] = gettext('Name cannot be empty.');
@ -137,7 +137,7 @@ define('pgadmin.node.domain_constraints', [
}
}
return false;
}
},
}),
});
}

View File

@ -1,26 +1,29 @@
// Domain Module: Collection and Node.
define('pgadmin.node.domain', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.collection',
], function(
gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser, Backform, Backgrid
) {
// Define Domain Collection Node
if (!pgBrowser.Nodes['coll-domain']) {
var domains = pgBrowser.Nodes['coll-domain'] =
pgBrowser.Nodes['coll-domain'] =
pgBrowser.Collection.extend({
node: 'domain',
label: gettext('Domains'),
type: 'coll-domain',
columns: ['name', 'owner', 'description']
columns: ['name', 'owner', 'description'],
});
};
}
// Constraint Model
var ConstraintModel = pgBrowser.Node.Model.extend({
idAttribute: 'conoid',
initialize: function(attrs, args) {
initialize: function(attrs) {
if (!_.size(attrs) === 0) {
this.convalidated_default = this.get('convalidated')
this.convalidated_default = this.get('convalidated');
}
pgBrowser.Node.Model.prototype.initialize.apply(this, arguments);
},
@ -28,11 +31,11 @@ define('pgadmin.node.domain', [
conoid: undefined,
conname: undefined,
consrc: undefined,
convalidated: true
convalidated: true,
},
convalidated_default: true,
schema: [{
id: 'conoid', type: 'text', cell: 'string', visible: false
id: 'conoid', type: 'text', cell: 'string', visible: false,
},{
id: 'conname', label: gettext('Name'), type: 'text', cell: 'string',
cellHeaderClasses: 'width_percent_40',
@ -44,13 +47,13 @@ define('pgadmin.node.domain', [
}
}
return true;
}
},
},{
id: 'consrc', label: gettext('Check'), type: 'multiline',
cell: Backgrid.Extension.TextareaCell, group: gettext('Definition'),
cellHeaderClasses: 'width_percent_60', editable: function(m) {
return _.isUndefined(m.isNew) ? true : m.isNew();
}
},
},{
id: 'convalidated', label: gettext('Validate?'), type: 'switch', cell:
'boolean', group: gettext('Definition'),
@ -66,12 +69,12 @@ define('pgadmin.node.domain', [
return true;
}
return true;
}
},
}],
toJSON: Backbone.Model.prototype.toJSON,
validate: function() {
return null;
}
},
});
// Domain Node
@ -89,7 +92,7 @@ define('pgadmin.node.domain', [
Init: function() {
// Avoid mulitple registration of menus
if (this.initialized)
return;
return;
this.initialized = true;
@ -98,20 +101,20 @@ define('pgadmin.node.domain', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Domain...'),
icon: 'wcTabIcon icon-domain', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_domain', node: 'domain', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Domain...'),
icon: 'wcTabIcon icon-domain', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_domain', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Domain...'),
icon: 'wcTabIcon icon-domain', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -123,7 +126,7 @@ define('pgadmin.node.domain', [
var isNew = (_.size(attrs) === 0);
if (isNew) {
// Set Selected Schema
var schema = args.node_info.schema.label
var schema = args.node_info.schema.label;
this.set({'basensp': schema}, {silent: true});
// Set Current User
@ -146,34 +149,34 @@ define('pgadmin.node.domain', [
sysdomain: undefined,
collname: undefined,
constraints: [],
seclabels: []
seclabels: [],
},
type_options: undefined,
// Domain Schema
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit']
type: 'text', mode: ['properties', 'create', 'edit'],
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string', control: Backform.NodeListByNameControl,
node: 'role', type: 'text', mode: ['edit', 'create', 'properties']
node: 'role', type: 'text', mode: ['edit', 'create', 'properties'],
},{
id: 'basensp', label: gettext('Schema'), cell: 'node-list-by-name',
control: 'node-list-by-name', cache_level: 'database', type: 'text',
node: 'schema', mode: ['create', 'edit']
control: 'node-list-by-name', cache_level: 'database', type: 'text',
node: 'schema', mode: ['create', 'edit'],
},{
id: 'sysdomain', label: gettext('System domain?'), cell: 'boolean',
type: 'switch', mode: ['properties'],
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'basetype', label: gettext('Base type'), cell: 'string',
control: 'node-ajax-options', type: 'text', url: 'get_types',
@ -185,7 +188,7 @@ define('pgadmin.node.domain', [
transform: function(d) {
this.model.type_options = d;
return d;
}
},
},{
id: 'typlen', label: gettext('Length'), cell: 'string',
type: 'text', group: gettext('Definition'), deps: ['basetype'],
@ -201,18 +204,18 @@ define('pgadmin.node.domain', [
// if type from selected from combobox matches in options
if ( of_type == o.value ) {
// if length is allowed for selected type
if(o.length)
if(o.length)
{
// set the values in model
m.set('is_tlength', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
m.set('is_tlength', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
}
});
}
return !m.get('is_tlength');
}
},
},{
id: 'precision', label: gettext('Precision'), cell: 'string',
type: 'text', group: gettext('Definition'), deps: ['basetype'],
@ -228,56 +231,55 @@ define('pgadmin.node.domain', [
// if type from selected from combobox matches in options
if ( of_type == o.value ) {
// if precession is allowed for selected type
if(o.precision)
if(o.precision)
{
// set the values in model
m.set('is_precision', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
m.set('is_precision', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
}
});
}
return !m.get('is_precision');
}
},
},{
id: 'typdefault', label: gettext('Default'), cell: 'string',
type: 'text', group: gettext('Definition'),
placeholder: "Enter an expression or a value."
placeholder: 'Enter an expression or a value.',
},{
id: 'typnotnull', label: gettext('Not Null?'), cell: 'boolean',
type: 'switch', group: gettext('Definition'),
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},{
id: 'collname', label: gettext('Collation'), cell: 'string',
control: 'node-ajax-options', type: 'text', url: 'get_collations',
group: gettext('Definition'), cache_level: 'database',
cache_node: 'schema', disabled: function(m) {
return !m.isNew();
}
},
},{
id: 'constraints', label: gettext('Constraints'), cell: 'string',
type: 'collection', group: gettext('Constraints'), mode: ['edit', 'create'],
model: ConstraintModel, canAdd: true, canDelete: true,
canEdit: false, columns: ['conname','consrc', 'convalidated']
canEdit: false, columns: ['conname','consrc', 'convalidated'],
},
pgBrowser.SecurityGroupSchema,
pgBrowser.SecurityGroupSchema,
{
id: 'seclabels', label: gettext('Security Labels'),
model: pgBrowser.SecLabelModel, type: 'collection',
group: 'security', mode: ['edit', 'create'],
min_version: 90100, canAdd: true,
canEdit: false, canDelete: true,
control: 'unique-col-collection', uniqueCol : ['provider']
control: 'unique-col-collection', uniqueCol : ['provider'],
}],
validate: function() { // Client Side Validation
var err = {},
errmsg,
seclabels = this.get('seclabels');
errmsg;
if (_.isUndefined(this.get('name')) || String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
err['name'] = gettext('Name cannot be empty.');
@ -291,8 +293,8 @@ define('pgadmin.node.domain', [
this.errorModel.clear().set(err);
return null;
}
return errmsg;
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -323,16 +325,16 @@ define('pgadmin.node.domain', [
return true;
},
isDisabled: function(m){
if (!m.isNew()) {
var server = this.node_info.server;
if (server.version < 90200)
if (!m.isNew()) {
var server = this.node_info.server;
if (server.version < 90200)
{
return false;
}
return false;
}
return true;
}
});
return true;
},
});
}

View File

@ -1,55 +1,34 @@
/* Create and Register Foreign Table Collection and Node. */
define('pgadmin.node.foreign_table', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.collection',
], function(
gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser, Backform, Backgrid
) {
if (!pgBrowser.Nodes['coll-foreign_table']) {
var foreigntable = pgBrowser.Nodes['coll-foreign_table'] =
pgBrowser.Nodes['coll-foreign_table'] =
pgBrowser.Collection.extend({
node: 'foreign_table',
label: gettext('Foreign Tables'),
type: 'coll-foreign_table',
columns: ['name', 'owner', 'description']
columns: ['name', 'owner', 'description'],
});
};
// Integer Cell for Columns Length and Precision
var IntegerDepCell = Backgrid.IntegerCell.extend({
initialize: function() {
Backgrid.NumberCell.prototype.initialize.apply(this, arguments);
Backgrid.Extension.DependentCell.prototype.initialize.apply(this, arguments);
},
dependentChanged: function () {
this.$el.empty();
var model = this.model;
var column = this.column;
var editable = this.column.get("editable");
var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable){ this.$el.addClass("editable"); }
else { this.$el.removeClass("editable"); }
this.delegateEvents();
return this;
},
remove: Backgrid.Extension.DependentCell.prototype.remove
});
}
// Options Model
var ColumnOptionsModel = pgBrowser.Node.Model.extend({
idAttribute: 'option',
defaults: {
option: undefined,
value: undefined
value: undefined,
},
schema: [
{id: 'option', label: gettext('Option'), type:'text', editable: true, cellHeaderClasses: 'width_percent_30'},
{
id: 'value', label: gettext('Value'), type: 'text', editable: true, cellHeaderClasses: 'width_percent_50'
}
id: 'value', label: gettext('Value'), type: 'text', editable: true, cellHeaderClasses: 'width_percent_50',
},
],
validate: function() {
if (_.isUndefined(this.get('value')) ||
@ -65,7 +44,7 @@ define('pgadmin.node.foreign_table', [
}
return null;
}
},
});
// Columns Model
@ -83,183 +62,183 @@ define('pgadmin.node.foreign_table', [
inheritedfrom: undefined,
inheritedid: undefined,
attstattarget: undefined,
coloptions: []
coloptions: [],
},
type_options: undefined,
schema: [{
id: 'attname', label: gettext('Name'), cell: 'string', type: 'text',
editable: 'is_editable_column', cellHeaderClasses: 'width_percent_40'
},{
id: 'datatype', label: gettext('Data Type'), cell: 'node-ajax-options',
control: 'node-ajax-options', type: 'text', url: 'get_types',
editable: 'is_editable_column', cellHeaderClasses: 'width_percent_0',
group: gettext('Definition'),
transform: function(d, self){
self.model.type_options = d;
return d;
}
},{
id: 'typlen', label: gettext('Length'),
cell: 'string', group: gettext('Definition'),
type: 'int', deps: ['datatype'],
disabled: function(m) {
var val = m.get('typlen');
id: 'attname', label: gettext('Name'), cell: 'string', type: 'text',
editable: 'is_editable_column', cellHeaderClasses: 'width_percent_40',
},{
id: 'datatype', label: gettext('Data Type'), cell: 'node-ajax-options',
control: 'node-ajax-options', type: 'text', url: 'get_types',
editable: 'is_editable_column', cellHeaderClasses: 'width_percent_0',
group: gettext('Definition'),
transform: function(d, self){
self.model.type_options = d;
return d;
},
},{
id: 'typlen', label: gettext('Length'),
cell: 'string', group: gettext('Definition'),
type: 'int', deps: ['datatype'],
disabled: function(m) {
var val = m.get('typlen');
// We will store type from selected from combobox
if(!(_.isUndefined(m.get('inheritedid'))
if(!(_.isUndefined(m.get('inheritedid'))
|| _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom'))
|| _.isNull(m.get('inheritedfrom')))) {
if (!_.isUndefined(val)) {
setTimeout(function() {
m.set('typlen', undefined);
}, 10);
}
return true;
if (!_.isUndefined(val)) {
setTimeout(function() {
m.set('typlen', undefined);
}, 10);
}
var of_type = m.get('datatype'),
has_length = false;
if(m.type_options) {
m.set('is_tlength', false, {silent: true});
// iterating over all the types
_.each(m.type_options, function(o) {
// if type from selected from combobox matches in options
if ( of_type == o.value ) {
// if length is allowed for selected type
if(o.length)
{
// set the values in model
has_length = true;
m.set('is_tlength', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
}
});
if (!has_length && !_.isUndefined(val)) {
setTimeout(function() {
m.set('typlen', undefined);
}, 10);
}
return !(m.get('is_tlength'));
}
if (!has_length && !_.isUndefined(val)) {
setTimeout(function() {
m.set('typlen', undefined);
}, 10);
}
return true;
},
cellHeaderClasses: 'width_percent_10'
},{
id: 'precision', label: gettext('Precision'),
type: 'int', deps: ['datatype'],
cell: 'string', group: gettext('Definition'),
disabled: function(m) {
var val = m.get('precision');
if(!(_.isUndefined(m.get('inheritedid'))
}
var of_type = m.get('datatype'),
has_length = false;
if(m.type_options) {
m.set('is_tlength', false, {silent: true});
// iterating over all the types
_.each(m.type_options, function(o) {
// if type from selected from combobox matches in options
if ( of_type == o.value ) {
// if length is allowed for selected type
if(o.length)
{
// set the values in model
has_length = true;
m.set('is_tlength', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
}
});
if (!has_length && !_.isUndefined(val)) {
setTimeout(function() {
m.set('typlen', undefined);
}, 10);
}
return !(m.get('is_tlength'));
}
if (!has_length && !_.isUndefined(val)) {
setTimeout(function() {
m.set('typlen', undefined);
}, 10);
}
return true;
},
cellHeaderClasses: 'width_percent_10',
},{
id: 'precision', label: gettext('Precision'),
type: 'int', deps: ['datatype'],
cell: 'string', group: gettext('Definition'),
disabled: function(m) {
var val = m.get('precision');
if(!(_.isUndefined(m.get('inheritedid'))
|| _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom'))
|| _.isNull(m.get('inheritedfrom')))) {
if (!_.isUndefined(val)) {
setTimeout(function() {
m.set('precision', undefined);
}, 10);
}
return true;
}
var of_type = m.get('datatype'),
has_precision = false;
if(m.type_options) {
m.set('is_precision', false, {silent: true});
// iterating over all the types
_.each(m.type_options, function(o) {
// if type from selected from combobox matches in options
if ( of_type == o.value ) {
// if precession is allowed for selected type
if(o.precision)
{
has_precision = true;
// set the values in model
m.set('is_precision', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
}
});
if (!has_precision && !_.isUndefined(val)) {
setTimeout(function() {
m.set('precision', undefined);
}, 10);
}
return !(m.get('is_precision'));
}
if (!has_precision && !_.isUndefined(val)) {
if (!_.isUndefined(val)) {
setTimeout(function() {
m.set('precision', undefined);
}, 10);
}
return true;
}, cellHeaderClasses: 'width_percent_10'
},{
id: 'typdefault', label: gettext('Default'), type: 'text',
cell: 'string', min_version: 90300, group: gettext('Definition'),
placeholder: "Enter an expression or a value.",
cellHeaderClasses: 'width_percent_10',
editable: function(m) {
if(!(_.isUndefined(m.get('inheritedid'))
}
var of_type = m.get('datatype'),
has_precision = false;
if(m.type_options) {
m.set('is_precision', false, {silent: true});
// iterating over all the types
_.each(m.type_options, function(o) {
// if type from selected from combobox matches in options
if ( of_type == o.value ) {
// if precession is allowed for selected type
if(o.precision)
{
has_precision = true;
// set the values in model
m.set('is_precision', true, {silent: true});
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
}
}
});
if (!has_precision && !_.isUndefined(val)) {
setTimeout(function() {
m.set('precision', undefined);
}, 10);
}
return !(m.get('is_precision'));
}
if (!has_precision && !_.isUndefined(val)) {
setTimeout(function() {
m.set('precision', undefined);
}, 10);
}
return true;
}, cellHeaderClasses: 'width_percent_10',
},{
id: 'typdefault', label: gettext('Default'), type: 'text',
cell: 'string', min_version: 90300, group: gettext('Definition'),
placeholder: 'Enter an expression or a value.',
cellHeaderClasses: 'width_percent_10',
editable: function(m) {
if(!(_.isUndefined(m.get('inheritedid'))
|| _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom'))
|| _.isNull(m.get('inheritedfrom')))) { return false; }
if (this.get('node_info').server.version < 90300){
return false;
}
return true;
if (this.get('node_info').server.version < 90300){
return false;
}
},{
id: 'attnotnull', label: gettext('Not Null'),
cell: 'boolean',type: 'switch', editable: 'is_editable_column',
cellHeaderClasses: 'width_percent_10', group: gettext('Definition')
},{
id: 'attstattarget', label: gettext('Statistics'), min_version: 90200,
cell: 'integer', type: 'int', group: gettext('Definition'),
editable: function(m) {
if (_.isUndefined(m.isNew) || m.isNew()) { return false; }
if (this.get('node_info').server.version < 90200){
return false;
}
return (_.isUndefined(m.get('inheritedid')) || _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false
}, cellHeaderClasses: 'width_percent_10'
},{
id: 'collname', label: gettext('Collation'), cell: 'node-ajax-options',
control: 'node-ajax-options', type: 'text', url: 'get_collations',
min_version: 90300, editable: function(m) {
if (!(_.isUndefined(m.isNew)) && !m.isNew()) { return false; }
return (_.isUndefined(m.get('inheritedid')) || _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false
},
cellHeaderClasses: 'width_percent_20', group: gettext('Definition')
},{
id: 'attnum', cell: 'string',type: 'text', visible: false
},{
id: 'inheritedfrom', label: gettext('Inherited From'), cell: 'string',
type: 'text', visible: false, mode: ['properties', 'edit'],
cellHeaderClasses: 'width_percent_10'
},{
id: 'coloptions', label: gettext('Options'), cell: 'string',
type: 'collection', group: gettext('Options'), mode: ['edit', 'create'],
model: ColumnOptionsModel, canAdd: true, canDelete: true, canEdit: false,
control: Backform.UniqueColCollectionControl, uniqueCol : ['option'],
min_version: 90200
}],
return true;
},
},{
id: 'attnotnull', label: gettext('Not Null'),
cell: 'boolean',type: 'switch', editable: 'is_editable_column',
cellHeaderClasses: 'width_percent_10', group: gettext('Definition'),
},{
id: 'attstattarget', label: gettext('Statistics'), min_version: 90200,
cell: 'integer', type: 'int', group: gettext('Definition'),
editable: function(m) {
if (_.isUndefined(m.isNew) || m.isNew()) { return false; }
if (this.get('node_info').server.version < 90200){
return false;
}
return (_.isUndefined(m.get('inheritedid')) || _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false;
}, cellHeaderClasses: 'width_percent_10',
},{
id: 'collname', label: gettext('Collation'), cell: 'node-ajax-options',
control: 'node-ajax-options', type: 'text', url: 'get_collations',
min_version: 90300, editable: function(m) {
if (!(_.isUndefined(m.isNew)) && !m.isNew()) { return false; }
return (_.isUndefined(m.get('inheritedid')) || _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false;
},
cellHeaderClasses: 'width_percent_20', group: gettext('Definition'),
},{
id: 'attnum', cell: 'string',type: 'text', visible: false,
},{
id: 'inheritedfrom', label: gettext('Inherited From'), cell: 'string',
type: 'text', visible: false, mode: ['properties', 'edit'],
cellHeaderClasses: 'width_percent_10',
},{
id: 'coloptions', label: gettext('Options'), cell: 'string',
type: 'collection', group: gettext('Options'), mode: ['edit', 'create'],
model: ColumnOptionsModel, canAdd: true, canDelete: true, canEdit: false,
control: Backform.UniqueColCollectionControl, uniqueCol : ['option'],
min_version: 90200,
}],
validate: function() {
var errmsg = null;
@ -282,9 +261,9 @@ define('pgadmin.node.foreign_table', [
},
is_editable_column: function(m) {
return (_.isUndefined(m.get('inheritedid')) || _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false;
},
toJSON: Backbone.Model.prototype.toJSON
toJSON: Backbone.Model.prototype.toJSON,
});
@ -295,16 +274,15 @@ define('pgadmin.node.foreign_table', [
* for the selected table.
*/
var NodeAjaxOptionsMultipleControl = Backform.NodeAjaxOptionsControl.extend({
onChange: function(e) {
onChange: function() {
var model = this.model,
$el = $(e.target),
attrArr = this.field.get("name").split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
value = this.getValueFromDOM(),
changes = {},
columns = model.get('columns'),
inherits = model.get(name);
attrArr = this.field.get('name').split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
value = this.getValueFromDOM(),
changes = {},
columns = model.get('columns'),
inherits = model.get(name);
if (this.model.errorModel instanceof Backbone.Model) {
if (_.isEmpty(path)) {
@ -320,7 +298,7 @@ define('pgadmin.node.foreign_table', [
var self = this;
if (typeof(inherits) == "string"){ inherits = JSON.parse(inherits); }
if (typeof(inherits) == 'string'){ inherits = JSON.parse(inherits); }
// Remove Columns if inherit option is deselected from the combobox
if(_.size(value) < _.size(inherits)) {
@ -341,30 +319,30 @@ define('pgadmin.node.foreign_table', [
}
changes[name] = _.isEmpty(path) ? value : _.clone(model.get(name)) || {};
this.stopListening(this.model, "change:" + name, this.render);
this.stopListening(this.model, 'change:' + name, this.render);
model.set(changes);
this.listenTo(this.model, "change:" + name, this.render);
this.listenTo(this.model, 'change:' + name, this.render);
},
fetchColumns: function(table_id){
var self = this,
url = 'get_columns',
m = self.model.top || self.model;
url = 'get_columns',
m = self.model.top || self.model;
if (url) {
var node = this.field.get('schema_node'),
node_info = this.field.get('node_info'),
full_url = node.generate_url.apply(
node_info = this.field.get('node_info'),
full_url = node.generate_url.apply(
node, [
null, url, this.field.get('node_data'),
this.field.get('url_with_id') || false, node_info
this.field.get('url_with_id') || false, node_info,
]),
cache_level = this.field.get('cache_level') || node.type,
cache_node = this.field.get('cache_node');
cache_level = this.field.get('cache_level') || node.type,
cache_node = this.field.get('cache_node');
cache_node = (cache_node && pgBrowser.Nodes['cache_node']) || node;
m.trigger('pgadmin:view:fetching', m, self.field);
var data = {attrelid: table_id}
var data = {attrelid: table_id};
// Fetching Columns data for the selected table.
$.ajax({
@ -381,7 +359,7 @@ define('pgadmin.node.foreign_table', [
},
error: function() {
m.trigger('pgadmin:view:fetch:error', m, self.field);
}
},
});
m.trigger('pgadmin:view:fetched', m, self.field);
@ -399,10 +377,10 @@ define('pgadmin.node.foreign_table', [
// Constraints Model
var ConstraintModel = pgBrowser.Node.Model.extend({
idAttribute: 'conoid',
initialize: function(attrs, args) {
initialize: function(attrs) {
var isNew = (_.size(attrs) === 0);
if (!isNew) {
this.convalidated_default = this.get('convalidated')
this.convalidated_default = this.get('convalidated');
}
pgBrowser.Node.Model.prototype.initialize.apply(this, arguments);
},
@ -412,27 +390,26 @@ define('pgadmin.node.foreign_table', [
consrc: undefined,
connoinherit: undefined,
convalidated: true,
conislocal: undefined
conislocal: undefined,
},
convalidated_default: true,
schema: [{
id: 'conoid', type: 'text', cell: 'string', visible: false
id: 'conoid', type: 'text', cell: 'string', visible: false,
},{
id: 'conname', label: gettext('Name'), type: 'text', cell: 'string',
editable: 'is_editable', cellHeaderClasses: 'width_percent_30'
editable: 'is_editable', cellHeaderClasses: 'width_percent_30',
},{
id: 'consrc', label: gettext('Check'), type: 'multiline',
editable: 'is_editable', cell: Backgrid.Extension.TextareaCell,
cellHeaderClasses: 'width_percent_30'
cellHeaderClasses: 'width_percent_30',
},{
id: 'connoinherit', label: gettext('No Inherit'), type: 'switch',
cell: 'boolean', editable: 'is_editable',
cellHeaderClasses: 'width_percent_20'
cellHeaderClasses: 'width_percent_20',
},{
id: 'convalidated', label: gettext('Validate?'), type: 'switch',
cell: 'boolean', cellHeaderClasses: 'width_percent_20',
editable: function(m) {
var server = this.get('node_info').server;
if (_.isUndefined(m.isNew)) { return true; }
if (!m.isNew()) {
if(m.get('convalidated') && m.convalidated_default) {
@ -441,12 +418,12 @@ define('pgadmin.node.foreign_table', [
return true;
}
return true;
}
}
},
},
],
validate: function() {
var err = {},
errmsg;
errmsg;
if (_.isUndefined(this.get('conname')) || String(this.get('conname')).replace(/^\s+|\s+$/g, '') == '') {
err['conname'] = gettext('Constraint Name cannot be empty.');
@ -464,9 +441,9 @@ define('pgadmin.node.foreign_table', [
return errmsg;
},
is_editable: function(m) {
return _.isUndefined(m.isNew) ? true : m.isNew();
return _.isUndefined(m.isNew) ? true : m.isNew();
},
toJSON: Backbone.Model.prototype.toJSON
toJSON: Backbone.Model.prototype.toJSON,
});
@ -474,20 +451,20 @@ define('pgadmin.node.foreign_table', [
var OptionsModel = pgBrowser.Node.Model.extend({
defaults: {
option: undefined,
value: undefined
value: undefined,
},
schema: [{
id: 'option', label: gettext('Option'), cell: 'string', type: 'text',
editable: true, cellHeaderClasses:'width_percent_50'
editable: true, cellHeaderClasses:'width_percent_50',
},{
id: 'value', label: gettext('Value'), cell: 'string',type: 'text',
editable: true, cellHeaderClasses:'width_percent_50'
}
editable: true, cellHeaderClasses:'width_percent_50',
},
],
validate: function() {
// TODO: Add validation here
},
toJSON: Backbone.Model.prototype.toJSON
toJSON: Backbone.Model.prototype.toJSON,
});
@ -506,7 +483,7 @@ define('pgadmin.node.foreign_table', [
Init: function() {
/* Avoid multiple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -515,20 +492,20 @@ define('pgadmin.node.foreign_table', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Table...'),
icon: 'wcTabIcon icon-foreign_table', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_foreign_table', node: 'foreign_table', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Table...'),
icon: 'wcTabIcon icon-foreign_table', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_foreign_table', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Foreign Table...'),
icon: 'wcTabIcon icon-foreign_table', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -539,11 +516,11 @@ define('pgadmin.node.foreign_table', [
var isNew = (_.size(attrs) === 0);
if (isNew) {
var schema = args.node_info.schema._label,
userInfo = pgBrowser.serverInfo[args.node_info.server._id].user;
userInfo = pgBrowser.serverInfo[args.node_info.server._id].user;
// Set Selected Schema and Current User
this.set({
'basensp': schema, 'owner': userInfo.name
'basensp': schema, 'owner': userInfo.name,
}, {silent: true});
}
pgBrowser.Node.Model.prototype.initialize.apply(this, arguments);
@ -562,34 +539,34 @@ define('pgadmin.node.foreign_table', [
ftoptions: [],
relacl: [],
stracl: [],
seclabels: []
seclabels: [],
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit']
type: 'text', mode: ['properties', 'create', 'edit'],
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
control: Backform.NodeListByNameControl,
node: 'role', type: 'text', select2: { allowClear: false }
node: 'role', type: 'text', select2: { allowClear: false },
},{
id: 'basensp', label: gettext('Schema'), cell: 'node-list-by-name',
control: 'node-list-by-name', cache_level: 'database', type: 'text',
node: 'schema', mode:['create', 'edit']
control: 'node-list-by-name', cache_level: 'database', type: 'text',
node: 'schema', mode:['create', 'edit'],
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'ftsrvname', label: gettext('Foreign server'), cell: 'string', control: 'node-ajax-options',
type: 'text', group: gettext('Definition'), url: 'get_foreign_servers', disabled: function(m) { return !m.isNew(); }
type: 'text', group: gettext('Definition'), url: 'get_foreign_servers', disabled: function(m) { return !m.isNew(); },
},{
id: 'inherits', label: gettext('Inherits'), group: gettext('Definition'),
type: 'array', min_version: 90500, control: NodeAjaxOptionsMultipleControl,
url: 'get_tables', select2: {multiple: true},
'cache_level': 'database',
transform: function(d, self){
transform: function(d) {
if (this.field.get('mode') == 'edit') {
var oid = this.model.get('oid');
var s = _.findWhere(d, {'id': oid});
@ -598,7 +575,7 @@ define('pgadmin.node.foreign_table', [
}
}
return d;
}
},
},{
id: 'columns', label: gettext('Columns'), cell: 'string',
type: 'collection', group: gettext('Columns'), mode: ['edit', 'create'],
@ -606,12 +583,12 @@ define('pgadmin.node.foreign_table', [
columns: ['attname', 'datatype', 'inheritedfrom'],
canDeleteRow: function(m) {
return (_.isUndefined(m.get('inheritedid')) || _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false;
},
canEditRow: function(m) {
return (_.isUndefined(m.get('inheritedid')) || _.isNull(m.get('inheritedid'))
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false
}
|| _.isUndefined(m.get('inheritedfrom')) || _.isNull(m.get('inheritedfrom'))) ? true : false;
},
},
{
id: 'constraints', label: gettext('Constraints'), cell: 'string',
@ -625,20 +602,20 @@ define('pgadmin.node.foreign_table', [
}
return true;
}, min_version: 90500, canDeleteRow: function(m) {
return (m.get('conislocal') == true || _.isUndefined(m.get('conislocal'))) ? true : false
}
return (m.get('conislocal') == true || _.isUndefined(m.get('conislocal'))) ? true : false;
},
},{
id: 'strftoptions', label: gettext('Options'), cell: 'string',
type: 'text', group: gettext('Definition'), mode: ['properties']
type: 'text', group: gettext('Definition'), mode: ['properties'],
},{
id: 'ftoptions', label: gettext('Options'), cell: 'string',
type: 'collection', group: gettext('Options'), mode: ['edit', 'create'],
model: OptionsModel, canAdd: true, canDelete: true, canEdit: false,
control: 'unique-col-collection', uniqueCol : ['option']
control: 'unique-col-collection', uniqueCol : ['option'],
},{
id: 'relacl', label: gettext('Privileges'), cell: 'string',
type: 'text', group: gettext('Security'),
mode: ['properties'], min_version: 90200
mode: ['properties'], min_version: 90200,
}, pgBrowser.SecurityGroupSchema, {
id: 'acl', label: gettext('Privileges'), model: pgAdmin
.Browser.Node.PrivilegeRoleModel.extend(
@ -646,21 +623,20 @@ define('pgadmin.node.foreign_table', [
editable: false, type: 'collection', group: 'security',
mode: ['edit', 'create'],
canAdd: true, canDelete: true, control: 'unique-col-collection',
min_version: 90200
min_version: 90200,
},{
id: 'seclabels', label: gettext('Security Labels'),
model: pgBrowser.SecLabelModel, type: 'collection',
group: 'security', mode: ['edit', 'create'],
min_version: 90100, canAdd: true,
canEdit: false, canDelete: true,
control: 'unique-col-collection', uniqueCol : ['provider']
}
control: 'unique-col-collection', uniqueCol : ['provider'],
},
],
validate: function()
{
var err = {},
errmsg,
seclabels = this.get('seclabels');
errmsg = null;
if (_.isUndefined(this.get('name')) || String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
err['name'] = gettext('Name cannot be empty.');
@ -680,8 +656,8 @@ define('pgadmin.node.foreign_table', [
this.errorModel.clear().set(err);
return null;
}
return errmsg;
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -710,8 +686,8 @@ define('pgadmin.node.foreign_table', [
}
// by default we do not want to allow create menu
return true;
}
});
},
});
}

View File

@ -1,65 +1,65 @@
define('pgadmin.node.fts_configuration', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.collection',
], function(
gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser, Backform, Backgrid
) {
// Model for tokens control
var TokenModel = pgAdmin.Browser.Node.Model.extend({
defaults: {
token: undefined,
dictname: undefined
},
keys: ['token'],
defaults: {
token: undefined,
dictname: undefined,
},
keys: ['token'],
// Define the schema for the token/dictionary list
schema: [{
id: 'token', label: gettext('Token'), type:'text', group: null,
cellHeaderClasses:'width_percent_50',
editable: false, cell: 'string', url: 'tokens'
},{
id: 'dictname', label: gettext('Dictionaries'), type: 'text', group:null,
cellHeaderClasses:'width_percent_50', editable: true,
cell:Backgrid.Extension.MultiSelectAjaxCell, url: 'dictionaries'
}],
schema: [{
id: 'token', label: gettext('Token'), type:'text', group: null,
cellHeaderClasses:'width_percent_50',
editable: false, cell: 'string', url: 'tokens',
},{
id: 'dictname', label: gettext('Dictionaries'), type: 'text', group:null,
cellHeaderClasses:'width_percent_50', editable: true,
cell:Backgrid.Extension.MultiSelectAjaxCell, url: 'dictionaries',
}],
// Validation for token and dictionary list
validate: function() {
validate: function() {
// Clear any existing errors.
var msg;
this.errorModel.clear();
var token = this.get('token');
var dictionary = this.get('dictname');
var msg;
this.errorModel.clear();
var token = this.get('token');
var dictionary = this.get('dictname');
if (_.isNull(token) ||
if (_.isNull(token) ||
_.isUndefined(token) ||
String(token).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Token cannot be empty.');
this.errorModel.set('token',msg);
return msg;
}
msg = gettext('Token cannot be empty.');
this.errorModel.set('token',msg);
return msg;
}
if (_.isNull(dictionary) ||
if (_.isNull(dictionary) ||
_.isUndefined(dictionary) ||
String(dictionary).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Dictionary name cannot be empty.');
this.errorModel.set('dictname',msg);
return msg;
}
return null;
}
msg = gettext('Dictionary name cannot be empty.');
this.errorModel.set('dictname',msg);
return msg;
}
return null;
},
});
// Customized control for token control
var TokenControl = Backform.TokenControl =
Backform.UniqueColCollectionControl.extend({
initialize: function(opts) {
Backform.UniqueColCollectionControl.prototype.initialize.apply(
initialize: function() {
Backform.UniqueColCollectionControl.prototype.initialize.apply(
this, arguments
);
var that;
var self = that = this,
node = 'fts_configuration',
var self = this,
headerSchema = [{
id: 'token', label:'', type:'text', url: 'tokens',
node:'fts_configuration', canAdd: true, 'url_with_id': true,
@ -76,11 +76,10 @@ define('pgadmin.node.fts_configuration', [
url = self.field.get('url') || self.defaults.url,
m = self.model.top || self.model;
/* Fetch the tokens/dict list from 'that' node.
* Here 'that' refers to unique collection control where
/* Fetch the tokens/dict list from 'self' node.
* Here 'self' refers to unique collection control where
* 'self' refers to nodeAjaxOptions control for dictionary
*/
var cfgid = that.model.get('oid');
if (url) {
var node = this.field.get('schema_node'),
node_info = this.field.get('node_info'),
@ -88,7 +87,7 @@ define('pgadmin.node.fts_configuration', [
node, [
null, url, this.field.get('node_data'),
this.field.get('url_with_id') || false,
node_info
node_info,
]),
cache_level = this.field.get('cache_level') || node.type,
cache_node = this.field.get('cache_node');
@ -124,7 +123,7 @@ define('pgadmin.node.fts_configuration', [
},
error: function() {
m.trigger('pgadmin:view:fetch:error', m, self.field);
}
},
});
m.trigger('pgadmin:view:fetched', m, self.field);
}
@ -143,272 +142,271 @@ define('pgadmin.node.fts_configuration', [
self.field.set('options', data);
}
}
}
},
}),
// Select2 control for adding new tokens
select2: {
allowClear: true, width: 'style',
placeholder: gettext('Select token')
placeholder: gettext('Select token'),
},
first_empty: true,
disabled: function(m) {
disabled: function() {
return _.isUndefined(self.model.get('oid'));
}
},
}],
headerDefaults = {token: null},
// Grid columns backgrid
gridCols = ['token', 'dictname'];
// Creating model for header control which is used to add new tokens
self.headerData = new (Backbone.Model.extend({
defaults: headerDefaults,
schema: headerSchema
}))({});
self.headerData = new (Backbone.Model.extend({
defaults: headerDefaults,
schema: headerSchema,
}))({});
// Creating view from header schema in tokens control
var headerGroups = Backform.generateViewSchema(
var headerGroups = Backform.generateViewSchema(
self.field.get('node_info'), self.headerData, 'create',
self.field.get('schema_node'), self.field.get('node_data')
),
fields = [];
_.each(headerGroups, function(o) {
fields = fields.concat(o.fields);
});
self.headerFields = new Backform.Fields(fields);
_.each(headerGroups, function(o) {
fields = fields.concat(o.fields);
});
self.headerFields = new Backform.Fields(fields);
// creating grid using grid columns
self.gridSchema = Backform.generateGridColumnsFromModel(
self.gridSchema = Backform.generateGridColumnsFromModel(
self.field.get('node_info'), self.field.get('model'),
'edit', gridCols, self.field.get('schema_node')
);
// Providing behaviour control functions to header and grid control
self.controls = [];
self.listenTo(self.headerData, "change", self.headerDataChanged);
self.listenTo(self.headerData, "select2", self.headerDataChanged);
self.listenTo(self.collection, "add", self.onAddorRemoveTokens);
self.listenTo(self.collection, "remove", self.onAddorRemoveTokens);
},
self.controls = [];
self.listenTo(self.headerData, 'change', self.headerDataChanged);
self.listenTo(self.headerData, 'select2', self.headerDataChanged);
self.listenTo(self.collection, 'add', self.onAddorRemoveTokens);
self.listenTo(self.collection, 'remove', self.onAddorRemoveTokens);
},
// Template for creating header view
generateHeader: function(data) {
var header = [
'<div class="subnode-header-form">',
' <div class="container-fluid">',
' <div class="row">',
' <div class="col-xs-3">',
' <label class="control-label"><%-token_label%></label>',
' </div>',
' <div class="col-xs-6" header="token"></div>',
' <div class="col-xs-2">',
' <button class="btn-sm btn-default add fa fa-plus" <%=canAdd ? "" : "disabled=\'disabled\'"%> ></button>',
' </div>',
' </div>',
' </div>',
'</div>',].join("\n")
generateHeader: function(data) {
var header = [
'<div class="subnode-header-form">',
' <div class="container-fluid">',
' <div class="row">',
' <div class="col-xs-3">',
' <label class="control-label"><%-token_label%></label>',
' </div>',
' <div class="col-xs-6" header="token"></div>',
' <div class="col-xs-2">',
' <button class="btn-sm btn-default add fa fa-plus" <%=canAdd ? "" : "disabled=\'disabled\'"%> ></button>',
' </div>',
' </div>',
' </div>',
'</div>'].join('\n');
_.extend(data, {
token_label: gettext('Tokens')
});
_.extend(data, {
token_label: gettext('Tokens'),
});
var self = this,
var self = this,
headerTmpl = _.template(header),
$header = $(headerTmpl(data)),
controls = this.controls;
self.headerFields.each(function(field) {
var control = new (field.get("control"))({
field: field,
model: self.headerData
});
self.headerFields.each(function(field) {
var control = new (field.get('control'))({
field: field,
model: self.headerData,
});
$header.find('div[header="' + field.get('name') + '"]').append(
$header.find('div[header="' + field.get('name') + '"]').append(
control.render().$el
);
control.$el.find('.control-label').remove();
controls.push(control);
});
control.$el.find('.control-label').remove();
controls.push(control);
});
// We should not show add button in properties mode
if (data.mode == 'properties') {
$header.find("button.add").remove();
}
if (data.mode == 'properties') {
$header.find('button.add').remove();
}
// Disable add button in token control in create mode
if(data.mode == 'create') {
$header.find("button.add").attr('disabled', true);
}
if(data.mode == 'create') {
$header.find('button.add').attr('disabled', true);
}
self.$header = $header;
return $header;
},
self.$header = $header;
return $header;
},
// Providing event handler for add button in header
events: _.extend(
events: _.extend(
{}, Backform.UniqueColCollectionControl.prototype.events,
{'click button.add': 'addTokens'}
),
// Show token/dictionary grid
showGridControl: function(data) {
showGridControl: function(data) {
var self = this,
titleTmpl = _.template("<div class='subnode-header'></div>"),
$gridBody = $("<div></div>", {
class:'pgadmin-control-group backgrid form-group col-xs-12 object subnode'
var self = this,
titleTmpl = _.template('<div class=\'subnode-header\'></div>'),
$gridBody = $('<div></div>', {
class:'pgadmin-control-group backgrid form-group col-xs-12 object subnode',
}).append(
titleTmpl({label: data.label})
);
$gridBody.append(self.generateHeader(data));
$gridBody.append(self.generateHeader(data));
var gridColumns = _.clone(this.gridSchema.columns);
var gridColumns = _.clone(this.gridSchema.columns);
// Insert Delete Cell into Grid
if (data.disabled == false && data.canDelete) {
if (data.disabled == false && data.canDelete) {
gridColumns.unshift({
name: "pg-backform-delete", label: "",
name: 'pg-backform-delete', label: '',
cell: Backgrid.Extension.DeleteCell,
editable: false, cell_priority: -1
editable: false, cell_priority: -1,
});
}
}
if (self.grid) {
self.grid.remove();
self.grid.null;
}
if (self.grid) {
self.grid.remove();
self.grid.null;
}
// Initialize a new Grid instance
var grid = self.grid = new Backgrid.Grid({
columns: gridColumns,
collection: self.collection,
className: "backgrid table-bordered"
});
self.$grid = grid.render().$el;
var grid = self.grid = new Backgrid.Grid({
columns: gridColumns,
collection: self.collection,
className: 'backgrid table-bordered',
});
self.$grid = grid.render().$el;
$gridBody.append(self.$grid);
$gridBody.append(self.$grid);
// Find selected dictionaries in grid and show it all together
setTimeout(function() {
self.headerData.set({
'token': self.$header.find(
setTimeout(function() {
self.headerData.set({
'token': self.$header.find(
'div[header="token"] select'
).val()
}, {silent:true}
).val(),
}, {silent:true}
);
}, 10);
}, 10);
// Render node grid
return $gridBody;
},
return $gridBody;
},
// When user change the header control to add a new token
headerDataChanged: function() {
var self = this, val,
headerDataChanged: function() {
var self = this,
data = this.headerData.toJSON(),
inSelected = (_.isEmpty(data) || _.isUndefined(data)),
checkVars = ['token'];
inSelected = (_.isEmpty(data) || _.isUndefined(data));
if (!self.$header) {
return;
}
if (!self.$header) {
return;
}
self.$header.find('button.add').prop('disabled', inSelected);
},
self.$header.find('button.add').prop('disabled', inSelected);
},
// Get called when user click on add button header
addTokens: function(ev) {
ev.preventDefault();
var self = this,
addTokens: function(ev) {
ev.preventDefault();
var self = this,
token = self.headerData.get('token');
if (!token || token == '') {
return false;
}
if (!token || token == '') {
return false;
}
var coll = self.model.get(self.field.get('name')),
var coll = self.model.get(self.field.get('name')),
m = new (self.field.get('model'))(
self.headerData.toJSON(), {
silent: true, top: self.model.top,
collection: coll, handler: coll
collection: coll, handler: coll,
}),
checkVars = ['token'],
idx = -1;
// Find if token exists in grid
self.collection.each(function(m) {
_.each(checkVars, function(v) {
var val = m.get(v);
if(val == token) {
idx = coll.indexOf(m);
}
self.collection.each(function(m) {
_.each(checkVars, function(v) {
var val = m.get(v);
if(val == token) {
idx = coll.indexOf(m);
}
});
});
});
// remove 'm' if duplicate value found.
if (idx == -1) {
coll.add(m);
idx = coll.indexOf(m);
}
self.$grid.find('.new').removeClass('new');
var newRow = self.grid.body.rows[idx].$el;
newRow.addClass("new");
if (idx == -1) {
coll.add(m);
idx = coll.indexOf(m);
}
self.$grid.find('.new').removeClass('new');
var newRow = self.grid.body.rows[idx].$el;
newRow.addClass('new');
//$(newRow).pgMakeVisible('table-bordered');
$(newRow).pgMakeVisible('backform-tab');
$(newRow).pgMakeVisible('backform-tab');
return false;
},
return false;
},
// When user delete token/dictionary entry from grid
onAddorRemoveTokens: function() {
var self = this;
onAddorRemoveTokens: function() {
var self = this;
/*
* Wait for collection to be updated before checking for the button to
* be enabled, or not.
*/
setTimeout(function() {
setTimeout(function() {
self.collection.trigger('pgadmin:tokens:updated', self.collection);
self.headerDataChanged();
}, 10);
},
self.headerDataChanged();
}, 10);
},
// When control is about to destroy
remove: function() {
remove: function() {
/*
* Stop listening the events registered by this control.
*/
this.stopListening(this.headerData, "change", this.headerDataChanged);
this.listenTo(this.headerData, "select2", this.headerDataChanged);
this.listenTo(this.collection, "remove", this.onAddorRemoveTokens);
this.stopListening(this.headerData, 'change', this.headerDataChanged);
this.listenTo(this.headerData, 'select2', this.headerDataChanged);
this.listenTo(this.collection, 'remove', this.onAddorRemoveTokens);
// Remove header controls.
_.each(this.controls, function(control) {
control.remove();
});
TokenControl.__super__.remove.apply(this, arguments);
_.each(this.controls, function(control) {
control.remove();
});
TokenControl.__super__.remove.apply(this, arguments);
// Remove the header model
delete (this.headerData);
delete (this.headerData);
}
});
},
});
// Extend the collection class for FTS Configuration
if (!pgBrowser.Nodes['coll-fts_configuration']) {
var fts_configurations = pgAdmin.Browser.Nodes['coll-fts_configuration'] =
pgAdmin.Browser.Nodes['coll-fts_configuration'] =
pgAdmin.Browser.Collection.extend({
node: 'fts_configuration',
label: gettext('FTS Configurations'),
type: 'coll-fts_configuration',
columns: ['name', 'description']
columns: ['name', 'description'],
});
};
}
// Extend the node class for FTS Configuration
if (!pgBrowser.Nodes['fts_configuration']) {
@ -438,20 +436,20 @@ define('pgadmin.node.fts_configuration', [
applies: ['object', 'context'], callback: 'show_obj_properties',
label: gettext('FTS Configuration...'),
icon: 'wcTabIcon icon-fts_configuration', data: {action: 'create'},
enable: 'canCreate'
},{
enable: 'canCreate',
},{
name: 'create_fts_configuration_on_coll', module: this, priority: 4,
node: 'coll-fts_configuration', applies: ['object', 'context'],
callback: 'show_obj_properties', category: 'create',
label: gettext('FTS Configuration...'), data: {action: 'create'},
icon: 'wcTabIcon icon-fts_configuration', enable: 'canCreate'
},{
icon: 'wcTabIcon icon-fts_configuration', enable: 'canCreate',
},{
name: 'create_fts_configuration', node: 'fts_configuration',
module: this, applies: ['object', 'context'],
callback: 'show_obj_properties', category: 'create', priority: 4,
label: gettext('FTS Configuration...'), data: {action: 'create'},
icon: 'wcTabIcon icon-fts_configuration', enable: 'canCreate'
}]);
icon: 'wcTabIcon icon-fts_configuration', enable: 'canCreate',
}]);
},
// Defining model for FTS Configuration node
@ -463,7 +461,7 @@ define('pgadmin.node.fts_configuration', [
schema: undefined, // Schema name FTS Configuration belongs to
prsname: undefined, // FTS parser list for FTS Configuration node
copy_config: undefined, // FTS configuration list to copy from
tokens: undefined // token/dictionary pair list for node
tokens: undefined, // token/dictionary pair list for node
},
initialize: function(attrs, opts) {
var isNew = (_.size(attrs) === 0);
@ -473,29 +471,29 @@ define('pgadmin.node.fts_configuration', [
var user = pgBrowser.serverInfo[opts.node_info.server._id].user;
this.set({
'owner': user.name,
'schema': opts.node_info.schema._id
'schema': opts.node_info.schema._id,
}, {silent: true});
}
},
// Defining schema for FTS Configuration
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', cellHeaderClasses: 'width_percent_50'
type: 'text', cellHeaderClasses: 'width_percent_50',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
editable: false, type: 'text', disabled: true, mode:['properties']
editable: false, type: 'text', disabled: true, mode:['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
type: 'text', mode: ['properties', 'edit','create'], node: 'role',
control: Backform.NodeListByNameControl, select2: { allowClear: false }
control: Backform.NodeListByNameControl, select2: { allowClear: false },
},{
id: 'schema', label: gettext('Schema'), cell: 'string',
type: 'text', mode: ['create','edit'], node: 'schema',
control: 'node-list-by-id', cache_node: 'database',
cache_level: 'database'
cache_level: 'database',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', cellHeaderClasses: 'width_percent_50'
type: 'multiline', cellHeaderClasses: 'width_percent_50',
},{
id: 'prsname', label: gettext('Parser'),type: 'text',
url: 'parsers', first_empty: true,
@ -508,7 +506,7 @@ define('pgadmin.node.fts_configuration', [
(_.isNull(copy_config) ||
_.isUndefined(copy_config) ||
copy_config === '') ? false : true;
}
},
},{
id: 'copy_config', label: gettext('Copy Config'),type: 'text',
mode: ['create'], group: gettext('Definition'),
@ -521,21 +519,21 @@ define('pgadmin.node.fts_configuration', [
(_.isNull(parser) ||
_.isUndefined(parser) ||
parser === '') ? false : true;
}
},
},{
id: 'tokens', label: gettext('Tokens'), type: 'collection',
group: gettext('Tokens'), control: TokenControl,
model: TokenModel, columns: ['token', 'dictionary'],
uniqueCol : ['token'], mode: ['create','edit'],
canAdd: true, canEdit: false, canDelete: true
}],
canAdd: true, canEdit: false, canDelete: true,
}],
/*
* Triggers control specific error messages for name,
* copy_config/parser and schema, if any one of them is not specified
* while creating new fts configuration
*/
validate: function(keys){
validate: function() {
var msg;
var name = this.get('name');
var parser = this.get('prsname');
@ -577,7 +575,7 @@ define('pgadmin.node.fts_configuration', [
}
return null;
}
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -606,9 +604,9 @@ define('pgadmin.node.fts_configuration', [
}
// by default we do not want to allow create menu
return true;
}
},
});
}
return pgBrowser.Nodes['coll-fts_configuration'];
return pgBrowser.Nodes['coll-fts_configuration'];
});

View File

@ -1,55 +1,57 @@
define('pgadmin.node.fts_dictionary', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
// Extend the browser's node model class to create a option/value pair
var OptionLabelModel = pgAdmin.Browser.Node.Model.extend({
defaults: {
options: undefined,
value: undefined
},
defaults: {
options: undefined,
value: undefined,
},
// Define the schema for the Options
schema: [
{
id: 'option', label: gettext('Option'), type:'text', group: null,
cellHeaderClasses: 'width_percent_50', editable: true
},{
id: 'value', label: gettext('Value'), type: 'text', group:null,
cellHeaderClasses: 'width_percent_50', editable: true
},
],
validate: function() {
// Clear any existing errors.
this.errorModel.clear()
schema: [
{
id: 'option', label: gettext('Option'), type:'text', group: null,
cellHeaderClasses: 'width_percent_50', editable: true,
},{
id: 'value', label: gettext('Value'), type: 'text', group:null,
cellHeaderClasses: 'width_percent_50', editable: true,
},
],
validate: function() {
// Clear any existing errors.
this.errorModel.clear();
if (_.isUndefined(this.get('option')) ||
var msg;
if (_.isUndefined(this.get('option')) ||
String(this.get('option')).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Option cannot be empty.');
this.errorModel.set('option',msg);
return msg;
}
if (_.isUndefined(this.get('value')) ||
msg = gettext('Option cannot be empty.');
this.errorModel.set('option',msg);
return msg;
}
if (_.isUndefined(this.get('value')) ||
String(this.get('value')).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Value cannot be empty.');
this.errorModel.set('value',msg);
return msg;
}
return null;
}
});
msg = gettext('Value cannot be empty.');
this.errorModel.set('value',msg);
return msg;
}
return msg;
},
});
// Extend the collection class for FTS Dictionary
if (!pgBrowser.Nodes['coll-fts_dictionary']) {
var fts_dictionaries = pgAdmin.Browser.Nodes['coll-fts_dictionary'] =
pgAdmin.Browser.Nodes['coll-fts_dictionary'] =
pgAdmin.Browser.Collection.extend({
node: 'fts_dictionary',
label: gettext('FTS Dictionaries'),
type: 'coll-fts_dictionary',
columns: ['name', 'description']
columns: ['name', 'description'],
});
};
}
// Extend the node class for FTS Dictionary
if (!pgBrowser.Nodes['fts_dictionary']) {
@ -78,20 +80,20 @@ define('pgadmin.node.fts_dictionary', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Dictionary...'),
icon: 'wcTabIcon icon-fts_dictionary', data: {action: 'create'},
enable: 'canCreate'
},{
enable: 'canCreate',
},{
name: 'create_fts_dictionary_on_coll', node: 'coll-fts_dictionary',
module: this, applies: ['object', 'context'], priority: 4,
callback: 'show_obj_properties', category: 'create',
label: gettext('FTS Dictionary...'), data: {action: 'create'},
icon: 'wcTabIcon icon-fts_dictionary', enable: 'canCreate'
},{
icon: 'wcTabIcon icon-fts_dictionary', enable: 'canCreate',
},{
name: 'create_fts_dictionary', node: 'fts_dictionary', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Dictionary...'),
icon: 'wcTabIcon icon-fts_dictionary', data: {action: 'create'},
enable: 'canCreate'
}]);
enable: 'canCreate',
}]);
},
// Defining backform model for FTS Dictionary node
@ -102,7 +104,7 @@ define('pgadmin.node.fts_dictionary', [
description: undefined, // Comment on FTS Dictionary
schema: undefined, // Schema name FTS dictionary belongs to
template: undefined, // Template list for FTS dictionary node
options: undefined // option/value pair list for FTS Dictionary
options: undefined, // option/value pair list for FTS Dictionary
},
initialize: function(attrs, args) {
var isNew = (_.size(attrs) === 0);
@ -112,28 +114,28 @@ define('pgadmin.node.fts_dictionary', [
var user = pgBrowser.serverInfo[args.node_info.server._id].user;
this.set({
'owner': user.name,
'schema': args.node_info.schema._id
'schema': args.node_info.schema._id,
}, {silent: true});
}
},
// Defining schema for fts dictionary
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', cellHeaderClasses: 'width_percent_50'
type: 'text', cellHeaderClasses: 'width_percent_50',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
editable: false, type: 'text', disabled: true, mode:['properties']
editable: false, type: 'text', disabled: true, mode:['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
type: 'text', mode: ['properties', 'edit','create'], node: 'role',
control: Backform.NodeListByNameControl
control: Backform.NodeListByNameControl,
},{
id: 'schema', label: gettext('Schema'), cell: 'string',
type: 'text', mode: ['create','edit'], node: 'schema',
cache_node: 'database', control: 'node-list-by-id'
cache_node: 'database', control: 'node-list-by-id',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', cellHeaderClasses: 'width_percent_50'
type: 'multiline', cellHeaderClasses: 'width_percent_50',
},{
id: 'template', label: gettext('Template'),type: 'text',
disabled: function(m) { return !m.isNew(); }, url: 'fetch_templates',
@ -144,36 +146,37 @@ define('pgadmin.node.fts_dictionary', [
group: gettext('Options'), control: 'unique-col-collection',
model: OptionLabelModel, columns: ['option', 'value'],
uniqueCol : ['option'], mode: ['edit', 'create'],
canAdd: true, canEdit: false,canDelete: true
}],
canAdd: true, canEdit: false,canDelete: true,
}],
/*
* Triggers control specific error messages for dictionary name,
* template and schema, if any one of them is not specified
* while creating new fts dictionary
*/
validate: function(keys){
var name = this.get('name');
var template = this.get('template');;
var schema = this.get('schema');
validate: function() {
var name = this.get('name'),
template = this.get('template'),
schema = this.get('schema'),
msg;
// Validate FTS Dictionary name
if (_.isUndefined(name) || _.isNull(name) || String(name).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Name must be specified.');
msg = gettext('Name must be specified.');
this.errorModel.set('name', msg);
return msg;
}
// Validate template name
else if (_.isUndefined(template) || _.isNull(template) || String(template).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Template must be selected.');
msg = gettext('Template must be selected.');
this.errorModel.set('template', msg);
return msg;
}
// Validate schema
else if (_.isUndefined(schema) || _.isNull(schema) || String(schema).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Schema must be selected.');
msg = gettext('Schema must be selected.');
this.errorModel.set('schema', msg);
return msg;
}
@ -181,7 +184,7 @@ define('pgadmin.node.fts_dictionary', [
this.trigger('on-status-clear');
return null;
}
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -210,9 +213,9 @@ define('pgadmin.node.fts_dictionary', [
}
// by default we do not want to allow create menu
return true;
}
},
});
}
return pgBrowser.Nodes['fts_dictionary'];
return pgBrowser.Nodes['fts_dictionary'];
});

View File

@ -1,19 +1,18 @@
define('pgadmin.node.fts_parser', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.browser.collection',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser) {
// Extend the collection class for fts parser
if (!pgBrowser.Nodes['coll-fts_parser']) {
var fts_parsers = pgAdmin.Browser.Nodes['coll-fts_parser'] =
pgAdmin.Browser.Nodes['coll-fts_parser'] =
pgAdmin.Browser.Collection.extend({
node: 'fts_parser',
label: gettext('FTS Parsers'),
type: 'coll-fts_parser',
columns: ['name', 'description']
columns: ['name', 'description'],
});
};
}
// Extend the node class for fts parser
if (!pgBrowser.Nodes['fts_parser']) {
@ -42,20 +41,20 @@ define('pgadmin.node.fts_parser', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Parser...'),
icon: 'wcTabIcon icon-fts_parser', data: {action: 'create'},
enable: 'canCreate'
},{
enable: 'canCreate',
},{
name: 'create_fts_parser_on_coll', node: 'coll-fts_parser',
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Parser...'),
icon: 'wcTabIcon icon-fts_parser', data: {action: 'create'},
module: this, enable: 'canCreate'
},{
module: this, enable: 'canCreate',
},{
name: 'create_fts_parser', node: 'fts_parser', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Parser...'),
icon: 'wcTabIcon icon-fts_parser', data: {action: 'create'},
enable: 'canCreate'
}]);
enable: 'canCreate',
}]);
},
@ -69,7 +68,7 @@ define('pgadmin.node.fts_parser', [
prstoken: undefined, // Token function for fts parser
prsend: undefined, // End function for fts parser
prslextype: undefined, // Lextype function for fts parser
prsheadline: undefined // Headline function for fts parse
prsheadline: undefined, // Headline function for fts parse
},
initialize: function(attrs, args) {
var isNew = (_.size(attrs) === 0);
@ -83,48 +82,48 @@ define('pgadmin.node.fts_parser', [
// Defining schema for fts parser
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', cellHeaderClasses: 'width_percent_50'
type: 'text', cellHeaderClasses: 'width_percent_50',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
editable: false, type: 'text', disabled: true, mode:['properties']
editable: false, type: 'text', disabled: true, mode:['properties'],
},{
id: 'schema', label: gettext('Schema'), cell: 'string',
type: 'text', mode: ['create','edit'], node: 'schema',
control: 'node-list-by-id', cache_node: 'database',
cache_level: 'database'
cache_level: 'database',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', cellHeaderClasses: 'width_percent_50'
type: 'multiline', cellHeaderClasses: 'width_percent_50',
},{
id: 'prsstart', label: gettext('Start function'),
type: 'text', disabled: function(m) { return !m.isNew(); },
control: 'node-ajax-options', url: 'start_functions',
group: gettext('Definition'), cache_level: 'database',
cache_node: 'schema'
cache_node: 'schema',
},{
id: 'prstoken', label: gettext('Get next token function'),
type: 'text', disabled: function(m) { return !m.isNew(); },
control: 'node-ajax-options', url: 'token_functions',
group: gettext('Definition'), cache_level: 'database',
cache_node: 'schema'
cache_node: 'schema',
},{
id: 'prsend', label: gettext('End function'),
type: 'text', disabled: function(m) { return !m.isNew(); },
control: 'node-ajax-options', url: 'end_functions',
group: gettext('Definition'), cache_level: 'database',
cache_node: 'schema'
cache_node: 'schema',
},{
id: 'prslextype', label: gettext('Lextypes function'),
type: 'text', disabled: function(m) { return !m.isNew(); },
control: 'node-ajax-options', url: 'lextype_functions',
group: gettext('Definition'), cache_level: 'database',
cache_node: 'schema'
cache_node: 'schema',
},{
id: 'prsheadline', label: gettext('Headline function'),
type: 'text', disabled: function(m) { return !m.isNew(); },
control: 'node-ajax-options', url: 'headline_functions',
group: gettext('Definition'), cache_level: 'database',
cache_node: 'schema'
cache_node: 'schema',
}],
/*
@ -132,19 +131,20 @@ define('pgadmin.node.fts_parser', [
* start, token, end, lextype functions and schema, if any one of them is not specified
* while creating new fts parser
*/
validate: function(keys){
var name = this.get('name');
var start = this.get('prsstart');
var token = this.get('prstoken');
var end = this.get('prsend');
var lextype = this.get('prslextype');
var schema = this.get('schema');
validate: function() {
var name = this.get('name'),
start = this.get('prsstart'),
token = this.get('prstoken'),
end = this.get('prsend'),
lextype = this.get('prslextype'),
schema = this.get('schema'),
msg;
// Validate fts parser name
if (_.isUndefined(name) ||
_.isNull(name) ||
String(name).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Name must be specified.');
msg = gettext('Name must be specified.');
this.errorModel.set('name', msg);
return msg;
}
@ -153,7 +153,7 @@ define('pgadmin.node.fts_parser', [
else if (_.isUndefined(start) ||
_.isNull(start) ||
String(start).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Start function must be selected.');
msg = gettext('Start function must be selected.');
this.errorModel.set('prsstart', msg);
return msg;
}
@ -162,7 +162,7 @@ define('pgadmin.node.fts_parser', [
else if (_.isUndefined(token) ||
_.isNull(token) ||
String(token).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Get next token function must be selected.');
msg = gettext('Get next token function must be selected.');
this.errorModel.set('prstoken', msg);
return msg;
}
@ -171,7 +171,7 @@ define('pgadmin.node.fts_parser', [
else if (_.isUndefined(end) ||
_.isNull(end) ||
String(end).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('End function must be selected.');
msg = gettext('End function must be selected.');
this.errorModel.set('prsend', msg);
return msg;
}
@ -180,7 +180,7 @@ define('pgadmin.node.fts_parser', [
else if (_.isUndefined(lextype) ||
_.isNull(lextype) ||
String(lextype).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Lextype function must be selected.');
msg = gettext('Lextype function must be selected.');
this.errorModel.set('prslextype', msg);
return msg;
}
@ -189,7 +189,7 @@ define('pgadmin.node.fts_parser', [
else if (_.isUndefined(schema) ||
_.isNull(schema) ||
String(schema).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Schema must be selected.');
msg = gettext('Schema must be selected.');
this.errorModel.set('schema', msg);
return msg;
}
@ -197,7 +197,7 @@ define('pgadmin.node.fts_parser', [
this.trigger('on-status-clear');
return null;
}
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -226,9 +226,9 @@ define('pgadmin.node.fts_parser', [
}
// by default we do not want to allow create menu
return true;
}
},
});
}
return pgBrowser.Nodes['coll-fts_parser'];
return pgBrowser.Nodes['coll-fts_parser'];
});

View File

@ -1,19 +1,18 @@
define('pgadmin.node.fts_template', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.browser.collection',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser) {
// Extend the collection class for fts template
if (!pgBrowser.Nodes['coll-fts_template']) {
var fts_templates = pgAdmin.Browser.Nodes['coll-fts_template'] =
pgAdmin.Browser.Nodes['coll-fts_template'] =
pgAdmin.Browser.Collection.extend({
node: 'fts_template',
label: gettext('FTS Templates'),
type: 'coll-fts_template',
columns: ['name', 'description']
columns: ['name', 'description'],
});
};
}
// Extend the node class for fts template
if (!pgBrowser.Nodes['fts_template']) {
@ -42,20 +41,20 @@ define('pgadmin.node.fts_template', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Template...'),
icon: 'wcTabIcon icon-fts_template', data: {action: 'create'},
enable: 'canCreate'
},{
enable: 'canCreate',
},{
name: 'create_fts_template_on_coll', node: 'coll-fts_template', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Template...'),
icon: 'wcTabIcon icon-fts_template', data: {action: 'create'},
enable: 'canCreate'
},{
enable: 'canCreate',
},{
name: 'create_fts_template', node: 'fts_template', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('FTS Template...'),
icon: 'wcTabIcon icon-fts_template', data: {action: 'create'},
enable: 'canCreate'
}]);
enable: 'canCreate',
}]);
},
@ -66,7 +65,7 @@ define('pgadmin.node.fts_template', [
description: undefined, // Comment on template
schema: undefined, // Schema name to which template belongs
tmplinit: undefined, // Init function for fts template
tmpllexize: undefined // Lexize function for fts template
tmpllexize: undefined, // Lexize function for fts template
},
initialize: function(attrs, args) {
var isNew = (_.size(attrs) === 0);
@ -78,29 +77,29 @@ define('pgadmin.node.fts_template', [
// Defining schema for fts template
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', cellHeaderClasses: 'width_percent_50'
type: 'text', cellHeaderClasses: 'width_percent_50',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
editable: false, type: 'text', disabled: true, mode:['properties']
editable: false, type: 'text', disabled: true, mode:['properties'],
},{
id: 'schema', label: gettext('Schema'), cell: 'string',
type: 'text', mode: ['create','edit'], node: 'schema',
control: 'node-list-by-id', cache_node: 'database',
cache_level: 'database'
cache_level: 'database',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', cellHeaderClasses: 'width_percent_50'
type: 'multiline', cellHeaderClasses: 'width_percent_50',
},{
id: 'tmplinit', label: gettext('Init function'),
group: gettext('Definition'), type: 'text', disabled: function(m) {
return !m.isNew();
}, control: 'node-ajax-options', url: 'get_init',
cache_level: 'database', cache_node: 'schema'
cache_level: 'database', cache_node: 'schema',
},{
id: 'tmpllexize', label: gettext('Lexize function'), group: gettext('Definition'),
type: 'text', disabled: function(m) { return !m.isNew(); },
control: 'node-ajax-options', url: 'get_lexize', cache_level: 'database',
cache_node: 'schema'
cache_node: 'schema',
}],
/*
@ -108,28 +107,29 @@ define('pgadmin.node.fts_template', [
* lexize function and schema, if any one of them is not specified
* while creating new fts template
*/
validate: function(keys){
var name = this.get('name');
var lexize = this.get('tmpllexize');
var schema = this.get('schema');
validate: function() {
var name = this.get('name'),
lexize = this.get('tmpllexize'),
schema = this.get('schema'),
msg;
// Validate fts template name
if (_.isUndefined(name) || _.isNull(name) || String(name).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Name must be specified.');
msg = gettext('Name must be specified.');
this.errorModel.set('name', msg);
return msg;
}
// Validate lexize function control
else if (_.isUndefined(lexize) || _.isNull(lexize) || String(lexize).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Lexize function must be selected.');
msg = gettext('Lexize function must be selected.');
this.errorModel.set('tmpllexize', msg);
return msg;
}
// Validate schema for fts template
else if (_.isUndefined(schema) || _.isNull(schema) || String(schema).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Schema must be selected.');
msg = gettext('Schema must be selected.');
this.errorModel.set('schema', msg);
return msg;
}
@ -137,7 +137,7 @@ define('pgadmin.node.fts_template', [
this.trigger('on-status-clear');
return null;
}
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -166,9 +166,9 @@ define('pgadmin.node.fts_template', [
}
// by default we do not want to allow create menu
return true;
}
},
});
}
return pgBrowser.Nodes['fts_template'];
return pgBrowser.Nodes['fts_template'];
});

View File

@ -1,20 +1,20 @@
/* Create and Register Function Collection and Node. */
define('pgadmin.node.function', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser, Backform) {
if (!pgBrowser.Nodes['coll-function']) {
var functions = pgBrowser.Nodes['coll-function'] =
pgBrowser.Nodes['coll-function'] =
pgBrowser.Collection.extend({
node: 'function',
label: gettext('Functions'),
type: 'coll-function',
columns: ['name', 'funcowner', 'description'],
hasStatistics: true
hasStatistics: true,
});
};
}
// Argument Model
var ArgumentModel = pgBrowser.Node.Model.extend({
@ -24,44 +24,44 @@ define('pgadmin.node.function', [
argtype: undefined,
argmode: undefined,
argname: undefined,
argdefval: undefined
argdefval: undefined,
},
schema: [{
id: 'argid', visible: false, type: 'text',
mode: ['properties', 'edit','create']
},{
id: 'argtype', label: gettext('Data Type'), cell:
mode: ['properties', 'edit','create'],
},{
id: 'argtype', label: gettext('Data Type'), cell:
'node-ajax-options', cellHeaderClasses: 'width_percent_30',
control: 'node-ajax-options', type: 'text', url: 'get_types',
editable: function(m) {
var node_info = this.get('node_info');
if(node_info && 'catalog' in node_info) {
return false;
}
return _.isUndefined(m.isNew) ? true : m.isNew();
}, first_empty: true
},{
id: 'argmode', label: gettext('Mode'), type: 'options',
control: 'node-ajax-options', cellHeaderClasses:'width_percent_20',
options:[
control: 'node-ajax-options', type: 'text', url: 'get_types',
editable: function(m) {
var node_info = this.get('node_info');
if(node_info && 'catalog' in node_info) {
return false;
}
return _.isUndefined(m.isNew) ? true : m.isNew();
}, first_empty: true,
},{
id: 'argmode', label: gettext('Mode'), type: 'options',
control: 'node-ajax-options', cellHeaderClasses:'width_percent_20',
options:[
{'label': 'IN', 'value': 'IN'},
{'label': 'OUT', 'value': 'OUT'},
{'label': 'INOUT', 'value': 'INOUT'},
{'label': 'VARIADIC', 'value': 'VARIADIC'}
], editable: function(m) {
var node_info = this.get('node_info');
if(node_info && 'catalog' in node_info) {
return false;
}
return _.isUndefined(m.isNew) ? true : m.isNew();
}
},{
id: 'argname', label: gettext('Argument Name'), type: 'text',
cell: 'string', editable: 'isInCatalog', cellHeaderClasses:'width_percent_30'
},{
id: 'argdefval', label: gettext('Default Value'), type: 'text',
cell: 'string', editable: 'isInCatalog', cellHeaderClasses:'width_percent_20'
}
{'label': 'VARIADIC', 'value': 'VARIADIC'},
], editable: function(m) {
var node_info = this.get('node_info');
if(node_info && 'catalog' in node_info) {
return false;
}
return _.isUndefined(m.isNew) ? true : m.isNew();
},
},{
id: 'argname', label: gettext('Argument Name'), type: 'text',
cell: 'string', editable: 'isInCatalog', cellHeaderClasses:'width_percent_30',
},{
id: 'argdefval', label: gettext('Default Value'), type: 'text',
cell: 'string', editable: 'isInCatalog', cellHeaderClasses:'width_percent_20',
},
],
toJSON: Backbone.Model.prototype.toJSON,
isInCatalog: function(m){
@ -79,7 +79,7 @@ define('pgadmin.node.function', [
return true;
},
validate: function() {
}
},
});
if (!pgBrowser.Nodes['function']) {
@ -95,10 +95,10 @@ define('pgadmin.node.function', [
hasStatistics: true,
hasScriptTypes: ['create', 'select'],
parent_type: ['schema', 'catalog'],
Init: function(args) {
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -107,20 +107,20 @@ define('pgadmin.node.function', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Function...'),
icon: 'wcTabIcon icon-function', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_function', node: 'function', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Function...'),
icon: 'wcTabIcon icon-function', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_function', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Function...'),
icon: 'wcTabIcon icon-function', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -171,58 +171,58 @@ define('pgadmin.node.function', [
seclabels: [],
acl: [],
sysfunc: undefined,
sysproc: undefined
sysproc: undefined,
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'funcowner', label: gettext('Owner'), cell: 'string',
control: Backform.NodeListByNameControl, node: 'role', type:
'text', disabled: 'isDisabled'
'text', disabled: 'isDisabled',
},{
id: 'pronamespace', label: gettext('Schema'), cell: 'string',
control: 'node-list-by-id', type: 'text', cache_level: 'database',
node: 'schema', disabled: 'isDisabled', mode: ['create', 'edit']
node: 'schema', disabled: 'isDisabled', mode: ['create', 'edit'],
},{
id: 'sysfunc', label: gettext('System function?'),
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible'
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible',
},{
id: 'sysproc', label: gettext('System procedure?'),
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible'
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', disabled: 'isDisabled'
type: 'multiline', disabled: 'isDisabled',
},{
id: 'pronargs', label: gettext('Argument count'), cell: 'string',
type: 'text', group: gettext('Definition'), mode: ['properties']
type: 'text', group: gettext('Definition'), mode: ['properties'],
},{
id: 'proargs', label: gettext('Arguments'), cell: 'string',
type: 'text', group: gettext('Definition'), mode: ['properties', 'edit'],
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'proargtypenames', label: gettext('Signature arguments'), cell:
'string', type: 'text', group: gettext('Definition'), mode: ['properties'],
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'prorettypename', label: gettext('Return type'), cell: 'string',
control: 'node-ajax-options', type: 'text', group: gettext('Definition'),
url: 'get_types', disabled: 'isDisabled', first_empty: true,
mode: ['create'], visible: 'isVisible'
mode: ['create'], visible: 'isVisible',
},{
id: 'prorettypename', label: gettext('Return type'), cell: 'string',
type: 'text', group: gettext('Definition'),
mode: ['properties', 'edit'], disabled: 'isDisabled', visible: 'isVisible'
mode: ['properties', 'edit'], disabled: 'isDisabled', visible: 'isVisible',
}, {
id: 'lanname', label: gettext('Language'), cell: 'string',
control: 'node-ajax-options', type: 'text', group: gettext('Definition'),
url: 'get_languages', disabled: 'isDisabled'
url: 'get_languages', disabled: 'isDisabled',
},{
id: 'prosrc', label: gettext('Code'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
@ -234,21 +234,21 @@ define('pgadmin.node.function', [
return false;
}
return true;
}, disabled: 'isDisabled'
}, disabled: 'isDisabled',
},{
id: 'probin', label: gettext('Object file'), cell: 'string',
type: 'text', group: gettext('Definition'), deps: ['lanname'], visible:
function(m) {
if (m.get('lanname') == 'c') { return true; }
return false;
}, disabled: 'isDisabled'
}, disabled: 'isDisabled',
},{
id: 'prosrc_c', label: gettext('Link symbol'), cell: 'string',
type: 'text', group: gettext('Definition'), deps: ['lanname'], visible:
function(m) {
if (m.get('lanname') == 'c') { return true; }
return false;
}, disabled: 'isDisabled'
}, disabled: 'isDisabled',
},{
id: 'provolatile', label: gettext('Volatility'), cell: 'string',
control: 'node-ajax-options', type: 'text', group: gettext('Options'),
@ -256,27 +256,27 @@ define('pgadmin.node.function', [
{'label': 'VOLATILE', 'value': 'v'},
{'label': 'STABLE', 'value': 's'},
{'label': 'IMMUTABLE', 'value': 'i'},
], disabled: 'isDisabled', select2: {allowClear: false}
], disabled: 'isDisabled', select2: {allowClear: false},
},{
id: 'proretset', label: gettext('Returns a set?'), type: 'switch',
disabled: 'isDisabled', group: gettext('Options'),
visible: 'isVisible'
visible: 'isVisible',
},{
id: 'proisstrict', label: gettext('Strict?'), type: 'switch',
group: gettext('Options'), disabled: 'isDisabled',
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},{
id: 'prosecdef', label: gettext('Security of definer?'),
group: gettext('Options'), type: 'switch',
disabled: 'isDisabled'
group: gettext('Options'), type: 'switch',
disabled: 'isDisabled',
},{
id: 'proiswindow', label: gettext('Window?'),
group: gettext('Options'), cell:'boolean', type: 'switch',
disabled: 'isDisabled', visible: 'isVisible'
group: gettext('Options'), cell:'boolean', type: 'switch',
disabled: 'isDisabled', visible: 'isVisible',
},{
id: 'proparallel', label: gettext('Parallel'), cell: 'string',
control: 'node-ajax-options', type: 'text', group: gettext('Options'),
@ -285,21 +285,21 @@ define('pgadmin.node.function', [
{'label': 'RESTRICTED', 'value': 'r'},
{'label': 'SAFE', 'value': 's'},
], disabled: 'isDisabled', min_version: 90600,
select2: {allowClear: false}
select2: {allowClear: false},
},{
id: 'procost', label: gettext('Estimated cost'), group: gettext('Options'),
cell:'string', type: 'text', disabled: 'isDisabled'
cell:'string', type: 'text', disabled: 'isDisabled',
},{
id: 'prorows', label: gettext('Estimated rows'), type: 'text',
deps: ['proretset'], visible: 'isVisible', disabled: 'isDisabled',
group: gettext('Options')
group: gettext('Options'),
},{
id: 'proleakproof', label: gettext('Leak proof?'),
group: gettext('Options'), cell:'boolean', type: 'switch', min_version: 90200,
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'proacl', label: gettext('Privileges'), type: 'text',
mode: ['properties'], group: gettext('Security')
mode: ['properties'], group: gettext('Security'),
},{
id: 'arguments', label: gettext('Arguments'), cell: 'string',
group: gettext('Arguments'), type: 'collection', canAdd: function(m){
@ -315,15 +315,15 @@ define('pgadmin.node.function', [
group: gettext('Parameters'), control: 'variable-collection',
model: pgBrowser.Node.VariableModel,
mode: ['edit', 'create'], canAdd: 'canVarAdd', canEdit: false,
canDelete: true, disabled: 'isDisabled'
canDelete: true, disabled: 'isDisabled',
}, pgBrowser.SecurityGroupSchema, {
id: 'acl', label: gettext('Privileges'), editable: false,
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['X']
privileges: ['X'],
}), uniqueCol : ['grantee', 'grantor'], type: 'collection',
group: 'security', mode: ['edit', 'create'], canAdd: true,
canDelete: true, control: 'unique-col-collection',
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'seclabels', label: gettext('Security Labels'), canAdd: true,
model: pgBrowser.SecLabelModel, type: 'collection',
@ -331,15 +331,15 @@ define('pgadmin.node.function', [
canEdit: false, canDelete: true, uniqueCol : ['provider'],
disabled: 'isDisabled', control: 'unique-col-collection',
visible: function() {
return this.node && this.node.type != "procedure";
}
}
return this.node && this.node.type != 'procedure';
},
},
],
validate: function()
{
var err = {},
errmsg,
seclabels = this.get('seclabels');
errmsg,
seclabels = this.get('seclabels');
if (_.isUndefined(this.get('name')) || String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
err['name'] = gettext('Name cannot be empty.');
@ -405,43 +405,36 @@ define('pgadmin.node.function', [
return null;
},
isVisible: function(m){
isVisible: function() {
if (this.name == 'sysproc') { return false; }
return true;
},
isDisabled: function(m){
if(this.node_info && 'catalog' in this.node_info) {
isDisabled: function(m) {
if(this.node_info && 'catalog' in this.node_info) {
return true;
}
name = this.name;
switch(name){
case 'proargs':
case 'proargtypenames':
case 'prorettypename':
case 'proretset':
case 'proiswindow':
return !m.isNew();
break;
case 'prorows':
if(m.get('proretset') == true) {
return false;
}
else {
return true;
}
break;
default:
switch(this.name){
case 'proargs':
case 'proargtypenames':
case 'prorettypename':
case 'proretset':
case 'proiswindow':
return !m.isNew();
case 'prorows':
if(m.get('proretset') == true) {
return false;
break;
}
return true;
default:
return false;
}
return false;
},
canVarAdd: function(m) {
canVarAdd: function() {
if(this.node_info && 'catalog' in this.node_info) {
return false;
}
return true;
}
return true;
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -470,8 +463,8 @@ define('pgadmin.node.function', [
}
// by default we do not want to allow create menu
return true;
}
});
},
});
}

View File

@ -3,19 +3,19 @@ define('pgadmin.node.procedure', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.node.function', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Function) {
if (!pgBrowser.Nodes['coll-procedure']) {
var procedures = pgAdmin.Browser.Nodes['coll-procedure'] =
pgAdmin.Browser.Nodes['coll-procedure'] =
pgAdmin.Browser.Collection.extend({
node: 'procedure',
label: gettext('Procedures'),
type: 'coll-procedure',
columns: ['name', 'funcowner', 'description'],
hasStatistics: true
hasStatistics: true,
});
};
}
var pgSchemaNode = pgBrowser.Nodes['schema'];
@ -36,7 +36,7 @@ define('pgadmin.node.procedure', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.proc_initialized)
return;
return;
this.proc_initialized = true;
@ -46,25 +46,25 @@ define('pgadmin.node.procedure', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Procedure...'),
icon: 'wcTabIcon icon-procedure', data: {action: 'create', check:
false}, enable: 'canCreateProc'
false}, enable: 'canCreateProc',
},{
name: 'create_procedure', node: 'procedure', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Procedure...'),
icon: 'wcTabIcon icon-procedure', data: {action: 'create', check:
true}, enable: 'canCreateProc'
true}, enable: 'canCreateProc',
},{
name: 'create_procedure', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Procedure...'),
icon: 'wcTabIcon icon-procedure', data: {action: 'create', check:
true}, enable: 'canCreateProc'
}
true}, enable: 'canCreateProc',
},
]);
},
canDrop: pgSchemaNode.canChildDrop,
canDropCascade: false,
canCreateProc: function(itemData, item, data) {
canCreateProc: function(itemData, item) {
var node_hierarchy = this.getTreeNodeHierarchy.apply(this, [item]);
// Do not provide Create option in catalog
@ -72,28 +72,28 @@ define('pgadmin.node.procedure', [
return false;
// Procedures supported only in PPAS
if ('server' in node_hierarchy && node_hierarchy['server'].server_type == "ppas")
return true;
return false;
return (
'server' in node_hierarchy &&
node_hierarchy['server'].server_type == 'ppas'
);
},
model: Function.model.extend({
defaults: _.extend({},
Function.model.prototype.defaults,
{
lanname: 'edbspl'
lanname: 'edbspl',
}
),
canVarAdd: function(m){
canVarAdd: function() {
var server = this.node_info.server;
if (server.version < 90500) {
return false;
}
else {
return true;
}
if (server.version < 90500) {
return false;
}
else {
return true;
}
},
isVisible: function(m){
isVisible: function() {
if (this.name == 'sysfunc') { return false; }
else if (this.name == 'sysproc') { return true; }
return false;
@ -102,46 +102,30 @@ define('pgadmin.node.procedure', [
if(this.node_info && 'catalog' in this.node_info) {
return true;
}
name = this.name;
switch(name){
case 'provolatility':
case 'proisstrict':
case 'prosecdef':
case 'procost':
case 'proleakproof':
case 'variables':
var server = this.node_info.server;
if (server.version < 90500) {
return true;
}
else {
return false;
}
break;
case 'prorows':
var server = this.node_info.server;
if(server.version >= 90500 && m.get('proretset') == true) {
return false;
}
else {
return true;
}
break;
case 'funcowner':
case 'lanname':
case 'proargs':
return true;
default:
return false;
break;
switch(this.name){
case 'provolatility':
case 'proisstrict':
case 'prosecdef':
case 'procost':
case 'proleakproof':
case 'variables':
return this.node_info.server.version < 90500;
case 'prorows':
var server = this.node_info.server;
return !(server.version >= 90500 && m.get('proretset') == true);
case 'funcowner':
case 'lanname':
case 'proargs':
return true;
default:
return false;
}
return false;
},
validate: function()
},
validate: function()
{
var err = {},
errmsg,
seclabels = this.get('seclabels');
errmsg,
seclabels = this.get('seclabels');
if (_.isUndefined(this.get('name')) || String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
err['name'] = gettext('Name cannot be empty.');
@ -179,8 +163,8 @@ define('pgadmin.node.procedure', [
return null;
},
})
});
}),
});
}

View File

@ -1,20 +1,20 @@
/* Create and Register Function Collection and Node. */
define('pgadmin.node.trigger_function', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
if (!pgBrowser.Nodes['coll-trigger_function']) {
var trigger_functions = pgBrowser.Nodes['coll-trigger_function'] =
pgBrowser.Nodes['coll-trigger_function'] =
pgBrowser.Collection.extend({
node: 'trigger_function',
label: gettext('Trigger functions'),
type: 'coll-trigger_function',
columns: ['name', 'funcowner', 'description'],
hasStatistics: true
hasStatistics: true,
});
};
}
if (!pgBrowser.Nodes['trigger_function']) {
pgBrowser.Nodes['trigger_function'] = pgBrowser.Node.extend({
@ -28,10 +28,10 @@ define('pgadmin.node.trigger_function', [
hasDepends: true,
hasStatistics: true,
parent_type: ['schema', 'catalog'],
Init: function(args) {
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -40,20 +40,20 @@ define('pgadmin.node.trigger_function', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger function...'),
icon: 'wcTabIcon icon-trigger_function', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_trigger_function', node: 'trigger_function', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger function...'),
icon: 'wcTabIcon icon-trigger_function', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_trigger_function', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger function...'),
icon: 'wcTabIcon icon-trigger_function', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -64,7 +64,7 @@ define('pgadmin.node.trigger_function', [
var isNew = (_.size(attrs) === 0);
if (isNew) {
// Set Selected Schema
var schema_id = args.node_info.schema._id
var schema_id = args.node_info.schema._id;
this.set({'pronamespace': schema_id}, {silent: true});
// Set Current User
@ -103,64 +103,67 @@ define('pgadmin.node.trigger_function', [
seclabels: [],
acl: [],
sysfunc: undefined,
sysproc: undefined
sysproc: undefined,
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'funcowner', label: gettext('Owner'), cell: 'string',
control: Backform.NodeListByNameControl, node: 'role', type:
'text', disabled: 'isDisabled'
'text', disabled: 'isDisabled',
},{
id: 'pronamespace', label: gettext('Schema'), cell: 'string',
control: 'node-list-by-id', type: 'text', cache_level: 'database',
node: 'schema', disabled: 'isDisabled', mode: ['create', 'edit']
node: 'schema', disabled: 'isDisabled', mode: ['create', 'edit'],
},{
id: 'sysfunc', label: gettext('System function?'),
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible'
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible',
},{
id: 'sysproc', label: gettext('System procedure?'),
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible'
cell:'boolean', type: 'switch',
mode: ['properties'], visible: 'isVisible',
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', disabled: 'isDisabled'
type: 'multiline', disabled: 'isDisabled',
},{
id: 'pronargs', label: gettext('Argument count'), cell: 'string',
type: 'text', group: gettext('Definition'), mode: ['properties']
type: 'text', group: gettext('Definition'), mode: ['properties'],
},{
id: 'proargs', label: gettext('Arguments'), cell: 'string',
type: 'text', group: gettext('Definition'), mode: ['properties', 'edit'],
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'proargtypenames', label: gettext('Signature arguments'), cell:
'string', type: 'text', group: gettext('Definition'), mode: ['properties'],
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'prorettypename', label: gettext('Return type'), cell: 'string',
control: 'select2', type: 'text', group: gettext('Definition'),
disabled: 'isDisabled', first_empty: true,
select2: { width: "100%", allowClear: false },
select2: { width: '100%', allowClear: false },
mode: ['create'], visible: 'isVisible', options: [
{label: gettext('trigger'), value: 'trigger'},
{label: gettext('event_trigger'), value: 'event_trigger'}
]
{label: gettext('event_trigger'), value: 'event_trigger'},
],
},{
id: 'prorettypename', label: gettext('Return type'), cell: 'string',
type: 'text', group: gettext('Definition'),
mode: ['properties', 'edit'], disabled: 'isDisabled', visible: 'isVisible'
mode: ['properties', 'edit'], disabled: 'isDisabled', visible: 'isVisible',
}, {
id: 'lanname', label: gettext('Language'), cell: 'string',
control: 'node-ajax-options', type: 'text', group: gettext('Definition'),
url: 'get_languages', disabled: 'isDisabled', transform: function(d, self) {
return _.reject(d, function(o){ return o.label == 'sql' || o.label == 'edbspl'; });
}, select2: { allowClear: false }
url: 'get_languages', disabled: 'isDisabled',
transform: function(d) {
return _.reject(d, function(o) {
return o.label == 'sql' || o.label == 'edbspl';
});
}, select2: { allowClear: false },
},{
id: 'prosrc', label: gettext('Code'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
@ -172,21 +175,21 @@ define('pgadmin.node.trigger_function', [
return false;
}
return true;
}, disabled: 'isDisabled'
}, disabled: 'isDisabled',
},{
id: 'probin', label: gettext('Object file'), cell: 'string',
type: 'text', group: gettext('Definition'), deps: ['lanname'], visible:
function(m) {
if (m.get('lanname') == 'c') { return true; }
return false;
}, disabled: 'isDisabled'
}, disabled: 'isDisabled',
},{
id: 'prosrc_c', label: gettext('Link symbol'), cell: 'string',
type: 'text', group: gettext('Definition'), deps: ['lanname'], visible:
function(m) {
if (m.get('lanname') == 'c') { return true; }
return false;
}, disabled: 'isDisabled'
}, disabled: 'isDisabled',
},{
id: 'provolatile', label: gettext('Volatility'), cell: 'string',
control: 'node-ajax-options', type: 'text', group: gettext('Options'),
@ -194,67 +197,67 @@ define('pgadmin.node.trigger_function', [
{'label': 'VOLATILE', 'value': 'v'},
{'label': 'STABLE', 'value': 's'},
{'label': 'IMMUTABLE', 'value': 'i'},
], disabled: 'isDisabled', select2: { allowClear: false }
], disabled: 'isDisabled', select2: { allowClear: false },
},{
id: 'proretset', label: gettext('Returns a set?'), type: 'switch',
group: gettext('Options'), disabled: 'isDisabled',
visible: 'isVisible'
visible: 'isVisible',
},{
id: 'proisstrict', label: gettext('Strict?'), type: 'switch',
disabled: 'isDisabled', group: gettext('Options'),
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},{
id: 'prosecdef', label: gettext('Security of definer?'),
group: gettext('Options'), cell:'boolean', type: 'switch',
disabled: 'isDisabled'
group: gettext('Options'), cell:'boolean', type: 'switch',
disabled: 'isDisabled',
},{
id: 'proiswindow', label: gettext('Window?'),
group: gettext('Options'), cell:'boolean', type: 'switch',
disabled: 'isDisabled', visible: 'isVisible'
group: gettext('Options'), cell:'boolean', type: 'switch',
disabled: 'isDisabled', visible: 'isVisible',
},{
id: 'procost', label: gettext('Estimated cost'), type: 'text',
group: gettext('Options'), disabled: 'isDisabled'
group: gettext('Options'), disabled: 'isDisabled',
},{
id: 'prorows', label: gettext('Estimated rows'), type: 'text',
group: gettext('Options'),
disabled: 'isDisabled',
deps: ['proretset'], visible: 'isVisible'
deps: ['proretset'], visible: 'isVisible',
},{
id: 'proleakproof', label: gettext('Leak proof?'),
group: gettext('Options'), cell:'boolean', type: 'switch', min_version: 90200,
disabled: 'isDisabled'
disabled: 'isDisabled',
}, pgBrowser.SecurityGroupSchema, {
id: 'proacl', label: gettext('Privileges'), mode: ['properties'],
group: gettext('Security'), type: 'text'
group: gettext('Security'), type: 'text',
},{
id: 'variables', label: gettext('Parameters'), type: 'collection',
group: gettext('Parameters'), control: 'variable-collection',
model: pgBrowser.Node.VariableModel,
mode: ['edit', 'create'], canAdd: 'canVarAdd', canEdit: false,
canDelete: true, disabled: 'isDisabled'
},{
canDelete: true, disabled: 'isDisabled',
},{
id: 'acl', label: gettext('Privileges'), editable: false,
type: 'collection', group: 'security', mode: ['edit', 'create'],
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['X']
privileges: ['X'],
}), uniqueCol : ['grantee', 'grantor'], disabled: 'isDisabled',
canAdd: true, canDelete: true, control: 'unique-col-collection'
canAdd: true, canDelete: true, control: 'unique-col-collection',
},{
id: 'seclabels', label: gettext('Security Labels'), canEdit: true,
model: pgBrowser.SecLabelModel, type: 'collection',
min_version: 90100, group: 'security', mode: ['edit', 'create'],
canDelete: true, control: 'unique-col-collection', canAdd: true,
uniqueCol : ['provider'], disabled: 'isDisabled'
canDelete: true, control: 'unique-col-collection', canAdd: true,
uniqueCol : ['provider'], disabled: 'isDisabled',
}],
validate: function(keys)
{
var err = {},
errmsg,
seclabels = this.get('seclabels');
errmsg,
seclabels = this.get('seclabels');
// Nothing to validate
if(keys && keys.length == 0) {
@ -326,43 +329,33 @@ define('pgadmin.node.trigger_function', [
return null;
},
isVisible: function(m){
isVisible: function() {
if (this.name == 'sysproc') { return false; }
return true;
},
isDisabled: function(m){
isDisabled: function(m) {
if(this.node_info && 'catalog' in this.node_info) {
return true;
}
name = this.name;
switch(name){
case 'proargs':
case 'proargtypenames':
case 'prorettypename':
case 'proretset':
case 'proiswindow':
return !m.isNew();
break;
case 'prorows':
if(m.get('proretset') == true) {
return false;
}
else {
return true;
}
break;
default:
switch(this.name){
case 'proargs':
case 'proargtypenames':
case 'prorettypename':
case 'proretset':
case 'proiswindow':
return !m.isNew();
case 'prorows':
if(m.get('proretset') == true) {
return false;
break;
}
return false;
},
canVarAdd: function(m) {
if(this.node_info && 'catalog' in this.node_info) {
}
return true;
default:
return false;
}
return true;
}
},
canVarAdd: function() {
return !(this.node_info && 'catalog' in this.node_info);
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
@ -391,8 +384,8 @@ define('pgadmin.node.trigger_function', [
}
// by default we do not want to allow create menu
return true;
}
});
},
});
}

View File

@ -1,9 +1,9 @@
/* Create and Register Function Collection and Node. */
define('pgadmin.node.edbfunc', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
if (!pgBrowser.Nodes['coll-edbfunc']) {
pgBrowser.Nodes['coll-edbfunc'] =
@ -11,9 +11,9 @@ define('pgadmin.node.edbfunc', [
node: 'edbfunc',
label: gettext('Functions'),
type: 'coll-edbfunc',
columns: ['name', 'funcowner', 'description']
columns: ['name', 'funcowner', 'description'],
});
};
}
if (!pgBrowser.Nodes['edbfunc']) {
pgBrowser.Nodes['edbfunc'] = pgBrowser.Node.extend({
@ -26,10 +26,10 @@ define('pgadmin.node.edbfunc', [
hasSQL: true,
hasScriptTypes: [],
parent_type: ['package'],
Init: function(args) {
Init: function() {
/* Avoid multiple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -48,40 +48,40 @@ define('pgadmin.node.edbfunc', [
lanname: 'sql', /* Language Name in which function is being written */
prosrc: undefined,
proacl: undefined,
visibility: 'Unknown'
visibility: 'Unknown',
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties'],
disabled: true
disabled: true,
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'funcowner', label: gettext('Owner'), cell: 'string',
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'pronargs', label: gettext('Argument count'), cell: 'string',
type: 'text', group: gettext('Definition'), mode: ['properties']
type: 'text', group: gettext('Definition'), mode: ['properties'],
},{
id: 'proargs', label: gettext('Arguments'), cell: 'string',
type: 'text', group: gettext('Definition'), mode: ['properties'],
disabled: true
disabled: true,
},{
id: 'proargtypenames', label: gettext('Signature arguments'), cell:
'string', type: 'text', group: gettext('Definition'), mode: ['properties'],
disabled: true
disabled: true,
},{
id: 'prorettypename', label: gettext('Return type'), cell: 'string',
type: 'text', group: gettext('Definition'), disabled: true,
mode: ['properties'], visible: 'isVisible'
mode: ['properties'], visible: 'isVisible',
},{
id: 'visibility', label: gettext('Visibility'), cell: 'string',
type: 'text', mode: ['properties'],
disabled: true
disabled: true,
},{
id: 'lanname', label: gettext('Language'), cell: 'string',
type: 'text', group: gettext('Definition'), disabled: true
type: 'text', group: gettext('Definition'), disabled: true,
},{
id: 'prosrc', label: gettext('Code'), cell: 'string',
type: 'text', mode: ['properties'],
@ -93,18 +93,15 @@ define('pgadmin.node.edbfunc', [
return false;
}
return true;
}, disabled: true
}, disabled: true,
}],
validate: function()
{
return null;
},
isVisible: function(m){
validate: function() { return null; },
isVisible: function() {
if (this.name == 'sysproc') { return false; }
return true;
}
})
});
},
}),
});
}

View File

@ -1,11 +1,11 @@
/* Create and Register Procedure Collection and Node. */
define('pgadmin.node.edbproc', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'sources/pgadmin', 'pgadmin.browser',
'pgadmin.node.edbfunc', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
'pgadmin.browser.server.privilege',
], function(
gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, EdbFunction
gettext, url_for, $, _, pgAdmin, pgBrowser, EdbFunction
) {
if (!pgBrowser.Nodes['coll-edbproc']) {
@ -15,9 +15,9 @@ define('pgadmin.node.edbproc', [
label: gettext('Procedures'),
type: 'coll-edbproc',
columns: ['name', 'funcowner', 'description'],
hasStatistics: true
hasStatistics: true,
});
};
}
// Inherit Functions Node
if (!pgBrowser.Nodes['edbproc']) {
@ -34,7 +34,7 @@ define('pgadmin.node.edbproc', [
Init: function() {
/* Avoid multiple registration of menus */
if (this.proc_initialized)
return;
return;
this.proc_initialized = true;
@ -45,10 +45,10 @@ define('pgadmin.node.edbproc', [
defaults: _.extend({},
EdbFunction.model.prototype.defaults,
{
lanname: 'edbspl'
lanname: 'edbspl',
}
),
isVisible: function(m){
isVisible: function() {
if (this.name == 'sysfunc') { return false; }
else if (this.name == 'sysproc') { return true; }
return false;
@ -56,10 +56,10 @@ define('pgadmin.node.edbproc', [
validate: function()
{
return null;
}
},
}
)
});
),
});
}

View File

@ -1,9 +1,9 @@
/* Create and Register Function Collection and Node. */
define('pgadmin.node.edbvar', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser) {
if (!pgBrowser.Nodes['coll-edbvar']) {
pgBrowser.Nodes['coll-edbvar'] =
@ -11,9 +11,9 @@ define('pgadmin.node.edbvar', [
node: 'edbvar',
label: gettext('Variables'),
type: 'coll-edbvar',
columns: ['name', 'funcowner', 'description']
columns: ['name', 'funcowner', 'description'],
});
};
}
if (!pgBrowser.Nodes['edbvar']) {
pgBrowser.Nodes['edbvar'] = pgBrowser.Node.extend({
@ -25,10 +25,10 @@ define('pgadmin.node.edbvar', [
hasSQL: true,
hasScriptTypes: [],
parent_type: ['package'],
Init: function(args) {
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -40,29 +40,29 @@ define('pgadmin.node.edbvar', [
name: undefined,
oid: undefined,
datatype: undefined,
visibility: 'Unknown'
visibility: 'Unknown',
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties'],
disabled: true
disabled: true,
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'datatype', label: gettext('Data type'), cell: 'string',
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'visibility', label: gettext('Visibility'), cell: 'string',
type: 'text', mode: ['properties'],
disabled: true
disabled: true,
}],
validate: function()
{
return null;
}
})
});
},
}),
});
}

View File

@ -1,19 +1,19 @@
define('pgadmin.node.package', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
// Extend the browser's collection class for package collection
if (!pgBrowser.Nodes['coll-package']) {
var databases = pgBrowser.Nodes['coll-package'] =
pgBrowser.Nodes['coll-package'] =
pgBrowser.Collection.extend({
node: 'package',
label: gettext('Packages'),
type: 'coll-package',
columns: ['name' ,'owner', 'description']
columns: ['name' ,'owner', 'description'],
});
};
}
// Extend the browser's node class for package node
if (!pgBrowser.Nodes['package']) {
@ -28,7 +28,7 @@ define('pgadmin.node.package', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -37,20 +37,20 @@ define('pgadmin.node.package', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Package...'),
icon: 'wcTabIcon icon-package', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_package', node: 'package', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Package...'),
icon: 'wcTabIcon icon-package', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_package', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Package...'),
icon: 'wcTabIcon icon-package', data: {action: 'create', check: true},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -58,21 +58,21 @@ define('pgadmin.node.package', [
canDropCascade: pgBrowser.Nodes['schema'].canChildDrop,
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
if (data && data.check == false)
return true;
if (data && data.check == false)
return true;
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
if (server && server.server_type === 'pg')
return false;
if (server && server.server_type === 'pg')
return false;
// If it is catalog then don't allow user to create package
if (treeData['catalog'] != undefined)
return false;
if (treeData['catalog'] != undefined)
return false;
// by default we want to allow create menu
return true;
return true;
},
// Define the model for package node.
model: pgBrowser.Node.Model.extend({
@ -85,7 +85,7 @@ define('pgadmin.node.package', [
pkgheadsrc: undefined,
pkgbodysrc: undefined,
acl: undefined,
pkgacl: []
pkgacl: [],
},
initialize: function(attrs, args) {
if (_.size(attrs) === 0) {
@ -93,7 +93,7 @@ define('pgadmin.node.package', [
var schemaInfo = args.node_info.schema;
this.set({
'owner': userInfo.name, 'schema': schemaInfo._label
'owner': userInfo.name, 'schema': schemaInfo._label,
}, {silent: true});
}
pgAdmin.Browser.Node.Model.prototype.initialize.apply(this, arguments);
@ -104,16 +104,16 @@ define('pgadmin.node.package', [
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: function(m) {
return !m.isNew();
}
},
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', mode: ['properties']
type: 'text', mode: ['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: true, editable: false, visible: function(m) {
return !m.isNew();
}
},
},{
id: 'schema', label: gettext('Schema'), type: 'text', node: 'schema',
control: 'node-list-by-name',
@ -124,28 +124,28 @@ define('pgadmin.node.package', [
return false;
}
return true;
}, cache_node: 'database', cache_level: 'database'
}, cache_node: 'database', cache_level: 'database',
},{
id: 'is_sys_object', label: gettext('System package?'),
cell:'boolean', type: 'switch',mode: ['properties']
cell:'boolean', type: 'switch',mode: ['properties'],
},{
id: 'description', label: gettext('Comment'), type: 'multiline',
mode: ['properties', 'create', 'edit']
mode: ['properties', 'create', 'edit'],
},{
id: 'pkgheadsrc', label: gettext('Header'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'], group: gettext('Code'),
control: Backform.SqlFieldControl
control: Backform.SqlFieldControl,
},{
id: 'pkgbodysrc', label: gettext('Body'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'], group: gettext('Code'),
control: Backform.SqlFieldControl
control: Backform.SqlFieldControl,
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties',]
group: gettext('Security'), mode: ['properties'],
},{
id: 'pkgacl', label: gettext('Privileges'), type: 'collection',
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['X']
privileges: ['X'],
}), uniqueCol : ['grantee', 'grantor'], editable: false,
group: gettext('Security'), mode: ['edit', 'create'],
canAdd: true, canDelete: true, control: 'unique-col-collection',
@ -174,8 +174,8 @@ define('pgadmin.node.package', [
}
return null;
}
})
},
}),
});
}

View File

@ -1,20 +1,20 @@
define('pgadmin.node.sequence', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
// Extend the browser's collection class for sequence collection
if (!pgBrowser.Nodes['coll-sequence']) {
var databases = pgBrowser.Nodes['coll-sequence'] =
pgBrowser.Nodes['coll-sequence'] =
pgBrowser.Collection.extend({
node: 'sequence',
label: gettext('Sequences'),
type: 'coll-sequence',
columns: ['name', 'seqowner', 'comment'],
hasStatistics: true
hasStatistics: true,
});
};
}
// Extend the browser's node class for sequence node
if (!pgBrowser.Nodes['sequence']) {
@ -32,7 +32,7 @@ define('pgadmin.node.sequence', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -41,20 +41,20 @@ define('pgadmin.node.sequence', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Sequence...'),
icon: 'wcTabIcon icon-sequence', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_sequence', node: 'sequence', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Sequence...'),
icon: 'wcTabIcon icon-sequence', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_sequence', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Sequence...'),
icon: 'wcTabIcon icon-sequence', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -62,31 +62,31 @@ define('pgadmin.node.sequence', [
canDropCascade: pgBrowser.Nodes['schema'].canChildDrop,
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
if (data && data.check == false)
if (data && data.check == false)
return true;
var t = pgBrowser.tree, i = item, d = itemData;
// To iterate over tree to check parent node
while (i) {
// If it is schema then allow user to create collation
if (_.indexOf(['schema'], d._type) > -1)
return true;
var t = pgBrowser.tree, i = item, d = itemData;
// To iterate over tree to check parent node
while (i) {
// If it is schema then allow user to create collation
if (_.indexOf(['schema'], d._type) > -1)
return true;
if ('coll-sequence' == d._type) {
if ('coll-sequence' == d._type) {
//Check if we are not child of catalog
var prev_i = t.hasParent(i) ? t.parent(i) : null,
prev_d = prev_i ? t.itemData(prev_i) : null;
if( prev_d._type == 'catalog') {
return false;
} else {
return true;
}
var prev_i = t.hasParent(i) ? t.parent(i) : null,
prev_d = prev_i ? t.itemData(prev_i) : null;
if( prev_d._type == 'catalog') {
return false;
} else {
return true;
}
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// by default we want to allow create menu
return true;
return true;
},
// Define the model for sequence node.
model: pgBrowser.Node.Model.extend({
@ -104,7 +104,7 @@ define('pgadmin.node.sequence', [
cache: undefined,
cycled: undefined,
relacl: [],
securities: []
securities: [],
},
// Default values!
@ -124,14 +124,14 @@ define('pgadmin.node.sequence', [
// Define the schema for sequence node.
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit']
type: 'text', mode: ['properties', 'create', 'edit'],
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', mode: ['properties']
type: 'text', mode: ['properties'],
},{
id: 'seqowner', label: gettext('Owner'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'], node: 'role',
control: Backform.NodeListByNameControl
control: Backform.NodeListByNameControl,
},{
id: 'schema', label: gettext('Schema'), cell: 'string',
control: 'node-list-by-name', node: 'schema',
@ -142,48 +142,48 @@ define('pgadmin.node.sequence', [
return false;
}
return true;
}, cache_node: 'database', cache_level: 'database'
}, cache_node: 'database', cache_level: 'database',
},{
id: 'comment', label: gettext('Comment'), type: 'multiline',
mode: ['properties', 'create', 'edit']
mode: ['properties', 'create', 'edit'],
},{
id: 'current_value', label: gettext('Current value'), type: 'int',
mode: ['properties', 'edit'], group: gettext('Definition')
mode: ['properties', 'edit'], group: gettext('Definition'),
},{
id: 'increment', label: gettext('Increment'), type: 'int',
mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
min: 1
min: 1,
},{
id: 'start', label: gettext('Start'), type: 'int',
mode: ['properties', 'create'], group: gettext('Definition'),
disabled: function(m) {
return !m.isNew();
}
},
},{
id: 'minimum', label: gettext('Minimum'), type: 'int',
mode: ['properties', 'create', 'edit'], group: gettext('Definition')
mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
},{
id: 'maximum', label: gettext('Maximum'), type: 'int',
mode: ['properties', 'create', 'edit'], group: gettext('Definition')
mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
},{
id: 'cache', label: gettext('Cache'), type: 'int',
mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
min: 1
min: 1,
},{
id: 'cycled', label: gettext('Cycled'), type: 'switch',
mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
}, pgBrowser.SecurityGroupSchema,{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'relacl', label: gettext('Privileges'), group: 'security',
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['r', 'w', 'U']
privileges: ['r', 'w', 'U'],
}), uniqueCol : ['grantee', 'grantor'], mode: ['edit', 'create'],
editable: false, type: 'collection', canAdd: true, canDelete: true,
control: 'unique-col-collection',
@ -193,7 +193,7 @@ define('pgadmin.node.sequence', [
type: 'collection', canEdit: false, group: 'security',
mode: ['edit', 'create'], canDelete: true,
control: 'unique-col-collection',
min_version: 90200, uniqueCol : ['provider']
min_version: 90200, uniqueCol : ['provider'],
}],
/* validate function is used to validate the input given by
* the user. In case of error, message will be displayed on
@ -201,9 +201,9 @@ define('pgadmin.node.sequence', [
*/
validate: function() {
var msg = undefined,
minimum = this.get('minimum'),
maximum = this.get('maximum'),
start = this.get('start');
minimum = this.get('minimum'),
maximum = this.get('maximum'),
start = this.get('start');
if (_.isUndefined(this.get('name'))
|| String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
@ -279,8 +279,8 @@ define('pgadmin.node.sequence', [
}
}
var min_lt = gettext('Minimum value must be less than maximum value.'),
start_lt = gettext('Start value cannot be less than minimum value.'),
start_gt = gettext('Start value cannot be greater than maximum value.');
start_lt = gettext('Start value cannot be less than minimum value.'),
start_gt = gettext('Start value cannot be greater than maximum value.');
if ((minimum == 0 && maximum == 0) ||
(parseInt(minimum, 10) >= parseInt(maximum, 10))) {
@ -304,8 +304,8 @@ define('pgadmin.node.sequence', [
this.errorModel.unset('start');
}
return null;
}
})
},
}),
});
}

View File

@ -1,18 +1,18 @@
define('pgadmin.node.catalog', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'backform', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin',
'pgadmin.browser', 'pgadmin.browser.collection',
], function(gettext, $, _, pgAdmin, pgBrowser) {
// Extend the browser's collection class for catalog collection
if (!pgBrowser.Nodes['coll-catalog']) {
var databases = pgBrowser.Nodes['coll-catalog'] =
pgBrowser.Nodes['coll-catalog'] =
pgBrowser.Collection.extend({
node: 'catalog',
label: gettext('Catalogs'),
type: 'coll-catalog',
columns: ['name', 'namespaceowner', 'description']
columns: ['name', 'namespaceowner', 'description'],
});
};
}
// Extend the browser's node class for catalog node
if (!pgBrowser.Nodes['catalog']) {
pgBrowser.Nodes['catalog'] = pgBrowser.Node.extend({
@ -24,7 +24,7 @@ define('pgadmin.node.catalog', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -35,7 +35,7 @@ define('pgadmin.node.catalog', [
namespaceowner: undefined,
nspacl: undefined,
description: undefined,
securitylabel: []
securitylabel: [],
},
initialize: function(attrs, args) {
var isNew = (_.size(attrs) === 0);
@ -49,32 +49,32 @@ define('pgadmin.node.catalog', [
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'oid', label: gettext('OID'), cell: 'string', mode: ['properties'],
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'namespaceowner', label: gettext('Owner'), cell: 'string',
type: 'text', disabled: true
type: 'text', disabled: true,
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
},{
type: 'multiline',
},{
id: 'seclabels', label: gettext('Security Labels'),
model: pgBrowser.SecLabelModel, editable: false, type: 'collection',
group: gettext('Security'), mode: ['edit', 'create'],
min_version: 90200, canAdd: true,
canEdit: false, canDelete: true, control: 'unique-col-collection'
}
canEdit: false, canDelete: true, control: 'unique-col-collection',
},
],
validate: function() {
return null;
}
})
});
},
}),
});
}

View File

@ -1,119 +1,112 @@
define('pgadmin.node.schema', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'backform', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, Backgrid) {
// VacuumSettings Collection to display all settings parameters as Grid
var VacuumCollectionControl = Backform.VacuumCollectionControl =
Backform.VacuumCollectionControl =
Backform.Control.extend({
grid_columns:undefined,
grid_columns:undefined,
initialize: function() {
Backform.Control.prototype.initialize.apply(this, arguments);
var self = this,
initialize: function() {
Backform.Control.prototype.initialize.apply(this, arguments);
var self = this,
m = this.model,
url = self.field.get('url');
if (url && m.isNew()) {
var node = self.field.get('node'),
if (url && m.isNew()) {
var node = self.field.get('node'),
node_data = self.field.get('node_data'),
node_info = self.field.get('node_info'),
full_url = node.generate_url.apply(
node, [
null, url, node_data, false, node_info
null, url, node_data, false, node_info,
]),
data;
m.trigger('pgadmin-view:fetching', m, self.field);
m.trigger('pgadmin-view:fetching', m, self.field);
// fetch default values for autovacuum fields
$.ajax({
async: false,
url: full_url,
success: function (res) {
data = res;
},
error: function() {
m.trigger('pgadmin-view:fetch:error', m, self.field);
}
});
m.trigger('pgadmin-view:fetched', m, self.field);
$.ajax({
async: false,
url: full_url,
success: function (res) {
data = res;
},
error: function() {
m.trigger('pgadmin-view:fetch:error', m, self.field);
},
});
m.trigger('pgadmin-view:fetched', m, self.field);
// Add fetched models into collection
if (data && _.isArray(data)) {
m.get(self.field.get('name')).reset(data, {silent: true});
if (data && _.isArray(data)) {
m.get(self.field.get('name')).reset(data, {silent: true});
}
}
}
},
},
render: function() {
var self = this,
m = this.model,
render: function() {
var self = this,
attributes = self.field.attributes;
// remove grid
if(self.grid) {
self.grid.remove();
delete self.grid;
self.grid = undefined;
}
if(self.grid) {
self.grid.remove();
delete self.grid;
self.grid = undefined;
}
self.$el.empty();
self.$el.empty();
var gridHeader = _.template([
'<div class="subnode-header">',
' <label class="control-label col-sm-4"><%-label%></label>',
'</div>'].join("\n")),
var gridHeader = _.template([
'<div class="subnode-header">',
' <label class="control-label col-sm-4"><%-label%></label>',
'</div>'].join('\n')),
gridBody = $('<div class="pgadmin-control-group backgrid form-group col-xs-12 object subnode"></div>').append(
gridHeader(attributes)
);
// Initialize a new Grid instance
var grid = self.grid = new Backgrid.Grid({
columns: self.grid_columns,
collection: self.model.get(self.field.get('name')),
className: "backgrid table-bordered"
});
var grid = self.grid = new Backgrid.Grid({
columns: self.grid_columns,
collection: self.model.get(self.field.get('name')),
className: 'backgrid table-bordered',
});
// render grid
self.$el.append($(gridBody).append(grid.render().$el));
self.$el.append($(gridBody).append(grid.render().$el));
return self;
}
});
return self;
},
});
// We will use this function in VacuumSettings Control
// to convert data type on the fly
var cellFunction = Backform.cellFunction = function(model) {
var self = this,
m = model,
vartype = model.get('column_type');
Backform.cellFunction = function(model) {
var vartype = model.get('column_type');
switch(vartype) {
case "integer":
return Backgrid.IntegerCell;
break;
case "number":
return Backgrid.NumberCell;
break;
case "string":
return Backgrid.StringCell;
break;
default:
return Backgrid.Cell;
break;
case 'integer':
return Backgrid.IntegerCell;
case 'number':
return Backgrid.NumberCell;
case 'string':
return Backgrid.StringCell;
default:
return Backgrid.Cell;
}
};
// Define Security Model with fields and validation for VacuumSettings Control
var VacuumTableModel = Backform.VacuumTableModel = pgBrowser.Node.Model.extend({
Backform.VacuumTableModel = pgBrowser.Node.Model.extend({
defaults: {
name: undefined,
setting: undefined,
label:undefined,
value: undefined,
column_type: undefined
column_type: undefined,
},
toJSON: function(){
@ -122,11 +115,11 @@ define('pgadmin.node.schema', [
delete d.setting;
delete d.column_type;
return d;
}
},
});
// Extend the browser's collection class for VacuumSettingsModel
var VacuumSettingsSchema = Backform.VacuumSettingsSchema = [{
Backform.VacuumSettingsSchema = [{
id: 'autovacuum_custom', label: gettext('Custom auto-vacuum?'),
group: gettext('Table'), mode: ['edit', 'create'],
type: 'switch',
@ -145,7 +138,7 @@ define('pgadmin.node.schema', [
return false;
}
return true;
}
},
},{
id: 'autovacuum_enabled', label: gettext('Enabled?'),
group: gettext('Table'), mode: ['edit', 'create'],
@ -162,7 +155,7 @@ define('pgadmin.node.schema', [
m.set('autovacuum_enabled', false);
}, 10);
return true;
}
},
},{
id: 'vacuum_table', label: gettext('Vacuum Table'),
model: Backform.VacuumTableModel, editable: false, type: 'collection',
@ -173,24 +166,24 @@ define('pgadmin.node.schema', [
{
name: 'label', label: gettext('Label'),
headerCell: Backgrid.Extension.CustomHeaderCell,
cell: 'string', editable: false, cellHeaderClasses:'width_percent_40'
cell: 'string', editable: false, cellHeaderClasses:'width_percent_40',
},
{
name: 'value', label: gettext('Value'),
cellHeaderClasses:'width_percent_30',
cellFunction: Backform.cellFunction, editable: function(m) {
return m.handler.get('autovacuum_enabled');
}, headerCell: Backgrid.Extension.CustomHeaderCell
}, headerCell: Backgrid.Extension.CustomHeaderCell,
},
{
name: 'setting', label: gettext('Default value'),
cellHeaderClasses:'width_percent_30',
headerCell: Backgrid.Extension.CustomHeaderCell,
cellFunction: Backform.cellFunction, editable: false
}
]
cellFunction: Backform.cellFunction, editable: false,
},
],
}),
deps: ['autovacuum_enabled']
deps: ['autovacuum_enabled'],
},{
id: 'toast_autovacuum', label: gettext('Custom auto-vacuum?'),
group: gettext('Toast Table'), mode: ['edit', 'create'],
@ -206,7 +199,7 @@ define('pgadmin.node.schema', [
return false;
}
return true;
}
},
},{
id: 'toast_autovacuum_enabled', label: gettext('Enabled?'),
group: gettext('Toast Table'), mode: ['edit', 'create'],
@ -225,8 +218,8 @@ define('pgadmin.node.schema', [
m.set('toast_autovacuum_enabled', false);
}, 10);
}
return true;
}
return true;
},
},{
id: 'vacuum_toast', label: gettext('Vacuum Toast Table'),
model: Backform.VacuumTableModel, type: 'collection', editable: function(m) {
@ -239,7 +232,7 @@ define('pgadmin.node.schema', [
{
name: 'label', label: gettext('Label'),
headerCell: Backgrid.Extension.CustomHeaderCell,
cell: 'string', editable: false, cellHeaderClasses:'width_percent_40'
cell: 'string', editable: false, cellHeaderClasses:'width_percent_40',
},
{
name: 'value', label: gettext('Value'),
@ -247,29 +240,29 @@ define('pgadmin.node.schema', [
headerCell: Backgrid.Extension.CustomHeaderCell,
cellFunction: Backform.cellFunction, editable: function(m) {
return m.handler.get('toast_autovacuum_enabled');
}
},
},
{
name: 'setting', label: gettext('Default value'),
cellHeaderClasses:'width_percent_30',
headerCell: Backgrid.Extension.CustomHeaderCell,
cellFunction: Backform.cellFunction, editable: false
}
]
cellFunction: Backform.cellFunction, editable: false,
},
],
}),
deps: ['toast_autovacuum_enabled']
deps: ['toast_autovacuum_enabled'],
}];
// Extend the browser's collection class for schema collection
if (!pgBrowser.Nodes['coll-schema']) {
var databases = pgBrowser.Nodes['coll-schema'] =
pgBrowser.Nodes['coll-schema'] =
pgBrowser.Collection.extend({
node: 'schema',
label: gettext('Schemas'),
type: 'coll-schema',
columns: ['name', 'namespaceowner', 'description']
columns: ['name', 'namespaceowner', 'description'],
});
};
}
// Extend the browser's node class for schema node
if (!pgBrowser.Nodes['schema']) {
pgBrowser.Nodes['schema'] = pgBrowser.Node.extend({
@ -286,7 +279,7 @@ define('pgadmin.node.schema', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -294,22 +287,22 @@ define('pgadmin.node.schema', [
name: 'create_schema_on_coll', node: 'coll-schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Schema...'),
icon: 'wcTabIcon icon-schema', data: {action: 'create'}
icon: 'wcTabIcon icon-schema', data: {action: 'create'},
},{
name: 'create_schema', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Schema...'),
icon: 'wcTabIcon icon-schema', data: {action: 'create'}
icon: 'wcTabIcon icon-schema', data: {action: 'create'},
},{
name: 'create_schema', node: 'database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Schema...'),
icon: 'wcTabIcon icon-schema', data: {action: 'create'},
enable: 'can_create_schema'
}
enable: 'can_create_schema',
},
]);
},
can_create_schema: function(node, item) {
can_create_schema: function(node) {
return pgBrowser.Nodes['database'].is_conn_allow.call(this, node);
},
model: pgBrowser.Node.Model.extend({
@ -331,38 +324,38 @@ define('pgadmin.node.schema', [
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text'
type: 'text',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},{
id: 'namespaceowner', label: gettext('Owner'), cell: 'string',
type: 'text', control: 'node-list-by-name', node: 'role',
select2: { allowClear: false }
select2: { allowClear: false },
},{
id: 'is_sys_object', label: gettext('System schema?'),
cell: 'switch', type: 'switch', mode: ['properties'], disabled: true
cell: 'switch', type: 'switch', mode: ['properties'], disabled: true,
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'tblacl', label: gettext('Default TABLE privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'seqacl', label: gettext('Default SEQUENCE privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'funcacl', label: gettext('Default FUNCTION privileges'),
group: gettext('Security'), type: 'text', mode: ['properties'], disabled: true
group: gettext('Security'), type: 'text', mode: ['properties'], disabled: true,
},{
id: 'typeacl', label: gettext('Default TYPE privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true, min_version: 90200,
visible: function() {
return this.version_compatible;
}
},
},{
id: 'nspacl', label: gettext('Privileges'),
model: pgBrowser.Node.PrivilegeRoleModel.extend(
@ -375,62 +368,62 @@ define('pgadmin.node.schema', [
model: pgBrowser.SecLabelModel, editable: false, type: 'collection',
group: gettext('Security'), mode: ['edit', 'create'],
min_version: 90200, canAdd: true,
canEdit: false, canDelete: true, control: 'unique-col-collection'
canEdit: false, canDelete: true, control: 'unique-col-collection',
},{
type: 'nested', control: 'tab', group: gettext('Default Privileges'),
mode: ['create','edit'],
schema:[{
id: 'deftblacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
id: 'deftblacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['a', 'r', 'w', 'd', 'D', 'x', 't']}),
label: gettext('Default Privileges: Tables'),
editable: false, type: 'collection', group: gettext('Tables'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor']
},{
id: 'defseqacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
label: gettext('Default Privileges: Tables'),
editable: false, type: 'collection', group: gettext('Tables'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
},{
id: 'defseqacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['r', 'w', 'U']}),
label: gettext('Default Privileges: Sequences'),
editable: false, type: 'collection', group: gettext('Sequences'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor']
},{
id: 'deffuncacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
label: gettext('Default Privileges: Sequences'),
editable: false, type: 'collection', group: gettext('Sequences'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
},{
id: 'deffuncacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['X']}),
label: gettext('Default Privileges: Functions'),
editable: false, type: 'collection', group: gettext('Functions'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor']
},{
id: 'deftypeacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
label: gettext('Default Privileges: Functions'),
editable: false, type: 'collection', group: gettext('Functions'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
},{
id: 'deftypeacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['U']}),
label: gettext('Default Privileges: Types'),
editable: false, type: 'collection', group: gettext('Types'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
min_version: 90200
}]
}
label: gettext('Default Privileges: Types'),
editable: false, type: 'collection', group: gettext('Types'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
min_version: 90200,
}],
},
],
validate: function() {
var err = {},
errmsg = null;
var errmsg = null;
// Validation of mandatory fields
this.errorModel.clear();
if (_.isUndefined(this.get('name')) ||
_.isNull(this.get('name')) ||
String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
errmsg = gettext('Name cannot be empty.');
this.errorModel.set('name', errmsg);
return errmsg;
errmsg = gettext('Name cannot be empty.');
this.errorModel.set('name', errmsg);
return errmsg;
} else if (_.isUndefined(this.get('namespaceowner')) ||
_.isNull(this.get('namespaceowner')) ||
String(this.get('namespaceowner')).replace(/^\s+|\s+$/g, '') == '') {
errmsg = gettext('Owner cannot be empty.');
this.errorModel.set('namespaceowner', errmsg);
return errmsg;
errmsg = gettext('Owner cannot be empty.');
this.errorModel.set('namespaceowner', errmsg);
return errmsg;
}
return null;
}
},
}),
// This function will checks whether we can allow user to
// drop object or not based on location within schema & catalog
@ -445,21 +438,21 @@ define('pgadmin.node.schema', [
//Check if we are not child of catalog
var prev_i = t.hasParent(i) ? t.parent(i) : null,
prev_d = prev_i ? t.itemData(prev_i) : null;
if(prev_d && prev_d._type == 'catalog') {
return false;
}
if(prev_d && prev_d._type == 'catalog') {
return false;
}
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// by default we do not want to allow create menu
return true;
}
},
});
pgBrowser.tableChildTreeNodeHierarchy = function(i) {
var idx = 0,
res = {},
t = pgBrowser.tree;
res = {},
t = pgBrowser.tree;
do {
var d = t.itemData(i);
@ -484,35 +477,34 @@ define('pgadmin.node.schema', [
}
// Switch Cell with Deps (specifically for table children)
var TableChildSwitchCell =
Backgrid.Extension.TableChildSwitchCell = Backgrid.Extension.SwitchCell.extend({
initialize: function() {
Backgrid.Extension.SwitchCell.prototype.initialize.apply(this, arguments);
Backgrid.Extension.DependentCell.prototype.initialize.apply(this, arguments);
},
dependentChanged: function () {
var model = this.model,
column = this.column,
editable = this.column.get("editable"),
input = this.$el.find('input[type=checkbox]').first(),
self_name = column.get('name'),
is_editable;
Backgrid.Extension.TableChildSwitchCell = Backgrid.Extension.SwitchCell.extend({
initialize: function() {
Backgrid.Extension.SwitchCell.prototype.initialize.apply(this, arguments);
Backgrid.Extension.DependentCell.prototype.initialize.apply(this, arguments);
},
dependentChanged: function () {
var model = this.model,
column = this.column,
editable = this.column.get('editable'),
input = this.$el.find('input[type=checkbox]').first(),
self_name = column.get('name'),
is_editable;
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable) {
this.$el.addClass("editable");
input.bootstrapSwitch('disabled',false);
} else {
this.$el.removeClass("editable");
input.bootstrapSwitch('disabled',true);
// Set self value into model to false
setTimeout(function() { model.set(self_name, false); }, 10);
}
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable) {
this.$el.addClass('editable');
input.bootstrapSwitch('disabled',false);
} else {
this.$el.removeClass('editable');
input.bootstrapSwitch('disabled',true);
// Set self value into model to false
setTimeout(function() { model.set(self_name, false); }, 10);
}
this.delegateEvents();
return this;
},
remove: Backgrid.Extension.DependentCell.prototype.remove
this.delegateEvents();
return this;
},
remove: Backgrid.Extension.DependentCell.prototype.remove,
});
return pgBrowser.Nodes['schema'];

View File

@ -1,18 +1,18 @@
define('pgadmin.node.synonym', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
'pgadmin.browser.collection'
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-synonym']) {
var databases = pgAdmin.Browser.Nodes['coll-synonym'] =
pgAdmin.Browser.Nodes['coll-synonym'] =
pgAdmin.Browser.Collection.extend({
node: 'synonym',
label: gettext('Synonyms'),
type: 'coll-synonym',
columns: ['name', 'owner','is_public_synonym']
columns: ['name', 'owner','is_public_synonym'],
});
};
}
if (!pgBrowser.Nodes['synonym']) {
pgAdmin.Browser.Nodes['synonym'] = pgBrowser.Node.extend({
@ -35,20 +35,20 @@ define('pgadmin.node.synonym', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Synonym...'),
icon: 'wcTabIcon icon-synonym', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_synonym', node: 'synonym', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Synonym...'),
icon: 'wcTabIcon icon-synonym', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_synonym', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Synonym...'),
icon: 'wcTabIcon icon-synonym', data: {action: 'create', check: true},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -66,10 +66,10 @@ define('pgadmin.node.synonym', [
var userInfo = pgBrowser.serverInfo[args.node_info.server._id].user;
var schemaInfo = args.node_info.schema;
this.set({
'owner': userInfo.name,
'synobjschema': schemaInfo._label,
'schema': schemaInfo._label,
'targettype': 'r'
'owner': userInfo.name,
'synobjschema': schemaInfo._label,
'schema': schemaInfo._label,
'targettype': 'r',
}, {silent: true});
} else {
this.fetchFromServer = true;
@ -80,34 +80,34 @@ define('pgadmin.node.synonym', [
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: 'inSchemaWithModelCheck'
disabled: 'inSchemaWithModelCheck',
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: true , control: 'node-list-by-name',
node: 'role', visible: false
node: 'role', visible: false,
},{
id: 'schema', label: gettext('Schema'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
disabled: function(m) { return !m.isNew(); }, node: 'schema',
control: 'node-list-by-name', cache_node: 'database',
cache_level: 'database'
cache_level: 'database',
},{
id: 'targettype', label: gettext('Target type'), cell: 'string',
disabled: 'inSchema', group: gettext('Definition'),
select2: { width: "50%", allowClear: false },
options: function(obj) {
return [
{label: gettext("Function"), value: "f"},
{label: gettext("Package"), value: "P"},
{label: gettext("Procedure"), value: "p"},
{label: gettext("Public Synonym"), value: "s"},
{label: gettext("Sequence"), value: "S"},
{label: gettext("Table"), value: "r"},
{label: gettext("View"), value: "v"}
]
},
control: 'select2'
select2: { width: '50%', allowClear: false },
options: function() {
return [
{label: gettext('Function'), value: 'f'},
{label: gettext('Package'), value: 'P'},
{label: gettext('Procedure'), value: 'p'},
{label: gettext('Public Synonym'), value: 's'},
{label: gettext('Sequence'), value: 'S'},
{label: gettext('Table'), value: 'r'},
{label: gettext('View'), value: 'v'},
];
},
control: 'select2',
},{
id: 'synobjschema', label: gettext('Target schema'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
@ -116,8 +116,8 @@ define('pgadmin.node.synonym', [
node: 'schema', filter: function(d) {
// Exclude PPAS catalogs
var exclude_catalogs = ['pg_catalog', 'sys', 'dbo',
'pgagent', 'information_schema',
'dbms_job_procedure'];
'pgagent', 'information_schema',
'dbms_job_procedure'];
return d && _.indexOf(exclude_catalogs, d.label) == -1;
},
disabled: function(m) {
@ -125,65 +125,66 @@ define('pgadmin.node.synonym', [
if(!m.inSchema.apply(this, [m])) {
var is_synonym = (m.get('targettype') == 's');
if(is_synonym) {
m.set('synobjschema', 'public', {silent: true});
m.set('synobjschema', 'public', {silent: true});
return true;
} else {
return false;
}
}
return true;
}
},
},{
id: 'synobjname', label: gettext('Target object'), cell: 'string',
type: 'text', disabled: 'inSchema', group: gettext('Definition'),
deps: ['targettype', 'synobjschema'],
control: 'node-ajax-options',
options: function(control) {
var trgTyp = control.model.get('targettype');
var trgSchema = control.model.get('synobjschema');
var res = [];
control: 'node-ajax-options',
options: function(control) {
var trgTyp = control.model.get('targettype');
var trgSchema = control.model.get('synobjschema');
var res = [];
var node = control.field.get('schema_node'),
var node = control.field.get('schema_node'),
_url = node.generate_url.apply(
node, [
null, 'get_target_objects', control.field.get('node_data'), false,
control.field.get('node_info') ]);
$.ajax({
type: 'GET',
timeout: 30000,
url: _url,
cache: false,
async: false,
data: {"trgTyp" : trgTyp, "trgSchema" : trgSchema},
null, 'get_target_objects', control.field.get('node_data'), false,
control.field.get('node_info') ]);
$.ajax({
type: 'GET',
timeout: 30000,
url: _url,
cache: false,
async: false,
data: {'trgTyp' : trgTyp, 'trgSchema' : trgSchema},
// On success return function list from server
success: function(result) {
res = result.data;
return res;
},
success: function(result) {
res = result.data;
return res;
},
// On failure show error appropriate error message to user
error: function(xhr, status, error) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
}
} catch (e) {}
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
}
});
} catch (e) {
// Ignore
}
},
});
return res;
}
},
},{
id: 'is_public_synonym', label: gettext('Public synonym?'),
disabled: true, type: 'switch', mode: ['properties'], cell: 'switch',
options: { onText: gettext('Yes'), offText: gettext('No'), onColor: 'success',
offColor: 'primary', size: 'mini'}
}
offColor: 'primary', size: 'mini'},
},
],
validate: function() {
var err = {},
msg = undefined;
var msg = undefined;
this.errorModel.clear();
if (_.isUndefined(this.get('name'))
@ -221,27 +222,27 @@ define('pgadmin.node.synonym', [
}
}
return true;
}
},
}),
canCreate: function(itemData, item, data) {
//If check is false then , we will allow create menu
if (data && data.check == false)
return true;
if (data && data.check == false)
return true;
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
if (server && server.server_type === 'pg')
return false;
if (server && server.server_type === 'pg')
return false;
// If it is catalog then don't allow user to create synonyms
if (treeData['catalog'] != undefined)
return false;
if (treeData['catalog'] != undefined)
return false;
// by default we do not want to allow create menu
return true;
}
});
return true;
},
});
}

View File

@ -1,53 +1,54 @@
define('pgadmin.node.column', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'backform', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.collection',
], function(
gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser, Backform, Backgrid
) {
if (!pgBrowser.Nodes['coll-column']) {
var databases = pgBrowser.Nodes['coll-column'] =
pgBrowser.Nodes['coll-column'] =
pgBrowser.Collection.extend({
node: 'column',
label: gettext('Columns'),
type: 'coll-column',
columns: ['name', 'atttypid', 'description']
columns: ['name', 'atttypid', 'description'],
});
};
}
// This Node model will be used for variable control for column
var VariablesModel = Backform.VariablesModel = pgBrowser.Node.Model.extend({
var VariablesModel = Backform.VariablesModel = pgBrowser.Node.Model.extend({
idAttribute: 'name',
defaults: {
name: null,
value: null
value: null,
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'select2',
type: 'text', disabled: false, node: 'column',
options: [['n_distinct', 'n_distinct'],
['n_distinct_inherited','n_distinct_inherited']],
select2: {placeholder: "Select variable"},
cellHeaderClasses:'width_percent_50'
select2: {placeholder: 'Select variable'},
cellHeaderClasses:'width_percent_50',
},{
id: 'value', label: gettext('Value'),
type: 'text', disabled: false,
cellHeaderClasses:'width_percent_50'
cellHeaderClasses:'width_percent_50',
}],
validate: function() {
var err = {},
errmsg = null;
if (_.isUndefined(this.get('value')) ||
if (
_.isUndefined(this.get('value')) ||
_.isNull(this.get('value')) ||
String(this.get('value')).replace(/^\s+|\s+$/g, '') == '') {
errmsg = gettext('Please provide input for variable.');
this.errorModel.set('value', errmsg);
return errmsg;
} else {
this.errorModel.unset('value');
}
String(this.get('value')).replace(/^\s+|\s+$/g, '') == ''
) {
var errmsg = gettext('Please provide input for variable.');
this.errorModel.set('value', errmsg);
return errmsg;
} else {
this.errorModel.unset('value');
}
return null;
}
},
});
// Integer Cell for Columns Length and Precision
@ -60,12 +61,12 @@ define('pgadmin.node.column', [
dependentChanged: function () {
this.$el.empty();
var model = this.model,
column = this.column,
editable = this.column.get("editable"),
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
column = this.column,
editable = this.column.get('editable'),
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable){ this.$el.addClass("editable"); }
else { this.$el.removeClass("editable"); }
if (is_editable){ this.$el.addClass('editable'); }
else { this.$el.removeClass('editable'); }
this.delegateEvents();
return this;
@ -74,15 +75,15 @@ define('pgadmin.node.column', [
Backgrid.NumberCell.prototype.render.apply(this, arguments);
var model = this.model,
column = this.column,
editable = this.column.get("editable"),
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
column = this.column,
editable = this.column.get('editable'),
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable){ this.$el.addClass("editable"); }
else { this.$el.removeClass("editable"); }
if (is_editable){ this.$el.addClass('editable'); }
else { this.$el.removeClass('editable'); }
return this;
},
remove: Backgrid.Extension.DependentCell.prototype.remove
remove: Backgrid.Extension.DependentCell.prototype.remove,
});
if (!pgBrowser.Nodes['column']) {
@ -123,7 +124,7 @@ define('pgadmin.node.column', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -132,26 +133,26 @@ define('pgadmin.node.column', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Column...'),
icon: 'wcTabIcon icon-column', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_column', node: 'column', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Column...'),
icon: 'wcTabIcon icon-column', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_column_onTable', node: 'table', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Column...'),
icon: 'wcTabIcon icon-column', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_column_onView', node: 'view', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Column...'),
icon: 'wcTabIcon icon-column', data: {action: 'create', check: true},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
model: pgBrowser.Node.Model.extend({
@ -175,13 +176,13 @@ define('pgadmin.node.column', [
attstattarget:undefined,
attnotnull: false,
attlen: null,
attprecision: null
attprecision: null,
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: 'inSchemaWithColumnCheck',
cellHeaderClasses:'width_percent_30',
editable: 'editable_check_for_table'
editable: 'editable_check_for_table',
},{
// Need to show this field only when creating new table
// [in SubNode control]
@ -190,7 +191,7 @@ define('pgadmin.node.column', [
deps:['name'], cellHeaderClasses:'width_percent_5',
options: {
onText: gettext('Yes'), offText: gettext('No'),
onColor: 'success', offColor: 'primary'
onColor: 'success', offColor: 'primary',
},
visible: function(m) {
return _.isUndefined(
@ -222,7 +223,7 @@ define('pgadmin.node.column', [
}
return false;
},
editable: function(m){
editable: function(m) {
var name = m.get('name');
// If HeaderCell then allow True
if(m instanceof Backbone.Collection) {
@ -252,46 +253,44 @@ define('pgadmin.node.column', [
return true;
}
return false;
// Set to false if no condition is met
m.set('is_primary_key', false);
}
},
},{
id: 'attnum', label: gettext('Position'), cell: 'string',
type: 'text', disabled: 'notInSchema', mode: ['properties']
type: 'text', disabled: 'notInSchema', mode: ['properties'],
},{
id: 'cltype', label: gettext('Data type'),
cell: Backgrid.Extension.NodeAjaxOptionsCell.extend({
exitEditMode: function(e) {
var self = this;
this.$select.off('blur', this.exitEditMode);
this.$select.select2('close');
this.$el.removeClass('editor');
var self = this;
this.$select.off('blur', this.exitEditMode);
this.$select.select2('close');
this.$el.removeClass('editor');
// Once user have selected a value
// we can shift to next cell if it is editable
var next_cell, length_cell = this.$el.next(),
not_null_cell = this.$el.next().next().next();
var next_cell, length_cell = this.$el.next(),
not_null_cell = this.$el.next().next().next();
// Add delay so that Select2 cell tab event is captured
// first before triggerring backgrid:edited event.
setTimeout(function() {
setTimeout(function() {
// First check Length column if it is disable then goto
// Not Null column
if(length_cell && length_cell.hasClass('editable') && e) {
next_cell = length_cell;
} else if(not_null_cell && not_null_cell.hasClass('editable') && e) {
next_cell = not_null_cell;
}
if(length_cell && length_cell.hasClass('editable') && e) {
next_cell = length_cell;
} else if(not_null_cell && not_null_cell.hasClass('editable') && e) {
next_cell = not_null_cell;
}
if(next_cell) {
e.preventDefault();
e.stopPropagation();
var command = new Backgrid.Command({key: "Tab", keyCode: 9, which: 9});
self.model.trigger("backgrid:edited", self.model, self.column,
if(next_cell) {
e.preventDefault();
e.stopPropagation();
var command = new Backgrid.Command({key: 'Tab', keyCode: 9, which: 9});
self.model.trigger('backgrid:edited', self.model, self.column,
command);
next_cell.focus();
}
}, 20);
}
next_cell.focus();
}
}, 20);
},
}),
type: 'text', disabled: 'inSchemaWithColumnCheck',
control: 'node-ajax-options', url: 'get_types', node: 'table',
@ -306,7 +305,7 @@ define('pgadmin.node.column', [
* uses (this) as a object.
*/
var control = cell || this,
m = control.model;
m = control.model;
/* We need different data in create mode & in edit mode
* if we are in create mode then return data as it is
@ -314,7 +313,7 @@ define('pgadmin.node.column', [
*/
control.model.datatypes = data;
var edit_types = m.get('edit_types'),
result = [];
result = [];
// If called from Table, We will check if in edit mode
// then send edit_types only
@ -323,7 +322,7 @@ define('pgadmin.node.column', [
if (_.indexOf(edit_types, t.value) != -1) {
result.push(t);
}
});
});
// There may be case that user adds new column in existing collection
// we will not have edit types then
return result.length > 0 ? result : data;
@ -343,7 +342,7 @@ define('pgadmin.node.column', [
return result;
}
},
editable: 'editable_check_for_table'
editable: 'editable_check_for_table',
},{
// Need to show this field only when creating new table [in SubNode control]
id: 'inheritedfrom', label: gettext('Inherited from table'),
@ -351,228 +350,226 @@ define('pgadmin.node.column', [
cellHeaderClasses:'width_percent_10',
visible: function(m) {
return _.isUndefined(m.top.node_info['table'] || m.top.node_info['view'] || m.top.node_info['mview']);
}
},
},{
id: 'attlen', label: gettext('Length'), cell: IntegerDepCell,
deps: ['cltype'], type: 'int', group: gettext('Definition'), cellHeaderClasses:'width_percent_20',
disabled: function(m) {
var of_type = m.get('cltype'),
flag = true;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.length)
deps: ['cltype'], type: 'int', group: gettext('Definition'), cellHeaderClasses:'width_percent_20',
disabled: function(m) {
var of_type = m.get('cltype'),
flag = true;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.length)
{
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = false;
}
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = false;
}
});
}
});
flag && setTimeout(function() {
if(m.get('attlen')) {
m.set('attlen', null);
}
},10);
flag && setTimeout(function() {
if(m.get('attlen')) {
m.set('attlen', null);
}
},10);
return flag;
},
editable: function(m) {
return flag;
},
editable: function(m) {
// inheritedfrom has value then we should disable it
if(!_.isUndefined(m.get('inheritedfrom'))) {
return false;
}
if(!_.isUndefined(m.get('inheritedfrom'))) {
return false;
}
if (!m.datatypes) {
if (!m.datatypes) {
// datatypes not loaded, may be this call is from CallByNeed from backgrid cell initialize.
return true;
}
var of_type = m.get('cltype'),
flag = false;
}
var of_type = m.get('cltype'),
flag = false;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.length) {
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = true;
}
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.length) {
m.set('min_val', o.min_val, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = true;
}
});
}
});
!flag && setTimeout(function() {
if(m.get('attlen')) {
m.set('attlen', null, {silent: true});
}
},10);
!flag && setTimeout(function() {
if(m.get('attlen')) {
m.set('attlen', null, {silent: true});
}
},10);
return flag;
}
return flag;
},
},{
id: 'attprecision', label: gettext('Precision'), cell: IntegerDepCell,
deps: ['cltype'], type: 'int', group: gettext('Definition'), cellHeaderClasses:'width_percent_20',
disabled: function(m) {
var of_type = m.get('cltype'),
flag = true;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.precision) {
m.set('min_val', 0, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = false;
}
deps: ['cltype'], type: 'int', group: gettext('Definition'), cellHeaderClasses:'width_percent_20',
disabled: function(m) {
var of_type = m.get('cltype'),
flag = true;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.precision) {
m.set('min_val', 0, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = false;
}
});
}
});
flag && setTimeout(function() {
if(m.get('attprecision')) {
m.set('attprecision', null);
}
},10);
return flag;
},
editable: function(m) {
flag && setTimeout(function() {
if(m.get('attprecision')) {
m.set('attprecision', null);
}
},10);
return flag;
},
editable: function(m) {
// inheritedfrom has value then we should disable it
if(!_.isUndefined(m.get('inheritedfrom'))) {
return false;
}
if(!_.isUndefined(m.get('inheritedfrom'))) {
return false;
}
if (!m.datatypes) {
if (!m.datatypes) {
// datatypes not loaded yet, may be this call is from CallByNeed from backgrid cell initialize.
return true;
}
}
var of_type = m.get('cltype'),
flag = false;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.precision) {
m.set('min_val', 0, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = true;
}
var of_type = m.get('cltype'),
flag = false;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.precision) {
m.set('min_val', 0, {silent: true});
m.set('max_val', o.max_val, {silent: true});
flag = true;
}
});
}
});
!flag && setTimeout(function() {
if(m.get('attprecision')) {
m.set('attprecision', null);
}
},10);
!flag && setTimeout(function() {
if(m.get('attprecision')) {
m.set('attprecision', null);
}
},10);
return flag;
}
},{
return flag;
},
},{
id: 'collspcname', label: gettext('Collation'), cell: 'string',
type: 'text', control: 'node-ajax-options', url: 'get_collations',
group: gettext('Definition'), node: 'collation',
deps: ['cltype'], disabled: function(m) {
var of_type = m.get('cltype'),
flag = true;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.is_collatable)
var of_type = m.get('cltype'),
flag = true;
_.each(m.datatypes, function(o) {
if ( of_type == o.value ) {
if(o.is_collatable)
{
flag = false;
}
flag = false;
}
});
if (flag) {
setTimeout(function(){
if(m.get('collspcname') && m.get('collspcname') !== '') {
m.set('collspcname', "");
}
}, 10);
}
return flag;
}
}
});
if (flag) {
setTimeout(function(){
if(m.get('collspcname') && m.get('collspcname') !== '') {
m.set('collspcname', '');
}
}, 10);
}
return flag;
},
},{
id: 'defval', label: gettext('Default Value'), cell: 'string',
type: 'text', group: gettext('Definition'), deps: ['cltype'],
disabled: function(m) {
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
var type = m.get('cltype');
return type == 'serial' || type == 'bigserial'
return type == 'serial' || type == 'bigserial'
|| type == 'smallserial';
}
}
},
},{
id: 'attnotnull', label: gettext('Not NULL?'), cell: 'switch',
type: 'switch', disabled: 'inSchemaWithColumnCheck', cellHeaderClasses:'width_percent_20',
group: gettext('Definition'), editable: 'editable_check_for_table',
options: { onText: gettext('Yes'), offText: gettext('No'), onColor: 'success', offColor: 'primary' }
options: { onText: gettext('Yes'), offText: gettext('No'), onColor: 'success', offColor: 'primary' },
},{
id: 'attstattarget', label: gettext('Statistics'), cell: 'string',
type: 'text', disabled: 'inSchemaWithColumnCheck', mode: ['properties', 'edit'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'attstorage', label: gettext('Storage'), group: gettext('Definition'),
type: 'text', mode: ['properties', 'edit'],
cell: 'string', disabled: 'inSchemaWithColumnCheck', first_empty: true,
control: 'select2', select2: { placeholder: "Select storage",
control: 'select2', select2: { placeholder: 'Select storage',
allowClear: false,
width: "100%"
width: '100%',
},
options: [
{label: "PLAIN", value: "p"},
{label: "MAIN", value: "m"},
{label: "EXTERNAL", value: "e"},
{label: "EXTENDED", value: "x"},
]
{label: 'PLAIN', value: 'p'},
{label: 'MAIN', value: 'm'},
{label: 'EXTERNAL', value: 'e'},
{label: 'EXTENDED', value: 'x'},
],
},{
id: 'is_pk', label: gettext('Primary key?'),
type: 'switch', disabled: true, mode: ['properties'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'is_fk', label: gettext('Foreign key?'),
type: 'switch', disabled: true, mode: ['properties'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'is_inherited', label: gettext('Inherited?'),
type: 'switch', disabled: true, mode: ['properties'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'tbls_inherited', label: gettext('Inherited from table(s)'),
type: 'text', disabled: true, mode: ['properties'], deps: ['is_inherited'],
group: gettext('Definition'),
visible: function(m) {
if (!_.isUndefined(m.get('is_inherited')) && m.get('is_inherited')) {
return true;
} else {
return false;
}
}
if (!_.isUndefined(m.get('is_inherited')) && m.get('is_inherited')) {
return true;
} else {
return false;
}
},
},{
id: 'is_sys_column', label: gettext('System column?'), cell: 'string',
type: 'switch', disabled: true, mode: ['properties']
type: 'switch', disabled: true, mode: ['properties'],
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', mode: ['properties', 'create', 'edit'],
disabled: 'notInSchema'
disabled: 'notInSchema',
},{
id: 'attoptions', label: gettext('Variables'), type: 'collection',
group: gettext('Variables'), control: 'unique-col-collection',
model: VariablesModel, uniqueCol : ['name'],
mode: ['edit', 'create'], canAdd: true, canEdit: false,
canDelete: true
canDelete: true,
}, pgBrowser.SecurityGroupSchema, {
id: 'attacl', label: gettext('Privileges'), type: 'collection',
group: 'security', control: 'unique-col-collection',
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['a','r','w','x']}),
privileges: ['a','r','w','x']}),
mode: ['edit'], canAdd: true, canDelete: true,
uniqueCol : ['grantee']
uniqueCol : ['grantee'],
},{
id: 'seclabels', label: gettext('Security Labels'), canAdd: true,
model: pgBrowser.SecLabelModel, group: 'security',
mode: ['edit', 'create'], editable: false, type: 'collection',
min_version: 90100, canEdit: false, canDelete: true,
control: 'unique-col-collection'
control: 'unique-col-collection',
}],
validate: function(keys) {
var err = {},
changedAttrs = this.changed,
msg = undefined;
var msg = undefined;
// Nothing to validate
if (keys && keys.length == 0) {
@ -607,7 +604,7 @@ define('pgadmin.node.column', [
msg = gettext('Length should not be greater than: ') + this.get('max_val');
// If we have any error set then throw it to user
if(msg) {
this.errorModel.set('attlen', msg)
this.errorModel.set('attlen', msg);
return msg;
}
}
@ -623,7 +620,7 @@ define('pgadmin.node.column', [
msg = gettext('Precision should not be greater than: ') + this.get('max_val');
// If we have any error set then throw it to user
if(msg) {
this.errorModel.set('attprecision', msg)
this.errorModel.set('attprecision', msg);
return msg;
}
}
@ -668,7 +665,7 @@ define('pgadmin.node.column', [
// inheritedfrom check is useful when we use this schema in table node
// inheritedfrom has value then we should disable it
if(!_.isUndefined(m.get('inheritedfrom'))) {
return true;
return true;
}
// ie: it's position is less then 1
if (m.isNew()) {
@ -680,55 +677,55 @@ define('pgadmin.node.column', [
} else {
return true;
}
}
}
return true;
},
editable_check_for_table: function(arg) {
if (arg instanceof Backbone.Collection) {
return !arg.model.prototype.inSchemaWithColumnCheck.apply(
if (arg instanceof Backbone.Collection) {
return !arg.model.prototype.inSchemaWithColumnCheck.apply(
this, [arg.top]
);
} else {
return !arg.inSchemaWithColumnCheck.apply(
} else {
return !arg.inSchemaWithColumnCheck.apply(
this, [arg]
);
}
}
}
},
}),
// Below function will enable right click menu for creating column
canCreate: function(itemData, item, data) {
// If check is false then , we will allow create menu
if (data && data.check == false)
return true;
if (data && data.check == false)
return true;
var t = pgBrowser.tree, i = item, d = itemData, parents = [];
var t = pgBrowser.tree, i = item, d = itemData, parents = [];
// To iterate over tree to check parent node
while (i) {
while (i) {
// If it is schema then allow user to create table
if (_.indexOf(['schema'], d._type) > -1) {
return true;
}
else if (_.indexOf(['view', 'coll-view',
'mview',
'coll-mview'], d._type) > -1) {
parents.push(d._type);
break;
}
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
if (_.indexOf(['schema'], d._type) > -1) {
return true;
}
else if (_.indexOf(['view', 'coll-view',
'mview',
'coll-mview'], d._type) > -1) {
parents.push(d._type);
break;
}
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// If node is under catalog then do not allow 'create' menu
if (_.indexOf(parents, 'catalog') > -1 ||
if (_.indexOf(parents, 'catalog') > -1 ||
_.indexOf(parents, 'coll-view') > -1 ||
_.indexOf(parents, 'coll-mview') > -1 ||
_.indexOf(parents, 'mview') > -1 ||
_.indexOf(parents, 'view') > -1) {
return false;
} else {
return true;
}
}
return false;
} else {
return true;
}
},
});
}

View File

@ -2,7 +2,7 @@
define('pgadmin.node.check_constraint', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
'pgadmin.browser.collection'
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Check Constraint Node
@ -21,7 +21,7 @@ define('pgadmin.node.check_constraint', [
Init: function() {
// Avoid mulitple registration of menus
if (this.initialized)
return;
return;
this.initialized = true;
@ -30,13 +30,13 @@ define('pgadmin.node.check_constraint', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 5, label: gettext('Check...'),
icon: 'wcTabIcon icon-check_constraint', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'validate_check_constraint', node: 'check_constraint', module: this,
applies: ['object', 'context'], callback: 'validate_check_constraint',
category: 'validate', priority: 4, label: gettext('Validate check constraint'),
icon: 'fa fa-link', enable : 'is_not_valid', data: {action: 'edit', check: true}
}
icon: 'fa fa-link', enable : 'is_not_valid', data: {action: 'edit', check: true},
},
]);
},
@ -50,10 +50,10 @@ define('pgadmin.node.check_constraint', [
callbacks: {
validate_check_constraint: function(args) {
var input = args || {},
obj = this,
t = pgBrowser.tree,
i = input.item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined;
obj = this,
t = pgBrowser.tree,
i = input.item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined;
if (!d) {
return false;
@ -73,19 +73,21 @@ define('pgadmin.node.check_constraint', [
setTimeout(function() {t.select(i);}, 100);
}
},
error: function(xhr, status, error) {
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
}
} catch (e) {}
} catch (e) {
console.warn(e.stack || e);
}
t.unload(i);
}
});
},
});
return false;
}
},
},
canDrop: pgBrowser.Nodes['schema'].canChildDrop,
model: pgAdmin.Browser.Node.Model.extend({
@ -97,15 +99,15 @@ define('pgadmin.node.check_constraint', [
description: undefined,
consrc: undefined,
connoinherit: undefined,
convalidated: true
convalidated: true,
},
// Check Constraint Schema
schema: [{
id: 'name', label: gettext('Name'), type:'text', cell:'string',
disabled: 'isDisabled'
disabled: 'isDisabled',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'comment', label: gettext('Comment'), type: 'multiline', cell:
'string', mode: ['properties', 'create', 'edit'],
@ -120,15 +122,15 @@ define('pgadmin.node.check_constraint', [
} else {
return false;
}
}
},
},{
id: 'consrc', label: gettext('Check'), type: 'multiline', cell:
'string', group: gettext('Definition'), mode: ['properties',
'create', 'edit'], disabled: function(m) {
return ((_.has(m, 'handler') &&
'create', 'edit'], disabled: function(m) {
return ((_.has(m, 'handler') &&
!_.isUndefined(m.handler) &&
!_.isUndefined(m.get('oid'))) || (_.isFunction(m.isNew) && !m.isNew()));
}, editable: false
}, editable: false,
},{
id: 'connoinherit', label: gettext('No Inherit?'), type:
'switch', cell: 'boolean', group: gettext('Definition'), mode:
@ -140,7 +142,7 @@ define('pgadmin.node.check_constraint', [
_.has(m.node_info.table, 'is_partitioned') && m.node_info.table.is_partitioned)
){
setTimeout(function(){
m.set('connoinherit', false);
m.set('connoinherit', false);
},10);
return true;
@ -149,9 +151,9 @@ define('pgadmin.node.check_constraint', [
return ((_.has(m, 'handler') &&
!_.isUndefined(m.handler) &&
!_.isUndefined(m.get('oid'))) || (_.isFunction(m.isNew) && !m.isNew()));
}
},
},{
id: 'convalidated', label: gettext("Don't validate?"), type: 'switch', cell:
id: 'convalidated', label: gettext('Don\'t validate?'), type: 'switch', cell:
'boolean', group: gettext('Definition'), min_version: 90200,
disabled: function(m) {
if ((_.isFunction(m.isNew) && !m.isNew()) ||
@ -159,17 +161,17 @@ define('pgadmin.node.check_constraint', [
!_.isUndefined(m.handler) &&
!_.isUndefined(m.get('oid')))) {
return !m.get("convalidated");
return !m.get('convalidated');
} else {
return false;
}
},
mode: ['properties', 'create', 'edit']
mode: ['properties', 'create', 'edit'],
}],
// Client Side Validation
validate: function() {
var err = {},
errmsg;
errmsg;
if (_.isUndefined(this.get('consrc')) || String(this.get('consrc')).replace(/^\s+|\s+$/g, '') == '') {
err['consrc'] = gettext('Check cannot be empty.');
@ -198,32 +200,32 @@ define('pgadmin.node.check_constraint', [
}
}
return false;
}
},
}),
// Below function will enable right click menu for creating check constraint.
canCreate: function(itemData, item, data) {
// If check is false then , we will allow create menu
if (data && data.check == false)
return true;
if (data && data.check == false)
return true;
var t = pgBrowser.tree, i = item, d = itemData, parents = [];
var t = pgBrowser.tree, i = item, d = itemData, parents = [];
// To iterate over tree to check parent node
while (i) {
while (i) {
// If it is schema then allow user to c reate table
if (_.indexOf(['schema'], d._type) > -1)
return true;
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// If node is under catalog then do not allow 'create' menu
if (_.indexOf(parents, 'catalog') > -1) {
return false;
} else {
if (_.indexOf(['schema'], d._type) > -1)
return true;
}
}
});
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// If node is under catalog then do not allow 'create' menu
if (_.indexOf(parents, 'catalog') > -1) {
return false;
} else {
return true;
}
},
});
}

View File

@ -1,8 +1,8 @@
define('pgadmin.node.primary_key', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, Backgrid) {
// Extend the browser's node class for index constraint node
if (!pgBrowser.Nodes['primary_key']) {
@ -24,7 +24,7 @@ define('pgadmin.node.primary_key', [
Init: function() {
/* Avoid multiple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -33,9 +33,9 @@ define('pgadmin.node.primary_key', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Primary key'),
icon: 'wcTabIcon icon-primary_key', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
}
},
]);
},
canCreate: function(itemData, item, data) {
@ -44,8 +44,8 @@ define('pgadmin.node.primary_key', [
return true;
var t = pgBrowser.tree, i = item, d = itemData, parents = [],
immediate_parent_table_found = false,
is_immediate_parent_table_partitioned = false;
immediate_parent_table_found = false,
is_immediate_parent_table_partitioned = false;
// To iterate over tree to check parent node
while (i) {
@ -69,7 +69,7 @@ define('pgadmin.node.primary_key', [
_.each(children, function(child){
data = pgBrowser.tree.itemData($(child));
if (!primary_key_found && data._type == "primary_key") {
if (!primary_key_found && data._type == 'primary_key') {
primary_key_found = true;
}
});
@ -100,7 +100,7 @@ define('pgadmin.node.primary_key', [
fillfactor: undefined,
condeferrable: undefined,
condeferred: undefined,
columns: []
columns: [],
},
// Define the schema for the index constraint node
@ -119,15 +119,15 @@ define('pgadmin.node.primary_key', [
var name = m.get('name');
if (!(name && name != '')) {
setTimeout(function(){
if(m.get('comment') && m.get('comment') !== '') {
m.set('comment', null);
}
if(m.get('comment') && m.get('comment') !== '') {
m.set('comment', null);
}
},10);
return true;
} else {
return false;
}
}
},
},{
id: 'columns', label: gettext('Columns'),
type: 'collection', group: gettext('Definition'),
@ -139,37 +139,37 @@ define('pgadmin.node.primary_key', [
var self = this,
collection = this.model.get('columns');
// Do not listen for any event(s) for existing constraint.
// Do not listen for any event(s) for existing constraint.
if (_.isUndefined(self.model.get('oid'))) {
var tableCols = self.model.top.get('columns');
self.listenTo(tableCols, 'remove' , self.removeColumn);
self.listenTo(tableCols, 'change:name', self.resetColOptions);
self.listenTo(tableCols, 'remove' , self.removeColumn);
self.listenTo(tableCols, 'change:name', self.resetColOptions);
}
collection.on('pgadmin:multicolumn:updated', function() {
self.render.apply(self);
});
self.listenTo(collection, "add", self.render);
self.listenTo(collection, "remove", self.render);
self.listenTo(collection, 'add', self.render);
self.listenTo(collection, 'remove', self.render);
},
removeColumn: function(m) {
var self = this,
removedCols = self.model.get('columns').where(
{column: m.get('name')}
);
removedCols = self.model.get('columns').where(
{column: m.get('name')}
);
self.model.get('columns').remove(removedCols);
setTimeout(function () {
self.render();
}, 10);
var key = 'primary_key'
var key = 'primary_key';
setTimeout(function () {
constraints = self.model.top.get(key);
var removed = [];
var constraints = self.model.top.get(key),
removed = [];
constraints.each(function(constraint) {
if (constraint.get("columns").length == 0) {
removed.push(constraint);
if (constraint.get('columns').length == 0) {
removed.push(constraint);
}
});
constraints.remove(removed);
@ -179,7 +179,7 @@ define('pgadmin.node.primary_key', [
resetColOptions : function(m) {
var self = this,
updatedCols = self.model.get('columns').where(
{column: m.previous('name')}
{column: m.previous('name')}
);
if (updatedCols.length > 0) {
/*
@ -187,8 +187,8 @@ define('pgadmin.node.primary_key', [
* column name in primary key as well.
*/
updatedCols[0].set(
{"column": m.get('name')},
{silent: true});
{'column': m.get('name')},
{silent: true});
}
setTimeout(function () {
@ -196,19 +196,17 @@ define('pgadmin.node.primary_key', [
}, 10);
},
formatter: {
fromRaw: function (rawValue, model) {
return rawValue.pluck("column").toString();
fromRaw: function (rawValue) {
return rawValue.pluck('column').toString();
},
toRaw: function (val, model) {
return val;
}
toRaw: function (val) { return val; },
},
render: function() {
return Backgrid.StringCell.prototype.render.apply(this, arguments);
},
remove: function() {
var tableCols = this.model.top.get('columns'),
primary_key_col = this.model.get('columns');
primary_key_col = this.model.get('columns');
if (primary_key_col) {
primary_key_col.off('pgadmin:multicolumn:updated');
@ -218,7 +216,7 @@ define('pgadmin.node.primary_key', [
this.stopListening(tableCols, 'change:name' , self.resetColOptions);
Backgrid.StringCell.prototype.remove.apply(this, arguments);
}
},
}),
canDelete: true, canAdd: true,
control: Backform.MultiSelectAjaxControl.extend({
@ -231,13 +229,13 @@ define('pgadmin.node.primary_key', [
allowClear: true,
width: 'style',
placeholder: gettext('Select the column(s)'),
}
},
}
),
keyPathAccessor: function(obj, path) {
var res = obj;
if(_.isArray(res)) {
return _.map(res, function(o) { return o['column']
return _.map(res, function(o) { return o['column'];
});
}
path = path.split('.');
@ -249,8 +247,8 @@ define('pgadmin.node.primary_key', [
return _.isObject(res) && !_.isArray(res) ? null : res;
},
initialize: function() {
// Here we will decide if we need to call URL
// Or fetch the data from parent columns collection
// Here we will decide if we need to call URL
// Or fetch the data from parent columns collection
var self = this;
if(this.model.handler) {
Backform.Select2Control.prototype.initialize.apply(this, arguments);
@ -266,17 +264,16 @@ define('pgadmin.node.primary_key', [
Backform.MultiSelectAjaxControl.prototype.initialize.apply(this, arguments);
}
self.model.get('columns').on('pgadmin:multicolumn:updated', function() {
self.render.apply(self);
});
self.render.apply(self);
});
},
resetColOptions: function(m) {
resetColOptions: function() {
var self = this;
setTimeout(function () {
self.custom_options();
self.render.apply(self);
}, 50);
},
custom_options: function() {
// We will add all the columns entered by user in table model
@ -285,73 +282,71 @@ define('pgadmin.node.primary_key', [
if (columns.length > 0) {
_.each(columns.models, function(m) {
var col = m.get('name');
if(!_.isUndefined(col) && !_.isNull(col)) {
added_columns_from_tables.push(
{label: col, value: col, image:'icon-column'}
);
}
var col = m.get('name');
if(!_.isUndefined(col) && !_.isNull(col)) {
added_columns_from_tables.push(
{label: col, value: col, image:'icon-column'}
);
}
});
}
// Set the values in to options so that user can select
this.field.set('options', added_columns_from_tables);
},
onChange: function(e) {
onChange: function() {
var self = this,
model = this.model,
$el = $(e.target),
attrArr = this.field.get("name").split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
vals = this.getValueFromDOM(),
collection = model.get(name),
removed = [];
model = this.model,
attrArr = this.field.get('name').split('.'),
name = attrArr.shift(),
vals = this.getValueFromDOM(),
collection = model.get(name),
removed = [];
this.stopListening(this.model, "change:" + name, this.render);
this.stopListening(this.model, 'change:' + name, this.render);
/*
* Iterate through all the values, and find out how many are already
* present in the collection.
*/
/*
* Iterate through all the values, and find out how many are already
* present in the collection.
*/
collection.each(function(m) {
var column = m.get('column'),
idx = _.indexOf(vals, column);
var column = m.get('column'),
idx = _.indexOf(vals, column);
if (idx > -1) {
vals.splice(idx, 1);
} else {
removed.push(column);
}
});
if (idx > -1) {
vals.splice(idx, 1);
} else {
removed.push(column);
}
});
/*
* Adding new values
*/
/*
* Adding new values
*/
_.each(vals, function(v) {
var m = new (self.field.get('model'))(
{column: v}, { silent: true,
top: self.model.top,
collection: collection,
handler: collection
});
{column: v}, { silent: true,
top: self.model.top,
collection: collection,
handler: collection,
});
collection.add(m);
});
/*
* Removing unwanted!
*/
/*
* Removing unwanted!
*/
_.each(removed, function(v) {
collection.remove(collection.where({column: v}));
});
this.listenTo(this.model, "change:" + name, this.render);
this.listenTo(this.model, 'change:' + name, this.render);
},
remove: function() {
if(this.model.handler) {
var self = this,
tableCols = self.model.top.get('columns');
tableCols = self.model.top.get('columns');
self.stopListening(tableCols, 'remove' , self.resetColOptions);
self.stopListening(tableCols, 'change:name' , self.resetColOptions);
self.model.get('columns').off('pgadmin:multicolumn:updated');
@ -361,23 +356,23 @@ define('pgadmin.node.primary_key', [
} else {
Backform.MultiSelectAjaxControl.prototype.remove.apply(this, arguments);
}
}
},
}),
deps: ['index'], node: 'column',
model: pgBrowser.Node.Model.extend({
defaults: {
column: undefined
column: undefined,
},
validate: function() {
return null;
}
},
}),
transform : function(data){
var res = [];
if (data && _.isArray(data)) {
_.each(data, function(d) {
res.push({label: d.label, value: d.label, image:'icon-column'});
})
});
}
return res;
},
@ -385,27 +380,27 @@ define('pgadmin.node.primary_key', [
disabled: function(m) {
// If we are in table edit mode then
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
&& !m.top.isNew()) {
// If OID is undefined then user is trying to add
// new constraint which should be allowed for Unique
return !_.isUndefined(m.get('oid'));
return !_.isUndefined(m.get('oid'));
}
// We can't update columns of existing index constraint.
if (!m.isNew()) {
return true;
return true;
}
// Disable if index is selected.
var index = m.get('index');
if(_.isUndefined(index) || index == '') {
return false;
} else {
var col = m.get('columns');
col.reset();
return true;
}
if(_.isUndefined(index) || index == '') {
return false;
} else {
var col = m.get('columns');
col.reset();
return true;
}
},{
},
},{
id: 'spcname', label: gettext('Tablespace'),
type: 'text', group: gettext('Definition'),
control: 'node-list-by-name', node: 'tablespace',
@ -413,40 +408,40 @@ define('pgadmin.node.primary_key', [
select2:{allowClear:false},
filter: function(m) {
// Don't show pg_global tablespace in selection.
if (m.label == "pg_global") return false;
if (m.label == 'pg_global') return false;
else return true;
},
disabled: function(m) {
// Disable if index is selected.
m = m.top || m;
var index = m.get('index');
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('spcname', '');
},10);
return true;
}
}
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('spcname', '');
},10);
return true;
}
},
},{
id: 'index', label: gettext('Index'),
type: 'text', group: gettext('Definition'),
control: Backform.NodeListByNameControl.extend({
initialize:function() {
if (_.isUndefined(this.model.top)) {
Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments);
} else {
Backform.Control.prototype.initialize.apply(this,arguments);
}
}
initialize:function() {
if (_.isUndefined(this.model.top)) {
Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments);
} else {
Backform.Control.prototype.initialize.apply(this,arguments);
}
},
}),
select2:{allowClear:true}, node: 'index',
disabled: function(m) {
// If we are in table edit mode then disable it
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
return true;
&& !m.top.isNew()) {
return true;
}
// We can't update index of existing index constraint.
@ -455,37 +450,37 @@ define('pgadmin.node.primary_key', [
// We will not show this field in Create Table mode
visible: function(m) {
return !_.isUndefined(m.top.node_info['table']);
}
},
},{
id: 'fillfactor', label: gettext('Fill factor'), deps: ['index'],
type: 'int', group: gettext('Definition'), allowNull: true,
disabled: function(m) {
// Disable if index is selected.
var index = m.get('index');
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('fillfactor', null);
},10);
return true;
}
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('fillfactor', null);
},10);
return true;
}
},
},{
id: 'condeferrable', label: gettext('Deferrable?'),
type: 'switch', group: gettext('Definition'), deps: ['index'],
disabled: function(m) {
// If we are in table edit mode then
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
&& !m.top.isNew()) {
// If OID is undefined then user is trying to add
// new constraint which should allowed for Unique
return !_.isUndefined(m.get('oid'));
return !_.isUndefined(m.get('oid'));
}
// We can't update condeferrable of existing index constraint.
if (!m.isNew()) {
return true;
return true;
}
// Disable if index is selected.
var index = m.get('index');
@ -498,7 +493,7 @@ define('pgadmin.node.primary_key', [
},10);
return true;
}
}
},
},{
id: 'condeferred', label: gettext('Deferred?'),
type: 'switch', group: gettext('Definition'),
@ -506,10 +501,10 @@ define('pgadmin.node.primary_key', [
disabled: function(m) {
// If we are in table edit mode then
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
&& !m.top.isNew()) {
// If OID is undefined then user is trying to add
// new constraint which should allowed for Unique
return !_.isUndefined(m.get('oid'));
return !_.isUndefined(m.get('oid'));
}
// We can't update condeferred of existing index constraint.
@ -521,13 +516,13 @@ define('pgadmin.node.primary_key', [
return false;
} else {
setTimeout(function(){
if(m.get('condeferred'))
if(m.get('condeferred'))
m.set('condeferred', false);
},10);
return true;
}
}
}
},
},
],
validate: function() {
this.errorModel.clear();
@ -539,17 +534,17 @@ define('pgadmin.node.primary_key', [
var columns = this.get('columns'),
index = this.get('index');
if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
(_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
var msg = gettext('Please specify columns for %(node)s', {node: gettext('Primary key')});
this.errorModel.set('columns', msg);
return msg;
}
if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
(_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
var msg = gettext('Please specify columns for %(node)s', {node: gettext('Primary key')});
this.errorModel.set('columns', msg);
return msg;
}
return null;
}
})
});
},
}),
});
}
return pgBrowser.Nodes['primary_key'];

View File

@ -1,8 +1,8 @@
define('pgadmin.node.unique_constraint', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, Backgrid) {
// Extend the browser's node class for index constraint node
if (!pgBrowser.Nodes['unique_constraint']) {
@ -24,7 +24,7 @@ define('pgadmin.node.unique_constraint', [
Init: function() {
/* Avoid multiple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -33,9 +33,9 @@ define('pgadmin.node.unique_constraint', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Unique constraint'),
icon: 'wcTabIcon icon-unique_constraint', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
}
},
]);
},
canCreate: function(itemData, item, data) {
@ -44,8 +44,8 @@ define('pgadmin.node.unique_constraint', [
return true;
var t = pgBrowser.tree, i = item, d = itemData, parents = [],
immediate_parent_table_found = false,
is_immediate_parent_table_partitioned = false;
immediate_parent_table_found = false,
is_immediate_parent_table_partitioned = false;
// To iterate over tree to check parent node
while (i) {
@ -86,7 +86,7 @@ define('pgadmin.node.unique_constraint', [
fillfactor: undefined,
condeferrable: undefined,
condeferred: undefined,
columns: []
columns: [],
},
// Define the schema for the index constraint node
@ -105,15 +105,15 @@ define('pgadmin.node.unique_constraint', [
var name = m.get('name');
if (!(name && name != '')) {
setTimeout(function(){
if(m.get('comment') && m.get('comment') !== '') {
m.set('comment', null);
}
if(m.get('comment') && m.get('comment') !== '') {
m.set('comment', null);
}
},10);
return true;
} else {
return false;
}
}
},
},{
id: 'columns', label: gettext('Columns'),
type: 'collection', group: gettext('Definition'),
@ -125,47 +125,47 @@ define('pgadmin.node.unique_constraint', [
var self = this,
collection = this.model.get('columns');
// Do not listen for any event(s) for existing constraint.
// Do not listen for any event(s) for existing constraint.
if (_.isUndefined(self.model.get('oid'))) {
var tableCols = self.model.top.get('columns');
self.listenTo(tableCols, 'remove' , self.removeColumn);
self.listenTo(tableCols, 'change:name', self.resetColOptions);
self.listenTo(tableCols, 'remove' , self.removeColumn);
self.listenTo(tableCols, 'change:name', self.resetColOptions);
}
collection.on('pgadmin:multicolumn:updated', function() {
self.render.apply(self);
});
self.listenTo(collection, "add", self.render);
self.listenTo(collection, "remove", self.render);
self.listenTo(collection, 'add', self.render);
self.listenTo(collection, 'remove', self.render);
},
removeColumn: function(m) {
var self = this,
removedCols = self.model.get('columns').where(
{column: m.get('name')}
);
removedCols = self.model.get('columns').where(
{column: m.get('name')}
);
self.model.get('columns').remove(removedCols);
setTimeout(function () {
self.render();
}, 10);
var key = 'unique_constraint'
var key = 'unique_constraint';
setTimeout(function () {
constraints = self.model.top.get(key);
var removed = [];
var constraints = self.model.top.get(key),
removed = [];
constraints.each(function(constraint) {
if (constraint.get("columns").length == 0) {
removed.push(constraint);
if (constraint.get('columns').length == 0) {
removed.push(constraint);
}
});
constraints.remove(removed);
},100);
},
resetColOptions : function(m) {
var self = this,
updatedCols = self.model.get('columns').where(
{column: m.previous('name')}
{column: m.previous('name')}
);
if (updatedCols.length > 0) {
/*
@ -173,8 +173,8 @@ define('pgadmin.node.unique_constraint', [
* column name in primary key as well.
*/
updatedCols[0].set(
{"column": m.get('name')},
{silent: true});
{'column': m.get('name')},
{silent: true});
}
setTimeout(function () {
@ -182,19 +182,17 @@ define('pgadmin.node.unique_constraint', [
}, 10);
},
formatter: {
fromRaw: function (rawValue, model) {
return rawValue.pluck("column").toString();
fromRaw: function (rawValue) {
return rawValue.pluck('column').toString();
},
toRaw: function (val, model) {
return val;
}
toRaw: function (val) { return val; },
},
render: function() {
return Backgrid.StringCell.prototype.render.apply(this, arguments);
},
remove: function() {
var tableCols = this.model.top.get('columns'),
primary_key_col = this.model.get('columns');
primary_key_col = this.model.get('columns');
if (primary_key_col) {
primary_key_col.off('pgadmin:multicolumn:updated');
@ -204,7 +202,7 @@ define('pgadmin.node.unique_constraint', [
this.stopListening(tableCols, 'change:name' , self.resetColOptions);
Backgrid.StringCell.prototype.remove.apply(this, arguments);
}
},
}),
canDelete: true, canAdd: true,
control: Backform.MultiSelectAjaxControl.extend({
@ -217,13 +215,13 @@ define('pgadmin.node.unique_constraint', [
allowClear: true,
width: 'style',
placeholder: gettext('Select the column(s)'),
}
},
}
),
keyPathAccessor: function(obj, path) {
var res = obj;
if(_.isArray(res)) {
return _.map(res, function(o) { return o['column']
return _.map(res, function(o) { return o['column'];
});
}
path = path.split('.');
@ -235,8 +233,8 @@ define('pgadmin.node.unique_constraint', [
return _.isObject(res) && !_.isArray(res) ? null : res;
},
initialize: function() {
// Here we will decide if we need to call URL
// Or fetch the data from parent columns collection
// Here we will decide if we need to call URL
// Or fetch the data from parent columns collection
var self = this;
if(this.model.handler) {
Backform.Select2Control.prototype.initialize.apply(this, arguments);
@ -252,17 +250,16 @@ define('pgadmin.node.unique_constraint', [
Backform.MultiSelectAjaxControl.prototype.initialize.apply(this, arguments);
}
self.model.get('columns').on('pgadmin:multicolumn:updated', function() {
self.render.apply(self);
});
self.render.apply(self);
});
},
resetColOptions: function(m) {
resetColOptions: function() {
var self = this;
setTimeout(function () {
self.custom_options();
self.render.apply(self);
}, 50);
},
custom_options: function() {
// We will add all the columns entered by user in table model
@ -271,73 +268,71 @@ define('pgadmin.node.unique_constraint', [
if (columns.length > 0) {
_.each(columns.models, function(m) {
var col = m.get('name');
if(!_.isUndefined(col) && !_.isNull(col)) {
added_columns_from_tables.push(
{label: col, value: col, image:'icon-column'}
);
}
var col = m.get('name');
if(!_.isUndefined(col) && !_.isNull(col)) {
added_columns_from_tables.push(
{label: col, value: col, image:'icon-column'}
);
}
});
}
// Set the values in to options so that user can select
this.field.set('options', added_columns_from_tables);
},
onChange: function(e) {
onChange: function() {
var self = this,
model = this.model,
$el = $(e.target),
attrArr = this.field.get("name").split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
vals = this.getValueFromDOM(),
collection = model.get(name),
removed = [];
model = this.model,
attrArr = this.field.get('name').split('.'),
name = attrArr.shift(),
vals = this.getValueFromDOM(),
collection = model.get(name),
removed = [];
this.stopListening(this.model, "change:" + name, this.render);
this.stopListening(this.model, 'change:' + name, this.render);
/*
* Iterate through all the values, and find out how many are already
* present in the collection.
*/
/*
* Iterate through all the values, and find out how many are already
* present in the collection.
*/
collection.each(function(m) {
var column = m.get('column'),
idx = _.indexOf(vals, column);
var column = m.get('column'),
idx = _.indexOf(vals, column);
if (idx > -1) {
vals.splice(idx, 1);
} else {
removed.push(column);
}
});
if (idx > -1) {
vals.splice(idx, 1);
} else {
removed.push(column);
}
});
/*
* Adding new values
*/
/*
* Adding new values
*/
_.each(vals, function(v) {
var m = new (self.field.get('model'))(
{column: v}, { silent: true,
top: self.model.top,
collection: collection,
handler: collection
});
{column: v}, { silent: true,
top: self.model.top,
collection: collection,
handler: collection,
});
collection.add(m);
});
/*
* Removing unwanted!
*/
/*
* Removing unwanted!
*/
_.each(removed, function(v) {
collection.remove(collection.where({column: v}));
});
this.listenTo(this.model, "change:" + name, this.render);
this.listenTo(this.model, 'change:' + name, this.render);
},
remove: function() {
if(this.model.handler) {
var self = this,
tableCols = self.model.top.get('columns');
tableCols = self.model.top.get('columns');
self.stopListening(tableCols, 'remove' , self.resetColOptions);
self.stopListening(tableCols, 'change:name' , self.resetColOptions);
self.model.get('columns').off('pgadmin:multicolumn:updated');
@ -347,23 +342,23 @@ define('pgadmin.node.unique_constraint', [
} else {
Backform.MultiSelectAjaxControl.prototype.remove.apply(this, arguments);
}
}
},
}),
deps: ['index'], node: 'column',
model: pgBrowser.Node.Model.extend({
defaults: {
column: undefined
column: undefined,
},
validate: function() {
return null;
}
},
}),
transform : function(data){
var res = [];
if (data && _.isArray(data)) {
_.each(data, function(d) {
res.push({label: d.label, value: d.label, image:'icon-column'});
})
});
}
return res;
},
@ -371,27 +366,27 @@ define('pgadmin.node.unique_constraint', [
disabled: function(m) {
// If we are in table edit mode then
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
&& !m.top.isNew()) {
// If OID is undefined then user is trying to add
// new constraint which should be allowed for Unique
return !_.isUndefined(m.get('oid'));
return !_.isUndefined(m.get('oid'));
}
// We can't update columns of existing index constraint.
if (!m.isNew()) {
return true;
return true;
}
// Disable if index is selected.
var index = m.get('index');
if(_.isUndefined(index) || index == '') {
return false;
} else {
var col = m.get('columns');
col.reset();
return true;
}
if(_.isUndefined(index) || index == '') {
return false;
} else {
var col = m.get('columns');
col.reset();
return true;
}
},{
},
},{
id: 'spcname', label: gettext('Tablespace'),
type: 'text', group: gettext('Definition'),
control: 'node-list-by-name', node: 'tablespace',
@ -399,40 +394,40 @@ define('pgadmin.node.unique_constraint', [
select2:{allowClear:false},
filter: function(m) {
// Don't show pg_global tablespace in selection.
if (m.label == "pg_global") return false;
if (m.label == 'pg_global') return false;
else return true;
},
disabled: function(m) {
// Disable if index is selected.
m = m.top || m;
var index = m.get('index');
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('spcname', '');
},10);
return true;
}
}
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('spcname', '');
},10);
return true;
}
},
},{
id: 'index', label: gettext('Index'),
type: 'text', group: gettext('Definition'),
control: Backform.NodeListByNameControl.extend({
initialize:function() {
if (_.isUndefined(this.model.top)) {
Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments);
} else {
Backform.Control.prototype.initialize.apply(this,arguments);
}
}
initialize:function() {
if (_.isUndefined(this.model.top)) {
Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments);
} else {
Backform.Control.prototype.initialize.apply(this,arguments);
}
},
}),
select2:{allowClear:true}, node: 'index',
disabled: function(m) {
// If we are in table edit mode then disable it
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
return true;
&& !m.top.isNew()) {
return true;
}
// We can't update index of existing index constraint.
@ -441,37 +436,37 @@ define('pgadmin.node.unique_constraint', [
// We will not show this field in Create Table mode
visible: function(m) {
return !_.isUndefined(m.top.node_info['table']);
}
},
},{
id: 'fillfactor', label: gettext('Fill factor'), deps: ['index'],
type: 'int', group: gettext('Definition'), allowNull: true,
disabled: function(m) {
// Disable if index is selected.
var index = m.get('index');
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('fillfactor', null);
},10);
return true;
}
if(_.isUndefined(index) || index == '') {
return false;
} else {
setTimeout(function(){
m.set('fillfactor', null);
},10);
return true;
}
},
},{
id: 'condeferrable', label: gettext('Deferrable?'),
type: 'switch', group: gettext('Definition'), deps: ['index'],
disabled: function(m) {
// If we are in table edit mode then
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
&& !m.top.isNew()) {
// If OID is undefined then user is trying to add
// new constraint which should allowed for Unique
return !_.isUndefined(m.get('oid'));
return !_.isUndefined(m.get('oid'));
}
// We can't update condeferrable of existing index constraint.
if (!m.isNew()) {
return true;
return true;
}
// Disable if index is selected.
var index = m.get('index');
@ -484,7 +479,7 @@ define('pgadmin.node.unique_constraint', [
},10);
return true;
}
}
},
},{
id: 'condeferred', label: gettext('Deferred?'),
type: 'switch', group: gettext('Definition'),
@ -492,10 +487,10 @@ define('pgadmin.node.unique_constraint', [
disabled: function(m) {
// If we are in table edit mode then
if (_.has(m, 'top') && !_.isUndefined(m.top)
&& !m.top.isNew()) {
&& !m.top.isNew()) {
// If OID is undefined then user is trying to add
// new constraint which should allowed for Unique
return !_.isUndefined(m.get('oid'));
return !_.isUndefined(m.get('oid'));
}
// We can't update condeferred of existing index constraint.
@ -507,13 +502,13 @@ define('pgadmin.node.unique_constraint', [
return false;
} else {
setTimeout(function(){
if(m.get('condeferred'))
if(m.get('condeferred'))
m.set('condeferred', false);
},10);
return true;
}
}
}
},
},
],
validate: function() {
this.errorModel.clear();
@ -525,17 +520,17 @@ define('pgadmin.node.unique_constraint', [
var columns = this.get('columns'),
index = this.get('index');
if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
(_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
var msg = gettext('Please specify columns for %(node)s', {node: gettext('Unique constraint')});
this.errorModel.set('columns', msg);
return msg;
}
if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
(_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
var msg = gettext('Please specify columns for %(node)s', {node: gettext('Unique constraint')});
this.errorModel.set('columns', msg);
return msg;
}
return null;
}
})
});
},
}),
});
}
return pgBrowser.Nodes['unique_constraint'];

View File

@ -1,20 +1,21 @@
define('pgadmin.node.constraints', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'pgadmin.browser.collection', 'pgadmin.node.unique_constraint',
'pgadmin.node.check_constraint', 'pgadmin.node.foreign_key',
'pgadmin.node.exclusion_constraint', 'pgadmin.node.primary_key'
], function(gettext, $, _, S, pgAdmin, pgBrowser) {
'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin',
'pgadmin.browser', 'pgadmin.browser.collection',
'pgadmin.node.unique_constraint', 'pgadmin.node.check_constraint',
'pgadmin.node.foreign_key', 'pgadmin.node.exclusion_constraint',
'pgadmin.node.primary_key',
], function(gettext, $, _, pgAdmin, pgBrowser) {
if (!pgBrowser.Nodes['coll-constraints']) {
var databases = pgAdmin.Browser.Nodes['coll-constraints'] =
pgAdmin.Browser.Nodes['coll-constraints'] =
pgAdmin.Browser.Collection.extend({
node: 'constraints',
label: gettext('Constraints'),
type: 'coll-constraints',
getTreeNodeHierarchy: pgBrowser.tableChildTreeNodeHierarchy,
columns: ['name', 'comment']
columns: ['name', 'comment'],
});
};
}
if (!pgBrowser.Nodes['constraints']) {
pgAdmin.Browser.Nodes['constraints'] = pgBrowser.Node.extend({
@ -26,7 +27,7 @@ define('pgadmin.node.constraints', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -36,20 +37,20 @@ define('pgadmin.node.constraints', [
defaults: {
name: undefined,
oid: undefined,
comment: undefined
},
comment: undefined,
},
schema: [{
id: 'name', label: gettext('Name'), type: 'text',
mode: ['properties', 'create', 'edit']
mode: ['properties', 'create', 'edit'],
},{
id: 'oid', label: gettext('Oid'), cell: 'string',
type: 'text' , mode: ['properties']
type: 'text' , mode: ['properties'],
},{
id: 'comment', label: gettext('Comment'), cell: 'string',
type: 'multiline', mode: ['properties', 'create', 'edit']
}]
})
});
type: 'multiline', mode: ['properties', 'create', 'edit'],
}],
}),
});
}
return pgBrowser.Nodes['constraints'];

View File

@ -1,11 +1,14 @@
define('pgadmin.node.index', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'backform', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
'backbone', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
'pgadmin.backform', 'pgadmin.backgrid', 'pgadmin.browser.collection',
], function(
gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser, Alertify, Backform,
Backgrid
) {
if (!pgBrowser.Nodes['coll-index']) {
var databases = pgAdmin.Browser.Nodes['coll-index'] =
pgAdmin.Browser.Nodes['coll-index'] =
pgAdmin.Browser.Collection.extend({
node: 'index',
label: gettext('Indexes'),
@ -16,199 +19,199 @@ define('pgadmin.node.index', [
dialogHelp: url_for('help.static', {'filename': 'index_dialog.html'}),
columns: ['name', 'description'],
hasStatistics: true,
statsPrettifyFields: ['Size', 'Index size']
statsPrettifyFields: ['Size', 'Index size'],
});
};
}
// Node-Ajax-Cell with Deps
var NodeAjaxOptionsDepsCell = Backgrid.Extension.NodeAjaxOptionsCell.extend({
initialize: function() {
Backgrid.Extension.NodeAjaxOptionsCell.prototype.initialize.apply(this, arguments);
Backgrid.Extension.DependentCell.prototype.initialize.apply(this, arguments);
},
dependentChanged: function () {
var model = this.model,
column = this.column,
editable = this.column.get("editable"),
input = this.$el.find('select').first();
initialize: function() {
Backgrid.Extension.NodeAjaxOptionsCell.prototype.initialize.apply(this, arguments);
Backgrid.Extension.DependentCell.prototype.initialize.apply(this, arguments);
},
dependentChanged: function () {
var model = this.model,
column = this.column,
editable = this.column.get('editable'),
input = this.$el.find('select').first();
var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable) {
this.$el.addClass("editable");
input.prop('disabled', false);
} else {
this.$el.removeClass("editable");
input.prop('disabled', true);
}
var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable) {
this.$el.addClass('editable');
input.prop('disabled', false);
} else {
this.$el.removeClass('editable');
input.prop('disabled', true);
}
this.delegateEvents();
return this;
},
remove: Backgrid.Extension.DependentCell.prototype.remove
});
this.delegateEvents();
return this;
},
remove: Backgrid.Extension.DependentCell.prototype.remove,
});
// Model to create column collection control
var ColumnModel = pgAdmin.Browser.Node.Model.extend({
defaults: {
colname: undefined,
collspcname: undefined,
op_class: undefined,
sort_order: false,
nulls: false,
is_sort_nulls_applicable: true
},
schema: [
{
id: 'colname', label: gettext('Column'), cell: 'node-list-by-name',
type: 'text', disabled: 'inSchemaWithModelCheck', editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
}
return !(m.inSchemaWithModelCheck.apply(this, arguments));
},
control: 'node-list-by-name', node: 'column'
},{
id: 'collspcname', label: gettext('Collation'),
cell: NodeAjaxOptionsDepsCell,
type: 'text', disabled: 'inSchemaWithModelCheck', editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
}
return !(m.inSchemaWithModelCheck.apply(this, arguments));
},
control: 'node-ajax-options', url: 'get_collations', node: 'index'
},{
id: 'op_class', label: gettext('Operator class'),
cell: NodeAjaxOptionsDepsCell, tags: true,
type: 'text', disabled: 'checkAccessMethod',
editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
} else if (m.inSchemaWithModelCheck.apply(this, arguments)) {
return false;
}
return !(m.checkAccessMethod.apply(this, arguments));
},
control: 'node-ajax-options', url: 'get_op_class', node: 'index',
deps: ['amname'], transform: function(data, control) {
/* We need to extract data from collection according
* to access method selected by user if not selected
* send btree related op_class options
*/
var amname = control.model.top.get('amname'),
options = data['btree'];
if(_.isUndefined(amname))
return options;
_.each(data, function(v, k) {
if(amname === k) {
options = v;
}
});
return options;
}
},{
id: 'sort_order', label: gettext('Sort order'),
cell: Backgrid.Extension.TableChildSwitchCell, type: 'switch',
editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
} else if (m.inSchemaWithModelCheck.apply(this, arguments)) {
return false;
} else if (m.top.get('amname') === 'btree') {
m.set('is_sort_nulls_applicable', true);
return true;
} else {
m.set('is_sort_nulls_applicable', false);
return false;
}
},
deps: ['amname'],
options: {
'onText': 'DESC', 'offText': 'ASC',
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
},{
id: 'nulls', label: gettext('NULLs'),
cell: Backgrid.Extension.TableChildSwitchCell, type: 'switch',
editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
} else if (m.inSchemaWithModelCheck.apply(this, arguments)) {
return false;
} else if (m.top.get('amname') === 'btree') {
m.set('is_sort_nulls_applicable', true);
return true;
} else {
m.set('is_sort_nulls_applicable', false);
return false;
}
},
deps: ['amname', 'sort_order'],
options: {
'onText': 'FIRST', 'offText': 'LAST',
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
}
],
validate: function() {
this.errorModel.clear();
if (_.isUndefined(this.get('colname'))
|| String(this.get('colname')).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Column Name cannot be empty.');
this.errorModel.set('colname', msg);
return msg;
// Model to create column collection control
var ColumnModel = pgAdmin.Browser.Node.Model.extend({
defaults: {
colname: undefined,
collspcname: undefined,
op_class: undefined,
sort_order: false,
nulls: false,
is_sort_nulls_applicable: true,
},
schema: [
{
id: 'colname', label: gettext('Column'), cell: 'node-list-by-name',
type: 'text', disabled: 'inSchemaWithModelCheck', editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
}
return !(m.inSchemaWithModelCheck.apply(this, arguments));
},
// We will check if we are under schema node
inSchema: function() {
if(this.node_info && 'catalog' in this.node_info) {
control: 'node-list-by-name', node: 'column',
},{
id: 'collspcname', label: gettext('Collation'),
cell: NodeAjaxOptionsDepsCell,
type: 'text', disabled: 'inSchemaWithModelCheck', editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
}
return !(m.inSchemaWithModelCheck.apply(this, arguments));
},
control: 'node-ajax-options', url: 'get_collations', node: 'index',
},{
id: 'op_class', label: gettext('Operator class'),
cell: NodeAjaxOptionsDepsCell, tags: true,
type: 'text', disabled: 'checkAccessMethod',
editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
} else if (m.inSchemaWithModelCheck.apply(this, arguments)) {
return false;
}
return !(m.checkAccessMethod.apply(this, arguments));
},
control: 'node-ajax-options', url: 'get_op_class', node: 'index',
deps: ['amname'], transform: function(data, control) {
/* We need to extract data from collection according
* to access method selected by user if not selected
* send btree related op_class options
*/
var amname = control.model.top.get('amname'),
options = data['btree'];
if(_.isUndefined(amname))
return options;
_.each(data, function(v, k) {
if(amname === k) {
options = v;
}
});
return options;
},
},{
id: 'sort_order', label: gettext('Sort order'),
cell: Backgrid.Extension.TableChildSwitchCell, type: 'switch',
editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
} else if (m.inSchemaWithModelCheck.apply(this, arguments)) {
return false;
} else if (m.top.get('amname') === 'btree') {
m.set('is_sort_nulls_applicable', true);
return true;
} else {
m.set('is_sort_nulls_applicable', false);
return false;
}
},
deps: ['amname'],
options: {
'onText': 'DESC', 'offText': 'ASC',
'onColor': 'success', 'offColor': 'primary',
'size': 'small',
},
},{
id: 'nulls', label: gettext('NULLs'),
cell: Backgrid.Extension.TableChildSwitchCell, type: 'switch',
editable: function(m) {
// Header cell then skip
if (m instanceof Backbone.Collection) {
return false;
} else if (m.inSchemaWithModelCheck.apply(this, arguments)) {
return false;
} else if (m.top.get('amname') === 'btree') {
m.set('is_sort_nulls_applicable', true);
return true;
} else {
m.set('is_sort_nulls_applicable', false);
return false;
}
},
deps: ['amname', 'sort_order'],
options: {
'onText': 'FIRST', 'offText': 'LAST',
'onColor': 'success', 'offColor': 'primary',
'size': 'small',
},
},
],
validate: function() {
this.errorModel.clear();
if (_.isUndefined(this.get('colname'))
|| String(this.get('colname')).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Column Name cannot be empty.');
this.errorModel.set('colname', msg);
return msg;
}
},
// We will check if we are under schema node
inSchema: function() {
if(this.node_info && 'catalog' in this.node_info) {
return true;
}
return false;
},
// We will check if we are under schema node & in 'create' mode
inSchemaWithModelCheck: function(m) {
if(m.top.node_info && 'schema' in m.top.node_info) {
// We will disable control if it's in 'edit' mode
if (m.top.isNew()) {
return false;
},
// We will check if we are under schema node & in 'create' mode
inSchemaWithModelCheck: function(m) {
if(m.top.node_info && 'schema' in m.top.node_info) {
// We will disable control if it's in 'edit' mode
if (m.top.isNew()) {
return false;
} else {
return true;
}
}
} else {
return true;
},
// We will check if we are under schema node and added condition
checkAccessMethod: function(m) {
//Access method is empty or btree then do not disable field
var parent_model = m.top;
if(_.isUndefined(parent_model.get('amname')) ||
_.isNull(parent_model.get('amname')) ||
String(parent_model.get('amname')).replace(/^\s+|\s+$/g, '') == '' ||
parent_model.get('amname') === 'btree') {
}
}
return true;
},
// We will check if we are under schema node and added condition
checkAccessMethod: function(m) {
//Access method is empty or btree then do not disable field
var parent_model = m.top;
if(_.isUndefined(parent_model.get('amname')) ||
_.isNull(parent_model.get('amname')) ||
String(parent_model.get('amname')).replace(/^\s+|\s+$/g, '') == '' ||
parent_model.get('amname') === 'btree') {
// We need to set nulls to true if sort_order is set to desc
// nulls first is default for desc
if(m.get('sort_order') == true && m.previous('sort_order') == false) {
setTimeout(function() { m.set('nulls', true) }, 10);
}
}
else {
m.set('is_sort_nulls_applicable', false);
}
return false;
if(m.get('sort_order') == true && m.previous('sort_order') == false) {
setTimeout(function() { m.set('nulls', true); }, 10);
}
});
}
else {
m.set('is_sort_nulls_applicable', false);
}
return false;
},
});
if (!pgBrowser.Nodes['index']) {
pgAdmin.Browser.Nodes['index'] = pgBrowser.Node.extend({
@ -226,7 +229,7 @@ define('pgadmin.node.index', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -235,32 +238,32 @@ define('pgadmin.node.index', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Index...'),
icon: 'wcTabIcon icon-index', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_index', node: 'index', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Index...'),
icon: 'wcTabIcon icon-index', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_index_onTable', node: 'table', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Index...'),
icon: 'wcTabIcon icon-index', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_index_onPartition', node: 'partition', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Index...'),
icon: 'wcTabIcon icon-index', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_index_onMatView', node: 'mview', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 5, label: gettext('Index...'),
icon: 'wcTabIcon icon-index', data: {action: 'create', check: true},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
canDrop: pgBrowser.Nodes['schema'].canChildDrop,
@ -274,14 +277,14 @@ define('pgadmin.node.index', [
nspname: undefined,
tabname: undefined,
spcname: undefined,
amname: 'btree'
amname: 'btree',
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: 'inSchema'
type: 'text', disabled: 'inSchema',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'int', disabled: true, mode: ['edit', 'properties']
type: 'int', disabled: true, mode: ['edit', 'properties'],
},{
id: 'spcname', label: gettext('Tablespace'), cell: 'string',
control: 'node-list-by-name', node: 'tablespace',
@ -294,7 +297,7 @@ define('pgadmin.node.index', [
return false;
}
return true;
}
},
},{
id: 'amname', label: gettext('Access Method'), cell: 'string',
type: 'text', mode: ['properties', 'create', 'edit'],
@ -305,63 +308,63 @@ define('pgadmin.node.index', [
onChange: function() {
Backform.NodeAjaxOptionsControl.prototype.onChange.apply(this, arguments);
var self = this,
// current access method
current_am = self.model.get('amname'),
// previous access method
previous_am = self.model.previous('amname');
// current access method
current_am = self.model.get('amname'),
// previous access method
previous_am = self.model.previous('amname');
if (current_am != previous_am && self.model.get('columns').length !== 0) {
var msg = gettext('Changing access method will clear columns collection');
alertify.confirm(msg, function (e) {
// User clicks Ok, lets clear collection
var column_collection = self.model.get('columns'),
col_length = column_collection.length;
for (var i=(col_length-1);i>=0;i--) {
column_collection.remove(column_collection.models[i]);
}
}, function() {
// User clicks Cancel set previous value again in combo box
setTimeout(function(){
self.model.set('amname', previous_am);
}, 10);
Alertify.confirm(msg, function () {
// User clicks Ok, lets clear collection
var column_collection = self.model.get('columns'),
col_length = column_collection.length;
for (var i=(col_length-1);i>=0;i--) {
column_collection.remove(column_collection.models[i]);
}
}, function() {
// User clicks Cancel set previous value again in combo box
setTimeout(function(){
self.model.set('amname', previous_am);
}, 10);
});
}
}
})
},
}),
},{
id: 'cols', label: gettext('Columns'), cell: 'string',
type: 'text', disabled: 'inSchema', mode: ['properties'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'fillfactor', label: gettext('Fill factor'), cell: 'string',
type: 'int', disabled: 'inSchema', mode: ['create', 'edit', 'properties'],
min: 10, max:100, group: gettext('Definition')
min: 10, max:100, group: gettext('Definition'),
},{
id: 'indisunique', label: gettext('Unique?'), cell: 'string',
type: 'switch', disabled: 'inSchemaWithModelCheck',
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'indisclustered', label: gettext('Clustered?'), cell: 'string',
type: 'switch', disabled: 'inSchema',
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'indisvalid', label: gettext('Valid?'), cell: 'string',
type: 'switch', disabled: true, mode: ['properties'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'indisprimary', label: gettext('Primary?'), cell: 'string',
type: 'switch', disabled: true, mode: ['properties'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'is_sys_idx', label: gettext('System index?'), cell: 'string',
type: 'switch', disabled: true, mode: ['properties']
type: 'switch', disabled: true, mode: ['properties'],
},{
id: 'isconcurrent', label: gettext('Concurrent build?'), cell: 'string',
type: 'switch', disabled: 'inSchemaWithModelCheck',
mode: ['create', 'edit'], group: gettext('Definition')
mode: ['create', 'edit'], group: gettext('Definition'),
},{
id: 'indconstraint', label: gettext('Constraint'), cell: 'string',
type: 'text', disabled: 'inSchemaWithModelCheck', mode: ['create', 'edit'],
control: 'sql-field', visible: true, group: gettext('Definition')
control: 'sql-field', visible: true, group: gettext('Definition'),
},{
id: 'columns', label: gettext('Columns'), type: 'collection', deps: ['amname'],
group: gettext('Definition'), model: ColumnModel, mode: ['edit', 'create'],
@ -383,17 +386,15 @@ define('pgadmin.node.index', [
}
},
control: 'unique-col-collection', uniqueCol : ['colname'],
columns: ['colname', 'op_class', 'sort_order', 'nulls', 'collspcname']
columns: ['colname', 'op_class', 'sort_order', 'nulls', 'collspcname'],
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', mode: ['properties', 'create', 'edit'],
disabled: 'inSchema'
}
disabled: 'inSchema',
},
],
validate: function(keys) {
var err = {},
changedAttrs = this.changed,
msg = undefined;
var msg;
// Nothing to validate
if (keys && keys.length == 0) {
@ -404,19 +405,19 @@ define('pgadmin.node.index', [
}
if (_.isUndefined(this.get('name'))
|| String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
|| String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Name cannot be empty.');
this.errorModel.set('name', msg);
return msg;
}
if (_.isUndefined(this.get('spcname'))
|| String(this.get('spcname')).replace(/^\s+|\s+$/g, '') == '') {
|| String(this.get('spcname')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Tablespace cannot be empty.');
this.errorModel.set('spcname', msg);
return msg;
}
if (_.isUndefined(this.get('amname'))
|| String(this.get('amname')).replace(/^\s+|\s+$/g, '') == '') {
|| String(this.get('amname')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Access method cannot be empty.');
this.errorModel.set('amname', msg);
return msg;
@ -424,15 +425,15 @@ define('pgadmin.node.index', [
// Checks if all columns has names
var cols = this.get('columns');
if(cols && cols.length > 0) {
if(!_.every(cols.pluck('colname'))) {
msg = gettext('You must specify column name.');
this.errorModel.set('columns', msg);
return msg;
}
if(!_.every(cols.pluck('colname'))) {
msg = gettext('You must specify column name.');
this.errorModel.set('columns', msg);
return msg;
}
} else if(cols){
msg = gettext('You must specify at least one column.');
this.errorModel.set('columns', msg);
return msg;
msg = gettext('You must specify at least one column.');
this.errorModel.set('columns', msg);
return msg;
}
return null;
},
@ -469,47 +470,47 @@ define('pgadmin.node.index', [
} else {
return true;
}
}
}
}
return true;
}
},
}),
// Below function will enable right click menu for creating column
canCreate: function(itemData, item, data) {
// If check is false then , we will allow create menu
if (data && data.check == false)
return true;
// If check is false then , we will allow create menu
if (data && data.check == false)
return true;
var t = pgBrowser.tree, i = item, d = itemData, parents = [],
immediate_parent_table_found = false,
is_immediate_parent_table_partitioned = false;
// To iterate over tree to check parent node
while (i) {
// Do not allow creating index on partitioned tables.
if (!immediate_parent_table_found &&
_.indexOf(['table', 'partition'], d._type) > -1) {
immediate_parent_table_found = true;
if ('is_partitioned' in d && d.is_partitioned) {
is_immediate_parent_table_partitioned = true;
}
var t = pgBrowser.tree, i = item, d = itemData, parents = [],
immediate_parent_table_found = false,
is_immediate_parent_table_partitioned = false;
// To iterate over tree to check parent node
while (i) {
// Do not allow creating index on partitioned tables.
if (!immediate_parent_table_found &&
_.indexOf(['table', 'partition'], d._type) > -1) {
immediate_parent_table_found = true;
if ('is_partitioned' in d && d.is_partitioned) {
is_immediate_parent_table_partitioned = true;
}
}
// If it is schema then allow user to create index
if (_.indexOf(['schema'], d._type) > -1)
return !is_immediate_parent_table_partitioned;
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// If node is under catalog then do not allow 'create' menu
if (_.indexOf(parents, 'catalog') > -1) {
return false;
} else {
// If it is schema then allow user to create index
if (_.indexOf(['schema'], d._type) > -1)
return !is_immediate_parent_table_partitioned;
}
}
});
}
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// If node is under catalog then do not allow 'create' menu
if (_.indexOf(parents, 'catalog') > -1) {
return false;
} else {
return !is_immediate_parent_table_partitioned;
}
},
});
}
return pgBrowser.Nodes['index'];
});

View File

@ -1,7 +1,7 @@
define('pgadmin.node.rule', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'codemirror'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, CodeMirror) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
/**
Create and add a rule collection into nodes
@ -11,13 +11,13 @@ define('pgadmin.node.rule', [
display under under properties.
*/
if (!pgBrowser.Nodes['coll-rule']) {
var rules = pgAdmin.Browser.Nodes['coll-rule'] =
pgAdmin.Browser.Nodes['coll-rule'] =
pgAdmin.Browser.Collection.extend({
node: 'rule',
label: gettext('Rules'),
type: 'coll-rule',
getTreeNodeHierarchy: pgBrowser.tableChildTreeNodeHierarchy,
columns: ["name", "owner", "comment"]
columns: ['name', 'owner', 'comment'],
});
}
@ -65,7 +65,7 @@ define('pgadmin.node.rule', [
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -81,32 +81,32 @@ define('pgadmin.node.rule', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: gettext('Rule...'),
icon: 'wcTabIcon icon-rule', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_rule_onView', node: 'view', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 5, label: gettext('Rule...'),
icon: 'wcTabIcon icon-rule', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_rule', node: 'rule', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: gettext('Rule...'),
icon: 'wcTabIcon icon-rule', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_rule', node: 'table', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Rule...'),
icon: 'wcTabIcon icon-rule', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_rule', node: 'partition', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Rule...'),
icon: 'wcTabIcon icon-rule', data: {action: 'create', check: true},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
@ -119,7 +119,7 @@ define('pgadmin.node.rule', [
id: 'name', label: gettext('Name'),
type: 'text', disabled: function(m) {
// disable name field it it is system rule
if (m && m.get('name') == "_RETURN") {
if (m && m.get('name') == '_RETURN') {
return true;
}
if (m.isNew()) {
@ -128,18 +128,18 @@ define('pgadmin.node.rule', [
return false;
}
return true;
}
},
},
{
id: 'oid', label: gettext('OID'),
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},
{
id: 'schema', label:'',
type: 'text', visible: false, disabled: function(m) {
// It is used while generating sql
m.set('schema', m.node_info.schema.label);
}
},
},
{
id: 'view', label:'',
@ -147,47 +147,47 @@ define('pgadmin.node.rule', [
// It is used while generating sql
m.set('view', this.node_data.label);
}
},
},
{
id: 'event', label: gettext('Event'), control: 'select2',
group: gettext('Definition'), type: 'text',
select2: {
width: '100%',
allowClear: false
allowClear: false,
},
options:[
{label: 'Select', value: 'Select'},
{label: 'Insert', value: 'Insert'},
{label: 'Update', value: 'Update'},
{label: 'Delete', value: 'Delete'}
]
{label: 'Delete', value: 'Delete'},
],
},
{
id: 'do_instead', label: gettext('Do Instead'), group: gettext('Definition'),
type: 'switch'
type: 'switch',
},
{
id: 'condition', label: gettext('Condition'),
type: 'text', group: gettext('Definition'),
control: Backform.SqlFieldControl
control: Backform.SqlFieldControl,
},
{
id: 'statements', label: gettext('Commands'),
type: 'text', group: gettext('Definition'),
control: Backform.SqlFieldControl
control: Backform.SqlFieldControl,
},
{
id: 'system_rule', label: gettext('System rule?'),
type: 'switch', mode: ['properties']
type: 'switch', mode: ['properties'],
},
{
id: 'enabled', label: gettext('Enabled?'),
type: 'switch', mode: ['properties']
type: 'switch', mode: ['properties'],
},
{
id: 'comment', label: gettext('Comment'), cell: 'string', type: 'multiline'
}
id: 'comment', label: gettext('Comment'), cell: 'string', type: 'multiline',
},
],
validate: function() {
@ -208,7 +208,7 @@ define('pgadmin.node.rule', [
this.errorModel.unset('name');
}
return null;
}
},
}),
// Show or hide create rule menu option on parent node
@ -231,7 +231,6 @@ define('pgadmin.node.rule', [
//Check if we are not child of rule
var prev_i = t.hasParent(i) ? t.parent(i) : null,
prev_d = prev_i ? t.itemData(prev_i) : null,
prev_j = t.hasParent(prev_i) ? t.parent(prev_i) : null,
prev_e = prev_j ? t.itemData(prev_j) : null,
prev_k = t.hasParent(prev_j) ? t.parent(prev_j) : null,
@ -249,7 +248,6 @@ define('pgadmin.node.rule', [
*/
else if('view' == d._type || 'table' == d._type){
prev_i = t.hasParent(i) ? t.parent(i) : null;
prev_d = prev_i ? t.itemData(prev_i) : null;
prev_j = t.hasParent(prev_i) ? t.parent(prev_i) : null;
prev_e = prev_j ? t.itemData(prev_j) : null;
if(prev_e._type == 'schema') {
@ -265,9 +263,9 @@ define('pgadmin.node.rule', [
// By default we do not want to allow create menu
return true;
}
},
});
});
}
return pgBrowser.Nodes['coll-rule'];

View File

@ -1,30 +1,30 @@
define('pgadmin.node.table_partition_utils',
['sources/gettext', 'jquery', 'underscore', 'pgadmin.browser',
'backform','backgrid', 'pgadmin.browser.collection'],
function(gettext, $, _, pgBrowser, Backform, Backgrid) {
define('pgadmin.node.table_partition_utils', [
'sources/gettext', 'jquery', 'underscore', 'backbone', 'pgadmin.browser',
'pgadmin.backform','pgadmin.backgrid', 'pgadmin.browser.collection',
], function(gettext, $, _, Backbone, pgBrowser, Backform, Backgrid) {
Backgrid.PartitionRow = Backgrid.Row.extend({
modelDuplicateColor: "lightYellow",
modelDuplicateColor: 'lightYellow',
modelUniqueColor: "#fff",
modelUniqueColor: '#fff',
initialize: function () {
Backgrid.Row.prototype.initialize.apply(this, arguments);
var self = this;
self.model.on("change:is_attach", function() {
self.model.on('change:is_attach', function() {
setTimeout(function() {
self.columns.each(function(col) {
if (col.get('name') == 'partition_name') {
var idx = self.columns.indexOf(col),
cf = col.get("cellFunction"),
cf = col.get('cellFunction'),
cell = new (cf.apply(col, [self.model]))({
column: col,
model: self.model
model: self.model,
}),
oldCell = self.cells[idx];
oldCell.remove();
self.cells[idx] = cell;
self.render();
oldCell = self.cells[idx];
oldCell.remove();
self.cells[idx] = cell;
self.render();
}
});
}, 10);
@ -33,16 +33,16 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
self.listenTo(self.model, 'pgadmin-session:model:unique', self.modelUnique);
},
modelDuplicate: function() {
$(this.el).removeClass("new");
$(this.el).removeClass('new');
this.el.style.backgroundColor = this.modelDuplicateColor;
},
modelUnique: function() {
this.el.style.backgroundColor = this.modelUniqueColor;
}
},
});
var getPartitionCell = function(model) {
var is_attach = model.get("is_attach");
var is_attach = model.get('is_attach');
if (is_attach) {
var options = [];
model.set({'partition_name': undefined}, {silent:true});
@ -57,147 +57,148 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
};
Backform.PartitionKeyModel = pgBrowser.Node.Model.extend({
defaults: {
key_type: 'column',
pt_column: undefined,
expression: undefined
},
keys:['pt_column'],
schema: [{
id: 'key_type', label: gettext('Key type'), type:'select2', editable: true,
cell:'select2', cellHeaderClasses: 'width_percent_25',
select2: {allowClear: false},
options:[{
label: gettext('Column'), value: 'column'
},{
label: gettext('Expression'), value: 'expression'
}]
},{
id: 'pt_column', label: gettext('Column'), type:'text',
cell: Backgrid.Extension.Select2DepCell.extend({
keyPathAccessor: function(obj, path) {
var res = obj;
if(_.isArray(res)) {
return _.map(res, function(o) { return o['pt_column']
});
}
path = path.split('.');
for (var i = 0; i < path.length; i++) {
if (_.isNull(res)) return null;
if (_.isEmpty(path[i])) continue;
if (!_.isUndefined(res[path[i]])) res = res[path[i]];
}
return _.isObject(res) && !_.isArray(res) ? null : res;
},
initialize: function() {
defaults: {
key_type: 'column',
pt_column: undefined,
expression: undefined,
},
keys:['pt_column'],
schema: [{
id: 'key_type', label: gettext('Key type'), type:'select2', editable: true,
cell:'select2', cellHeaderClasses: 'width_percent_25',
select2: {allowClear: false},
options:[{
label: gettext('Column'), value: 'column',
},{
label: gettext('Expression'), value: 'expression',
}],
},{
id: 'pt_column', label: gettext('Column'), type:'text',
cell: Backgrid.Extension.Select2DepCell.extend({
keyPathAccessor: function(obj, path) {
var res = obj;
if(_.isArray(res)) {
return _.map(res, function(o) { return o['pt_column'];
});
}
path = path.split('.');
for (var i = 0; i < path.length; i++) {
if (_.isNull(res)) return null;
if (_.isEmpty(path[i])) continue;
if (!_.isUndefined(res[path[i]])) res = res[path[i]];
}
return _.isObject(res) && !_.isArray(res) ? null : res;
},
initialize: function() {
// Here we will decide if we need to call URL
// Or fetch the data from parent columns collection
var self = this;
if(this.model.handler) {
Backgrid.Extension.Select2DepCell.prototype.initialize.apply(this, arguments);
var self = this;
if(this.model.handler) {
Backgrid.Extension.Select2DepCell.prototype.initialize.apply(this, arguments);
// Do not listen for any event(s) for existing constraint.
if (_.isUndefined(self.model.get('oid'))) {
var tableCols = self.model.top.get('columns');
self.listenTo(tableCols, 'remove' , self.resetColOptions);
self.listenTo(tableCols, 'change:name', self.resetColOptions);
}
if (_.isUndefined(self.model.get('oid'))) {
var tableCols = self.model.top.get('columns');
self.listenTo(tableCols, 'remove' , self.resetColOptions);
self.listenTo(tableCols, 'change:name', self.resetColOptions);
}
self.custom_options();
}
},
resetColOptions: function(m) {
var self = this;
self.custom_options();
}
},
resetColOptions: function() {
var self = this;
setTimeout(function () {
self.custom_options();
self.render.apply(self);
}, 50);
},
custom_options: function() {
setTimeout(function () {
self.custom_options();
self.render.apply(self);
}, 50);
},
custom_options: function() {
// We will add all the columns entered by user in table model
var columns = this.model.top.get('columns'),
typename = this.model.top.get('typname'),
of_types_tables = this.model.top.of_types_tables,
added_columns_from_tables = [];
var columns = this.model.top.get('columns'),
typename = this.model.top.get('typname'),
of_types_tables = this.model.top.of_types_tables,
added_columns_from_tables = [];
if (columns.length > 0) {
_.each(columns.models, function(m) {
var col = m.get('name');
if(!_.isUndefined(col) && !_.isNull(col)) {
added_columns_from_tables.push(
if (columns.length > 0) {
_.each(columns.models, function(m) {
var col = m.get('name');
if(!_.isUndefined(col) && !_.isNull(col)) {
added_columns_from_tables.push(
{label: col, value: col, image:'icon-column'}
);
}
});
} else if (!_.isUndefined(typename) && !_.isNull(typename)
}
});
} else if (!_.isUndefined(typename) && !_.isNull(typename)
&& !_.isUndefined(of_types_tables) && of_types_tables.length > 0) {
// Iterate through all the of_type tables
_.each(of_types_tables, function(type) {
if (type.label == typename) {
_.each(of_types_tables, function(type) {
if (type.label == typename) {
// Iterate all the columns of selected "OF TYPE".
_.each(type.oftype_columns, function(col) {
added_columns_from_tables.push(
_.each(type.oftype_columns, function(col) {
added_columns_from_tables.push(
{label: col.name, value: col.name, image:'icon-column'}
);
});
}
});
}
});
}
});
}
// Set the values in to options so that user can select
this.column.set('options', added_columns_from_tables);
},
remove: function() {
if(this.model.handler) {
var self = this,
tableCols = self.model.top.get('columns');
self.stopListening(tableCols, 'remove' , self.resetColOptions);
self.stopListening(tableCols, 'change:name' , self.resetColOptions);
Backgrid.Extension.Select2DepCell.prototype.remove.apply(this, arguments);
}
}
}),
deps: ['key_type'],
cellHeaderClasses: 'width_percent_30',
transform : function(data){
var res = [];
if (data && _.isArray(data)) {
_.each(data, function(d) {
res.push({label: d.label, value: d.label, image:'icon-column'});
})
}
return res;
},
select2:{allowClear:false},
editable: function(m) {
if (m.get('key_type') == 'expression') {
setTimeout( function() {
m.set('pt_column', undefined);
}, 10);
return false;
}
return true;
}
},{
id: 'expression', label: gettext('Expression'), type:'text',
cell:Backgrid.Extension.StringDepCell,
cellHeaderClasses: 'width_percent_45',
deps: ['key_type'],
editable: function(m) {
if (m.get('key_type') == 'column') {
setTimeout( function() {
m.set('expression', undefined);
}, 10);
return false;
}
return true;
}
}
this.column.set('options', added_columns_from_tables);
},
remove: function() {
if(this.model.handler) {
var self = this,
tableCols = self.model.top.get('columns');
self.stopListening(tableCols, 'remove' , self.resetColOptions);
self.stopListening(tableCols, 'change:name' , self.resetColOptions);
Backgrid.Extension.Select2DepCell.prototype.remove.apply(this, arguments);
}
},
}),
deps: ['key_type'],
cellHeaderClasses: 'width_percent_30',
transform : function(data){
var res = [];
if (data && _.isArray(data)) {
_.each(data, function(d) {
res.push({label: d.label, value: d.label, image:'icon-column'});
});
}
return res;
},
select2:{allowClear:false},
editable: function(m) {
if (m.get('key_type') == 'expression') {
setTimeout( function() {
m.set('pt_column', undefined);
}, 10);
return false;
}
return true;
},
},{
id: 'expression', label: gettext('Expression'), type:'text',
cell:Backgrid.Extension.StringDepCell,
cellHeaderClasses: 'width_percent_45',
deps: ['key_type'],
editable: function(m) {
if (m.get('key_type') == 'column') {
setTimeout( function() {
m.set('expression', undefined);
}, 10);
return false;
}
return true;
},
},
],
validate: function(keys) {
validate: function() {
var col_type = this.get('key_type'),
pt_column = this.get('pt_column'),
expression = this.get('expression');
pt_column = this.get('pt_column'),
expression = this.get('expression'),
msg;
// Have to clear existing validation before initiating current state
// validation only
@ -205,27 +206,27 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
if (_.isUndefined(col_type) || _.isNull(col_type) ||
String(col_type).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Partition key type cannot be empty.');
msg = gettext('Partition key type cannot be empty.');
this.errorModel.set('key_type', msg);
return msg;
}
else if (col_type == 'column' &&
_.isUndefined(pt_column) || _.isNull(pt_column) ||
String(pt_column).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Partition key column cannot be empty.');
msg = gettext('Partition key column cannot be empty.');
this.errorModel.set('pt_column', msg);
return msg;
}
else if (col_type == 'expression' &&
_.isUndefined(expression) || _.isNull(expression) ||
String(expression).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Partition key expression cannot be empty.');
msg = gettext('Partition key expression cannot be empty.');
this.errorModel.set('expression', msg);
return msg;
}
return null;
}
},
});
Backform.PartitionsModel = pgBrowser.Node.Model.extend({
@ -235,11 +236,11 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
partition_name: undefined,
values_from: undefined,
values_to: undefined,
values_in: undefined
values_in: undefined,
},
keys:['partition_name'],
schema: [{
id: 'oid', label: gettext('OID'), type: 'text'
id: 'oid', label: gettext('OID'), type: 'text',
},{
id: 'is_attach', label:gettext('Operation'), cell: 'switch',
type: 'switch', options: { 'onText': gettext('Attach'), 'offText': gettext('Create')},
@ -248,7 +249,7 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
if (m instanceof Backbone.Model && m.isNew() && !m.top.isNew())
return true;
return false;
}
},
},{
id: 'partition_name', label: gettext('Name'), type: 'text', cell:'string',
cellHeaderClasses: 'width_percent_25',
@ -256,19 +257,19 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
if (m instanceof Backbone.Model && m.isNew())
return true;
return false;
}, cellFunction: getPartitionCell
}, cellFunction: getPartitionCell,
},{
id: 'values_from', label: gettext('From'), type:'text',
cell:Backgrid.Extension.StringDepCell,
cellHeaderClasses: 'width_percent_20',
editable: function(m) {
if(m.handler && m.handler.top &&
if(m.handler && m.handler.top &&
m.handler.top.attributes &&
m.handler.top.attributes.partition_type == 'range' &&
m instanceof Backbone.Model && m.isNew())
return true;
return false;
}
return false;
},
},{
id: 'values_to', label: gettext('To'), type:'text',
cell:Backgrid.Extension.StringDepCell,
@ -280,7 +281,7 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
m instanceof Backbone.Model && m.isNew())
return true;
return false;
}
},
},{
id: 'values_in', label: gettext('In'), type:'text',
cell:Backgrid.Extension.StringDepCell,
@ -292,13 +293,14 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
m instanceof Backbone.Model && m.isNew())
return true;
return false;
}
},
}],
validate: function(keys) {
validate: function() {
var partition_name = this.get('partition_name'),
values_from = this.get('values_from'),
values_to = this.get('values_to'),
values_in = this.get('values_in');
values_from = this.get('values_from'),
values_to = this.get('values_to'),
values_in = this.get('values_in'),
msg;
// Have to clear existing validation before initiating current state
// validation only
@ -306,34 +308,34 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
if (_.isUndefined(partition_name) || _.isNull(partition_name) ||
String(partition_name).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Partition name cannot be empty.');
this.errorModel.set('partition_name', msg);
return msg;
msg = gettext('Partition name cannot be empty.');
this.errorModel.set('partition_name', msg);
return msg;
}
if (this.top.get('partition_type') == 'range') {
if (_.isUndefined(values_from) || _.isNull(values_from) ||
String(values_from).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('For range partition From field cannot be empty.');
msg = gettext('For range partition From field cannot be empty.');
this.errorModel.set('values_from', msg);
return msg;
} else if (_.isUndefined(values_to) || _.isNull(values_to) ||
String(values_to).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('For range partition To field cannot be empty.');
msg = gettext('For range partition To field cannot be empty.');
this.errorModel.set('values_to', msg);
return msg;
}
} else if (this.top.get('partition_type') == 'list') {
if (_.isUndefined(values_in) || _.isNull(values_in) ||
String(values_in).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('For list partition In field cannot be empty.');
msg = gettext('For list partition In field cannot be empty.');
this.errorModel.set('values_in', msg);
return msg;
}
}
return null;
}
},
});
});

View File

@ -1,10 +1,10 @@
define('pgadmin.node.trigger', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'backform', 'pgadmin.alertifyjs',
'pgadmin.browser.collection'
'pgadmin.browser.collection',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
var CustomSwitchControl = Backform.CustomSwitchControl = Backform.SwitchControl.extend({
Backform.CustomSwitchControl = Backform.SwitchControl.extend({
template: _.template([
'<label class="<%=Backform.controlLabelClassName%> custom_switch_label_class"><%=label%></label>',
'<div class="<%=Backform.controlsClassName%> custom_switch_control_class">',
@ -18,21 +18,21 @@ define('pgadmin.node.trigger', [
'</div>',
'<% if (helpMessage && helpMessage.length) { %>',
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
'<% } %>'
].join("\n")),
className: 'pgadmin-control-group form-group col-xs-6'
'<% } %>',
].join('\n')),
className: 'pgadmin-control-group form-group col-xs-6',
});
if (!pgBrowser.Nodes['coll-trigger']) {
var triggers = pgAdmin.Browser.Nodes['coll-trigger'] =
pgAdmin.Browser.Nodes['coll-trigger'] =
pgAdmin.Browser.Collection.extend({
node: 'trigger',
label: gettext('Triggers'),
type: 'coll-trigger',
getTreeNodeHierarchy: pgBrowser.tableChildTreeNodeHierarchy,
columns: ['name', 'description']
columns: ['name', 'description'],
});
};
}
if (!pgBrowser.Nodes['trigger']) {
pgAdmin.Browser.Nodes['trigger'] = pgBrowser.Node.extend({
@ -50,7 +50,7 @@ define('pgadmin.node.trigger', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -59,42 +59,42 @@ define('pgadmin.node.trigger', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger...'),
icon: 'wcTabIcon icon-trigger', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_trigger', node: 'trigger', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger...'),
icon: 'wcTabIcon icon-trigger', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_trigger_onTable', node: 'table', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger...'),
icon: 'wcTabIcon icon-trigger', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_trigger_onPartition', node: 'partition', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger...'),
icon: 'wcTabIcon icon-trigger', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'enable_trigger', node: 'trigger', module: this,
applies: ['object', 'context'], callback: 'enable_trigger',
category: 'connect', priority: 3, label: gettext('Enable trigger'),
icon: 'fa fa-check', enable : 'canCreate_with_trigger_enable'
icon: 'fa fa-check', enable : 'canCreate_with_trigger_enable',
},{
name: 'disable_trigger', node: 'trigger', module: this,
applies: ['object', 'context'], callback: 'disable_trigger',
category: 'drop', priority: 3, label: gettext('Disable trigger'),
icon: 'fa fa-times', enable : 'canCreate_with_trigger_disable'
icon: 'fa fa-times', enable : 'canCreate_with_trigger_disable',
},{
name: 'create_trigger_onView', node: 'view', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Trigger...'),
icon: 'wcTabIcon icon-trigger', data: {action: 'create', check: true},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
callbacks: {
@ -114,7 +114,7 @@ define('pgadmin.node.trigger', [
url: obj.generate_url(i, 'enable' , d, true),
type:'PUT',
data: {'enable' : true},
dataType: "json",
dataType: 'json',
success: function(res) {
if (res.success == 1) {
alertify.success(res.info);
@ -130,16 +130,18 @@ define('pgadmin.node.trigger', [
}, 10);
}
},
error: function(xhr, status, error) {
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
}
} catch (e) {}
} catch (e) {
console.warn(e.stack || e);
}
t.unload(i);
}
})
},
});
},
/* Disable trigger */
disable_trigger: function(args) {
@ -157,7 +159,7 @@ define('pgadmin.node.trigger', [
url: obj.generate_url(i, 'enable' , d, true),
type:'PUT',
data: {'enable' : false},
dataType: "json",
dataType: 'json',
success: function(res) {
if (res.success == 1) {
alertify.success(res.info);
@ -173,17 +175,19 @@ define('pgadmin.node.trigger', [
}, 10);
}
},
error: function(xhr, status, error) {
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
}
} catch (e) {}
} catch (e) {
console.warn(e.stack || e);
}
t.unload(i);
}
})
}
},
});
},
},
canDrop: pgBrowser.Nodes['schema'].canChildDrop,
canDropCascade: pgBrowser.Nodes['schema'].canChildDrop,
@ -191,18 +195,18 @@ define('pgadmin.node.trigger', [
defaults: {
name: undefined,
is_row_trigger: true,
fires: 'BEFORE'
fires: 'BEFORE',
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: 'inSchema'
type: 'text', disabled: 'inSchema',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'int', disabled: true, mode: ['properties']
type: 'int', disabled: true, mode: ['properties'],
},{
id: 'is_enable_trigger', label: gettext('Trigger enabled?'),
type: 'switch', disabled: 'inSchema', mode: ['edit', 'properties'],
group: gettext('Definition')
group: gettext('Definition'),
},{
id: 'is_row_trigger', label: gettext('Row trigger?'),
type: 'switch', group: gettext('Definition'),
@ -211,10 +215,10 @@ define('pgadmin.node.trigger', [
disabled: function(m) {
// Disabled if table is a partitioned table.
if (_.has(m, 'node_info') && _.has(m.node_info, 'table') &&
_.has(m.node_info.table, 'is_partitioned') && m.node_info.table.is_partitioned)
_.has(m.node_info.table, 'is_partitioned') && m.node_info.table.is_partitioned)
{
setTimeout(function(){
m.set('is_row_trigger', false);
m.set('is_row_trigger', false);
},10);
return true;
@ -224,44 +228,44 @@ define('pgadmin.node.trigger', [
// automatically set to True and becomes disable
var is_constraint_trigger = m.get('is_constraint_trigger');
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
if(!_.isUndefined(is_constraint_trigger) &&
if(!_.isUndefined(is_constraint_trigger) &&
is_constraint_trigger === true) {
// change it's model value
setTimeout(function() { m.set('is_row_trigger', true) }, 10);
return true;
} else {
return false;
}
} else {
// Check if it is row trigger then enabled it.
var is_row_trigger = m.get('is_row_trigger');
if (!_.isUndefined(is_row_trigger) && m.node_info['server']['server_type'] == 'ppas') {
return false;
}
// Disable it
// change it's model value
setTimeout(function() { m.set('is_row_trigger', true); }, 10);
return true;
} else {
return false;
}
} else {
// Check if it is row trigger then enabled it.
var is_row_trigger = m.get('is_row_trigger');
if (!_.isUndefined(is_row_trigger) && m.node_info['server']['server_type'] == 'ppas') {
return false;
}
// Disable it
return true;
}
}
},
},{
id: 'is_constraint_trigger', label: gettext('Constraint trigger?'),
type: 'switch', disabled: 'inSchemaWithModelCheck',
type: 'switch',
mode: ['create','edit', 'properties'],
group: gettext('Definition'),
disabled: function(m) {
// Disabled if table is a partitioned table.
if ((_.has(m, 'node_info') && _.has(m.node_info, 'table') &&
_.has(m.node_info.table, 'is_partitioned') && m.node_info.table.is_partitioned) ||
_.indexOf(Object.keys(m.node_info), 'view') != -1)
{
_.has(m.node_info.table, 'is_partitioned') &&
m.node_info.table.is_partitioned) ||
_.indexOf(Object.keys(m.node_info), 'view') != -1) {
setTimeout(function(){
m.set('is_constraint_trigger', false);
m.set('is_constraint_trigger', false);
},10);
return true;
}
return m.inSchemaWithModelCheck.apply(this, [m]);
}
},
},{
id: 'tgdeferrable', label: gettext('Deferrable?'),
type: 'switch', group: gettext('Definition'),
@ -271,21 +275,21 @@ define('pgadmin.node.trigger', [
// If constraint trigger is set to True then only enable it
var is_constraint_trigger = m.get('is_constraint_trigger');
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
if(!_.isUndefined(is_constraint_trigger) &&
if(!_.isUndefined(is_constraint_trigger) &&
is_constraint_trigger === true) {
return false;
} else {
// If value is already set then reset it to false
if(m.get('tgdeferrable')) {
setTimeout(function() { m.set('tgdeferrable', false) }, 10);
}
return true;
return false;
} else {
// If value is already set then reset it to false
if(m.get('tgdeferrable')) {
setTimeout(function() { m.set('tgdeferrable', false); }, 10);
}
} else {
// Disable it
return true;
}
} else {
// Disable it
return true;
}
}
},
},{
id: 'tginitdeferred', label: gettext('Deferred?'),
type: 'switch', group: gettext('Definition'),
@ -295,28 +299,28 @@ define('pgadmin.node.trigger', [
// If Deferrable is set to True then only enable it
var tgdeferrable = m.get('tgdeferrable');
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
if(!_.isUndefined(tgdeferrable) &&
if(!_.isUndefined(tgdeferrable) &&
tgdeferrable) {
return false;
} else {
// If value is already set then reset it to false
if(m.get('tginitdeferred')) {
setTimeout(function() { m.set('tginitdeferred', false) }, 10);
}
// If constraint trigger is set then do not disable
return m.get('is_constraint_trigger') ? false : true;
return false;
} else {
// If value is already set then reset it to false
if(m.get('tginitdeferred')) {
setTimeout(function() { m.set('tginitdeferred', false); }, 10);
}
// If constraint trigger is set then do not disable
return m.get('is_constraint_trigger') ? false : true;
}
} else {
// Disable it
return true;
// Disable it
return true;
}
}
},
},{
id: 'tfunction', label: gettext('Trigger Function'),
type: 'text', disabled: 'inSchemaWithModelCheck',
mode: ['create','edit', 'properties'], group: gettext('Definition'),
control: 'node-ajax-options', url: 'get_triggerfunctions',
cache_node: 'trigger_function'
cache_node: 'trigger_function',
},{
id: 'tgargs', label: gettext('Arguments'), cell: 'string',
group: gettext('Definition'),
@ -325,190 +329,189 @@ define('pgadmin.node.trigger', [
// We will disable it when EDB PPAS and trigger function is
// set to Inline EDB-SPL
var tfunction = m.get('tfunction'),
server_type = m.node_info['server']['server_type'];
server_type = m.node_info['server']['server_type'];
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
if(server_type === 'ppas' &&
!_.isUndefined(tfunction) &&
tfunction === 'Inline EDB-SPL') {
if(server_type === 'ppas' &&
!_.isUndefined(tfunction) &&
tfunction === 'Inline EDB-SPL') {
// Disable and clear its value
m.set('tgargs', undefined)
return true;
} else {
return false;
}
} else {
// Disable it
m.set('tgargs', undefined);
return true;
} else {
return false;
}
} else {
// Disable it
return true;
}
}
},
},{
id: 'fires', label: gettext('Fires'), deps: ['is_constraint_trigger'],
mode: ['create','edit', 'properties'], group: gettext('Events'),
options: function(control) {
id: 'fires', label: gettext('Fires'), deps: ['is_constraint_trigger'],
mode: ['create','edit', 'properties'], group: gettext('Events'),
options: function(control) {
var table_options = [
{label: "BEFORE", value: "BEFORE"},
{label: "AFTER", value: "AFTER"}],
view_options = [
{label: "BEFORE", value: "BEFORE"},
{label: "AFTER", value: "AFTER"},
{label: "INSTEAD OF", value: "INSTEAD OF"}];
{label: 'BEFORE', value: 'BEFORE'},
{label: 'AFTER', value: 'AFTER'}],
view_options = [
{label: 'BEFORE', value: 'BEFORE'},
{label: 'AFTER', value: 'AFTER'},
{label: 'INSTEAD OF', value: 'INSTEAD OF'}];
// If we are under table then show table specific options
if(_.indexOf(Object.keys(control.model.node_info), 'table') != -1) {
return table_options;
return table_options;
} else {
return view_options;
return view_options;
}
},
// If create mode then by default open composite type
control: 'select2', select2: { allowClear: false, width: "100%" },
disabled: function(m) {
// If contraint trigger is set to True then only enable it
var is_constraint_trigger = m.get('is_constraint_trigger');
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
if(!_.isUndefined(is_constraint_trigger) &&
is_constraint_trigger === true) {
setTimeout(function() { m.set('fires', 'AFTER') }, 10);
},
// If create mode then by default open composite type
control: 'select2', select2: { allowClear: false, width: '100%' },
disabled: function(m) {
// If contraint trigger is set to True then only enable it
var is_constraint_trigger = m.get('is_constraint_trigger');
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
if(!_.isUndefined(is_constraint_trigger) &&
is_constraint_trigger === true) {
setTimeout(function() { m.set('fires', 'AFTER'); }, 10);
return true;
} else {
} else {
return false;
}
} else {
// Check if it is row trigger then enabled it.
var fires_ = m.get('fires');
if (!_.isUndefined(fires_) && m.node_info['server']['server_type'] == 'ppas') {
return false;
}
// Disable it
return true;
}
} else {
// Check if it is row trigger then enabled it.
var fires_ = m.get('fires');
if (!_.isUndefined(fires_) && m.node_info['server']['server_type'] == 'ppas') {
return false;
}
// Disable it
return true;
}
}
},{
type: 'nested', control: 'fieldset', mode: ['create','edit', 'properties'],
label: gettext('Events'), group: gettext('Events'),
schema:[{
},
},{
type: 'nested', control: 'fieldset', mode: ['create','edit', 'properties'],
label: gettext('Events'), group: gettext('Events'),
schema:[{
id: 'evnt_insert', label: gettext('INSERT'),
type: 'switch', mode: ['create','edit', 'properties'],
group: gettext('Events'),
control: Backform.CustomSwitchControl,
disabled: function(m) {
var evn_insert = m.get('evnt_insert');
if (!_.isUndefined(evn_insert) && m.node_info['server']['server_type'] == 'ppas')
return false;
return m.inSchemaWithModelCheck.apply(this, [m]);
}
},{
var evn_insert = m.get('evnt_insert');
if (!_.isUndefined(evn_insert) && m.node_info['server']['server_type'] == 'ppas')
return false;
return m.inSchemaWithModelCheck.apply(this, [m]);
},
},{
id: 'evnt_update', label: gettext('UPDATE'),
type: 'switch', mode: ['create','edit', 'properties'],
group: gettext('Events'),
control: Backform.CustomSwitchControl,
disabled: function(m) {
var evn_update = m.get('evnt_update');
if (!_.isUndefined(evn_update) && m.node_info['server']['server_type'] == 'ppas')
return false;
return m.inSchemaWithModelCheck.apply(this, [m]);
}
},{
var evn_update = m.get('evnt_update');
if (!_.isUndefined(evn_update) && m.node_info['server']['server_type'] == 'ppas')
return false;
return m.inSchemaWithModelCheck.apply(this, [m]);
},
},{
id: 'evnt_delete', label: gettext('DELETE'),
type: 'switch', mode: ['create','edit', 'properties'],
group: gettext('Events'),
control: Backform.CustomSwitchControl,
disabled: function(m) {
var evn_delete = m.get('evnt_delete');
if (!_.isUndefined(evn_delete) && m.node_info['server']['server_type'] == 'ppas')
return false;
return m.inSchemaWithModelCheck.apply(this, [m]);
}
},{
var evn_delete = m.get('evnt_delete');
if (!_.isUndefined(evn_delete) && m.node_info['server']['server_type'] == 'ppas')
return false;
return m.inSchemaWithModelCheck.apply(this, [m]);
},
},{
id: 'evnt_truncate', label: gettext('TRUNCATE'),
type: 'switch', group: gettext('Events'),
control: Backform.CustomSwitchControl,
disabled: function(m) {
var is_constraint_trigger = m.get('is_constraint_trigger'),
var is_constraint_trigger = m.get('is_constraint_trigger'),
is_row_trigger = m.get('is_row_trigger'),
server_type = m.node_info['server']['server_type'];
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
if(!m.inSchemaWithModelCheck.apply(this, [m])) {
// We will enabale truncate only for EDB PPAS
// and both triggers row & constarint are set to false
if(server_type === 'ppas' &&
!_.isUndefined(is_constraint_trigger) &&
!_.isUndefined(is_constraint_trigger) &&
!_.isUndefined(is_row_trigger) &&
is_constraint_trigger === false &&
is_constraint_trigger === false &&
is_row_trigger === false) {
return false;
return false;
} else {
return true;
return true;
}
} else {
} else {
// Disable it
return true;
}
},
}],
},{
id: 'whenclause', label: gettext('When'),
type: 'text', disabled: 'inSchemaWithModelCheck',
mode: ['create', 'edit', 'properties'],
control: 'sql-field', visible: true, group: gettext('Events'),
},{
id: 'columns', label: gettext('Columns'), url: 'nodes',
control: 'node-list-by-name', cache_node: 'column', type: 'array',
select2: {'multiple': true},
deps: ['evnt_update'], node: 'column', group: gettext('Events'),
disabled: function(m) {
if(this.node_info && 'catalog' in this.node_info) {
return true;
}
}
}]
},{
id: 'whenclause', label: gettext('When'),
type: 'text', disabled: 'inSchemaWithModelCheck',
mode: ['create', 'edit', 'properties'],
control: 'sql-field', visible: true, group: gettext('Events')
},{
id: 'columns', label: gettext('Columns'), url: 'nodes',
control: 'node-list-by-name', cache_node: 'column', type: 'array',
select2: {'multiple': true},
deps: ['evnt_update'], node: 'column', group: gettext('Events'),
disabled: function(m) {
if(this.node_info && 'catalog' in this.node_info) {
return true;
}
//Disable in edit mode
if (!m.isNew()) {
return true;
}
// Enable column only if update event is set true
var isUpdate = m.get('evnt_update');
if(!_.isUndefined(isUpdate) && isUpdate) {
return false;
}
return true;
//Disable in edit mode
if (!m.isNew()) {
return true;
}
// Enable column only if update event is set true
var isUpdate = m.get('evnt_update');
if(!_.isUndefined(isUpdate) && isUpdate) {
return false;
}
return true;
},
},{
id: 'tgoldtable', label: gettext('Old table'),
type: 'text', group: gettext('Transition'),
cell: 'string', mode: ['create', 'edit', 'properties'],
deps: ['fires', 'is_constraint_trigger', 'evnt_insert', 'evnt_update', 'evnt_delete', 'columns'],
disabled: 'disableTransition'
id: 'tgoldtable', label: gettext('Old table'),
type: 'text', group: gettext('Transition'),
cell: 'string', mode: ['create', 'edit', 'properties'],
deps: ['fires', 'is_constraint_trigger', 'evnt_insert', 'evnt_update', 'evnt_delete', 'columns'],
disabled: 'disableTransition',
},{
id: 'tgnewtable', label: gettext('New table'),
type: 'text', group: gettext('Transition'),
cell: 'string', mode: ['create', 'edit', 'properties'],
deps: ['fires', 'is_constraint_trigger', 'evnt_insert', 'evnt_update', 'evnt_delete', 'columns'],
disabled: 'disableTransition'
id: 'tgnewtable', label: gettext('New table'),
type: 'text', group: gettext('Transition'),
cell: 'string', mode: ['create', 'edit', 'properties'],
deps: ['fires', 'is_constraint_trigger', 'evnt_insert', 'evnt_update', 'evnt_delete', 'columns'],
disabled: 'disableTransition',
},{
id: 'prosrc', label: gettext('Code'), group: gettext('Code'),
type: 'text', mode: ['create', 'edit'], deps: ['tfunction'],
control: 'sql-field', visible: true,
disabled: function(m) {
// We will enable it only when EDB PPAS and trigger function is
// set to Inline EDB-SPL
var tfunction = m.get('tfunction'),
server_type = m.node_info['server']['server_type'];
id: 'prosrc', label: gettext('Code'), group: gettext('Code'),
type: 'text', mode: ['create', 'edit'], deps: ['tfunction'],
control: 'sql-field', visible: true,
disabled: function(m) {
// We will enable it only when EDB PPAS and trigger function is
// set to Inline EDB-SPL
var tfunction = m.get('tfunction'),
server_type = m.node_info['server']['server_type'];
if(server_type === 'ppas' &&
!_.isUndefined(tfunction) &&
tfunction === 'Inline EDB-SPL')
return false;
else
return true;
}
if(server_type === 'ppas' &&
!_.isUndefined(tfunction) &&
tfunction === 'Inline EDB-SPL')
return false;
else
return true;
},
},{
id: 'is_sys_trigger', label: gettext('System trigger?'), cell: 'string',
type: 'switch', disabled: 'inSchemaWithModelCheck', mode: ['properties']
type: 'switch', disabled: 'inSchemaWithModelCheck', mode: ['properties'],
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline', mode: ['properties', 'create', 'edit'],
disabled: 'inSchema'
}],
disabled: 'inSchema',
}],
validate: function(keys) {
var err = {},
msg = undefined;
var msg;
this.errorModel.clear();
// If nothing to validate
@ -517,13 +520,13 @@ define('pgadmin.node.trigger', [
}
if(_.isUndefined(this.get('name'))
|| String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
|| String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Name cannot be empty.');
this.errorModel.set('name', msg);
return msg;
}
}
if(_.isUndefined(this.get('tfunction'))
|| String(this.get('tfunction')).replace(/^\s+|\s+$/g, '') == '') {
|| String(this.get('tfunction')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Trigger function cannot be empty.');
this.errorModel.set('tfunction', msg);
return msg;
@ -532,17 +535,17 @@ define('pgadmin.node.trigger', [
if(!this.get('evnt_truncate') && !this.get('evnt_delete') &&
!this.get('evnt_update') && !this.get('evnt_insert')) {
msg = gettext('Specify at least one event.');
this.errorModel.set('evnt_truncate', " ");
this.errorModel.set('evnt_delete', " ");
this.errorModel.set('evnt_update', " ");
this.errorModel.set('evnt_truncate', ' ');
this.errorModel.set('evnt_delete', ' ');
this.errorModel.set('evnt_update', ' ');
this.errorModel.set('evnt_insert', msg);
return msg;
}
if(!_.isUndefined(this.get('tfunction')) &&
this.get('tfunction') === 'Inline EDB-SPL' &&
(_.isUndefined(this.get('prosrc'))
|| String(this.get('prosrc')).replace(/^\s+|\s+$/g, '') == ''))
(_.isUndefined(this.get('prosrc'))
|| String(this.get('prosrc')).replace(/^\s+|\s+$/g, '') == ''))
{
msg = gettext('Trigger code cannot be empty.');
this.errorModel.set('prosrc', msg);
@ -583,23 +586,23 @@ define('pgadmin.node.trigger', [
} else {
return true;
}
}
}
}
return true;
},
// Disable/Enable Transition tables
disableTransition: function(m) {
var flag = true,
evnt = null,
name = this.name,
evnt_count = 0;
evnt = null,
name = this.name,
evnt_count = 0;
// Disable transition tables for view trigger and PG version < 100000
if(_.indexOf(Object.keys(m.node_info), 'table') == -1 ||
m.node_info.server.version < 100000) return true;
m.node_info.server.version < 100000) return true;
if (name == "tgoldtable") evnt = 'evnt_delete';
else if (name == "tgnewtable") evnt = 'evnt_insert';
if (name == 'tgoldtable') evnt = 'evnt_delete';
else if (name == 'tgnewtable') evnt = 'evnt_insert';
if(m.get('evnt_insert')) evnt_count++;
if(m.get('evnt_update')) evnt_count++;
@ -615,9 +618,9 @@ define('pgadmin.node.trigger', [
// Disable Old transition table if both UPDATE and DELETE events are disabled
// Disable New transition table if both UPDATE and INSERT events are disabled
if(!m.get('is_constraint_trigger') && m.get('fires') == 'AFTER' &&
(m.get('evnt_update') || m.get(evnt)) && evnt_count == 1) {
if (m.get('evnt_update') && (_.size(m.get('columns')) >= 1 && m.get('columns')[0] != "")) flag = true;
else flag = false;
(m.get('evnt_update') || m.get(evnt)) && evnt_count == 1) {
if (m.get('evnt_update') && (_.size(m.get('columns')) >= 1 && m.get('columns')[0] != '')) flag = true;
else flag = false;
}
flag && setTimeout(function() {
@ -627,30 +630,30 @@ define('pgadmin.node.trigger', [
},10);
return flag;
}
},
}),
// Below function will enable right click menu for creating column
canCreate: function(itemData, item, data) {
// If check is false then , we will allow create menu
if (data && data.check == false)
return true;
// If check is false then , we will allow create menu
if (data && data.check == false)
return true;
var t = pgBrowser.tree, i = item, d = itemData, parents = [];
// To iterate over tree to check parent node
while (i) {
// If it is schema then allow user to c reate table
if (_.indexOf(['schema'], d._type) > -1)
return true;
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// If node is under catalog then do not allow 'create' menu
if (_.indexOf(parents, 'catalog') > -1) {
return false;
} else {
var t = pgBrowser.tree, i = item, d = itemData, parents = [];
// To iterate over tree to check parent node
while (i) {
// If it is schema then allow user to c reate table
if (_.indexOf(['schema'], d._type) > -1)
return true;
}
parents.push(d._type);
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// If node is under catalog then do not allow 'create' menu
if (_.indexOf(parents, 'catalog') > -1) {
return false;
} else {
return true;
}
},
// Check to whether trigger is disable ?
canCreate_with_trigger_enable: function(itemData, item, data) {
@ -673,9 +676,9 @@ define('pgadmin.node.trigger', [
return false;
}
}
}
});
}
},
});
}
return pgBrowser.Nodes['trigger'];
});

View File

@ -1,8 +1,8 @@
define('pgadmin.node.mview', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.alertifyjs', 'pgadmin.browser', 'codemirror',
'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, alertify, pgBrowser, CodeMirror) {
'sources/pgadmin', 'pgadmin.alertifyjs', 'pgadmin.browser',
'pgadmin.backform', 'pgadmin.browser.server.privilege',
], function(gettext, url_for, $, _, pgAdmin, Alertify, pgBrowser, Backform) {
/**
Create and add a view collection into nodes
@ -12,12 +12,12 @@ define('pgadmin.node.mview', [
display under under properties.
*/
if (!pgBrowser.Nodes['coll-mview']) {
var mviews= pgBrowser.Nodes['coll-mview'] =
pgBrowser.Nodes['coll-mview'] =
pgBrowser.Collection.extend({
node: 'mview',
label: gettext('Materialized Views'),
type: 'coll-mview',
columns: ['name', 'owner']
columns: ['name', 'owner'],
});
}
@ -68,7 +68,7 @@ define('pgadmin.node.mview', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, icon: 'wcTabIcon icon-mview',
data: {action: 'create', check: true}, enable: 'canCreate',
label: gettext('Materialized View...')
label: gettext('Materialized View...'),
},{
name: 'create_mview', node: 'mview', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
@ -80,32 +80,32 @@ define('pgadmin.node.mview', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 18, icon: 'wcTabIcon icon-mview',
data: {action: 'create', check: false}, enable: 'canCreate',
label: gettext('Materialized View...')
label: gettext('Materialized View...'),
},{
name: 'refresh_mview_data', node: 'mview', module: this,
priority: 1, callback: 'refresh_mview', category: 'refresh_mview',
applies: ['object', 'context'], label: gettext('With data'),
data: {concurrent: false, with_data: true}, icon: 'fa fa-recycle'
data: {concurrent: false, with_data: true}, icon: 'fa fa-recycle',
},{
name: 'refresh_mview_nodata', node: 'mview',
callback: 'refresh_mview', priority: 2, module: this,
category: 'refresh_mview', applies: ['object', 'context'],
label: gettext('With no data'), data: {
concurrent: false, with_data: false
}, icon: 'fa fa-refresh'
concurrent: false, with_data: false,
}, icon: 'fa fa-refresh',
},{
name: 'refresh_mview_concurrent', node: 'mview', module: this,
category: 'refresh_mview', enable: 'is_version_supported',
data: {concurrent: true, with_data: true}, priority: 3,
applies: ['object', 'context'], callback: 'refresh_mview',
label: gettext('With data (concurrently)'), icon: 'fa fa-recycle'
label: gettext('With data (concurrently)'), icon: 'fa fa-recycle',
},{
name: 'refresh_mview_concurrent_nodata', node: 'mview', module: this,
category: 'refresh_mview', enable: 'is_version_supported',
data: {concurrent: true, with_data: false}, priority: 4,
applies: ['object', 'context'], callback: 'refresh_mview',
label: gettext('With no data (concurrently)'),
icon: 'fa fa-refresh'
icon: 'fa fa-refresh',
}]);
},
@ -117,10 +117,9 @@ define('pgadmin.node.mview', [
initialize: function(attrs, args) {
if (_.size(attrs) === 0) {
// Set Selected Schema and Current User
var schemaLabel = args.node_info.schema._label || 'public',
userInfo = pgBrowser.serverInfo[args.node_info.server._id].user;
var userInfo = pgBrowser.serverInfo[args.node_info.server._id].user;
this.set({
'schema': 'public', 'owner': userInfo.name
'schema': 'public', 'owner': userInfo.name,
}, {silent: true});
}
pgBrowser.Node.Model.prototype.initialize.apply(this, arguments);
@ -128,36 +127,36 @@ define('pgadmin.node.mview', [
defaults: {
spcname: undefined,
toast_autovacuum_enabled: false,
autovacuum_enabled: false
autovacuum_enabled: false,
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: 'inSchema'
type: 'text', disabled: 'inSchema',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string',
control: 'node-list-by-name', select2: { allowClear: false },
node: 'role', disabled: 'inSchema'
node: 'role', disabled: 'inSchema',
},{
id: 'schema', label: gettext('Schema'), cell: 'string', first_empty: false,
control: 'node-list-by-name', type: 'text', cache_level: 'database',
node: 'schema', mode: ['create', 'edit'], cache_node: 'database',
disabled: 'inSchema', select2: { allowClear: false }
disabled: 'inSchema', select2: { allowClear: false },
},{
id: 'system_view', label: gettext('System view?'), cell: 'string',
type: 'switch', disabled: true, mode: ['properties'],
}, pgBrowser.SecurityGroupSchema, {
id: 'acl', label: gettext('Privileges'),
mode: ['properties'], type: 'text', group: gettext('Security')
mode: ['properties'], type: 'text', group: gettext('Security'),
},{
id: 'comment', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'definition', label:'', cell: 'string',
type: 'text', mode: ['create', 'edit'], group: gettext('Definition'),
control: Backform.SqlFieldControl, extraClasses:['sql_field_width_full']
control: Backform.SqlFieldControl, extraClasses:['sql_field_width_full'],
},{
id: 'with_data', label: gettext('With Data'),
group: gettext('Storage'), mode: ['edit', 'create'],
@ -167,33 +166,33 @@ define('pgadmin.node.mview', [
type: 'text', group: gettext('Storage'), first_empty: false,
control: 'node-list-by-name', node: 'tablespace', select2: { allowClear: false },
filter: function(m) {
if (m.label == "pg_global") return false;
if (m.label == 'pg_global') return false;
else return true;
}
},
},{
id: 'fillfactor', label: gettext('Fill Factor'),
group: gettext('Storage'), mode: ['edit', 'create'],
type: 'int'
type: 'int',
},{
type: 'nested', control: 'tab', id: 'materialization',
label: gettext('Parameter'), mode: ['edit', 'create'],
group: gettext('Parameter'),
schema: Backform.VacuumSettingsSchema
schema: Backform.VacuumSettingsSchema,
},{
// Add Privilege Control
id: 'datacl', label: gettext('Privileges'), type: 'collection',
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['a', 'r', 'w', 'd', 'D', 'x', 't']
privileges: ['a', 'r', 'w', 'd', 'D', 'x', 't'],
}), uniqueCol : ['grantee'], editable: false,
group: "security", canAdd: true, canDelete: true,
mode: ['edit', 'create'], control: 'unique-col-collection'
group: 'security', canAdd: true, canDelete: true,
mode: ['edit', 'create'], control: 'unique-col-collection',
},{
// Add Security Labels Control
id: 'seclabels', label: gettext('Security Labels'),
model: pgBrowser.SecLabelModel, editable: false, type: 'collection',
canEdit: false, group: "security", canDelete: true,
canEdit: false, group: 'security', canDelete: true,
mode: ['edit', 'create'], canAdd: true,
control: 'unique-col-collection', uniqueCol : ['provider']
control: 'unique-col-collection', uniqueCol : ['provider'],
}],
validate: function(keys) {
@ -204,7 +203,7 @@ define('pgadmin.node.mview', [
field_def = this.get('definition');
if (_.indexOf(keys, 'autovacuum_enabled') != -1 ||
_.indexOf(keys, 'toast_autovacuum_enabled') != -1 )
return null;
return null;
if (_.isUndefined(field_name) || _.isNull(field_name) ||
String(field_name).replace(/^\s+|\s+$/g, '') == '') {
@ -233,7 +232,7 @@ define('pgadmin.node.mview', [
return true;
}
return false;
}
},
}),
@ -275,27 +274,27 @@ define('pgadmin.node.mview', [
return true;
},
refresh_mview: function(args) {
var input = args || {},
obj = this,
t = pgBrowser.tree,
i = input.item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined;
var input = args || {},
obj = this,
t = pgBrowser.tree,
i = input.item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined;
if (!d)
return false;
if (!d)
return false;
// Make ajax call to refresh mview data
$.ajax({
url: obj.generate_url(i, 'refresh_data' , d, true),
type: 'PUT',
data: {'concurrent': args.concurrent, 'with_data': args.with_data},
dataType: "json",
dataType: 'json',
success: function(res) {
if (res.success == 1) {
alertify.success(gettext('View refreshed successfully'));
Alertify.success(gettext('View refreshed successfully'));
}
else {
alertify.alert(
Alertify.alert(
gettext('Error refreshing view'),
res.data.result
);
@ -303,22 +302,22 @@ define('pgadmin.node.mview', [
},
error: function(e) {
var errmsg = $.parseJSON(e.responseText);
alertify.alert(gettext('Error refreshing view'), errmsg.errormsg);
}
Alertify.alert(gettext('Error refreshing view'), errmsg.errormsg);
},
});
},
is_version_supported: function(data, item, args) {
is_version_supported: function(data, item) {
var t = pgAdmin.Browser.tree,
i = item || t.selected(),
d = data || (i && i.length == 1 ? t.itemData(i): undefined),
node = this || (d && pgAdmin.Browser.Nodes[d._type]),
info = node.getTreeNodeHierarchy.apply(node, [i]),
version = info.server.version;
i = item || t.selected(),
d = data || (i && i.length == 1 ? t.itemData(i): undefined),
node = this || (d && pgAdmin.Browser.Nodes[d._type]),
info = node.getTreeNodeHierarchy.apply(node, [i]),
version = info.server.version;
// disable refresh concurrently if server version is 9.3
return (version >= 90400);
}
},
});
}

View File

@ -1,9 +1,9 @@
define('pgadmin.node.view', [
'sources/gettext',
'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'pgadmin.browser', 'codemirror', 'pgadmin.browser.server.privilege',
'pgadmin.node.rule'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, CodeMirror) {
'sources/url_for', 'jquery', 'underscore', 'sources/pgadmin',
'pgadmin.browser', 'pgadmin.backform', 'pgadmin.browser.server.privilege',
'pgadmin.node.rule',
], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
/**
Create and add a view collection into nodes
@ -13,12 +13,12 @@ define('pgadmin.node.view', [
display under under properties.
*/
if (!pgBrowser.Nodes['coll-view']) {
var views= pgBrowser.Nodes['coll-view'] =
pgBrowser.Nodes['coll-view'] =
pgBrowser.Collection.extend({
node: 'view',
label: gettext('Views'),
type: 'coll-view',
columns: ["name", "owner"]
columns: ['name', 'owner'],
});
}
@ -55,78 +55,78 @@ define('pgadmin.node.view', [
this.initialized = true;
/**
/**
Add "create view" menu option into context and object menu
for the following nodes:
coll-view, view and schema.
@property {data} - Allow create view option on schema node or
system view nodes.
*/
*/
pgBrowser.add_menus([{
name: 'create_view_on_coll', node: 'coll-view', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: gettext('View...'),
icon: 'wcTabIcon icon-view', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_view', node: 'view', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: gettext('View...'),
icon: 'wcTabIcon icon-view', data: {action: 'create', check: true},
enable: 'canCreate'
enable: 'canCreate',
},{
name: 'create_view', node: 'schema', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 17, label: gettext('View...'),
icon: 'wcTabIcon icon-view', data: {action: 'create', check: false},
enable: 'canCreate'
}
enable: 'canCreate',
},
]);
},
/**
Define model for the view node and specify the
properties of the model in schema.
*/
*/
model: pgBrowser.Node.Model.extend({
initialize: function(attrs, args) {
if (_.size(attrs) === 0) {
// Set Selected Schema and, Current User
var schemaLabel = args.node_info.schema._label || 'public',
userInfo = pgBrowser.serverInfo[args.node_info.server._id].user;
userInfo = pgBrowser.serverInfo[args.node_info.server._id].user;
this.set({
'schema': schemaLabel, 'owner': userInfo.name
'schema': schemaLabel, 'owner': userInfo.name,
}, {silent: true});
}
pgBrowser.Node.Model.prototype.initialize.apply(this, arguments);
},
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text', disabled: 'notInSchema'
type: 'text', disabled: 'notInSchema',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},{
id: 'owner', label: gettext('Owner'), cell: 'string', control: 'node-list-by-name',
node: 'role', disabled: 'notInSchema', select2: { allowClear: false }
node: 'role', disabled: 'notInSchema', select2: { allowClear: false },
},{
id: 'schema', label: gettext('Schema'), cell: 'string', first_empty: false,
control: 'node-list-by-name', type: 'text', cache_level: 'database',
node: 'schema', disabled: 'notInSchema', mode: ['create', 'edit'],
select2: { allowClear: false }, cache_node: 'database'
select2: { allowClear: false }, cache_node: 'database',
},{
id: 'system_view', label: gettext('System view?'), cell: 'string',
type: 'switch', disabled: true, mode: ['properties']
type: 'switch', disabled: true, mode: ['properties'],
},{
id: 'acl', label: gettext('Privileges'),
mode: ['properties'], type: 'text', group: gettext('Security')
mode: ['properties'], type: 'text', group: gettext('Security'),
},{
id: 'comment', label: gettext('Comment'), cell: 'string',
type: 'multiline', disabled: 'notInSchema'
type: 'multiline', disabled: 'notInSchema',
},{
id: 'security_barrier', label: gettext('Security barrier'),
type: 'switch', min_version: '90200', group: gettext('Definition'),
disabled: 'notInSchema'
disabled: 'notInSchema',
},{
id: 'check_option', label: gettext('Check options'),
control: 'select2', group: gettext('Definition'), type: 'text',
@ -136,32 +136,32 @@ define('pgadmin.node.view', [
allowClear: false,
}, disabled: 'notInSchema',
options:[{
label: gettext("No"), value: "no"
label: gettext('No'), value: 'no',
},{
label: gettext("Local"), value: "local"
label: gettext('Local'), value: 'local',
},{
label: gettext("Cascaded"), value: "cascaded"
}]
label: gettext('Cascaded'), value: 'cascaded',
}],
},{
id: 'definition', label: gettext('Definition'), cell: 'string',
type: 'text', mode: ['create', 'edit'], group: gettext('Definition'),
control: Backform.SqlFieldControl,
disabled: 'notInSchema'
disabled: 'notInSchema',
}, pgBrowser.SecurityGroupSchema, {
// Add Privilege Control
id: 'datacl', label: gettext('Privileges'), type: 'collection',
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['a', 'r', 'w', 'd', 'D', 'x', 't']
privileges: ['a', 'r', 'w', 'd', 'D', 'x', 't'],
}), uniqueCol : ['grantee'], editable: false, group: 'security',
mode: ['edit', 'create'], canAdd: true, canDelete: true,
control: 'unique-col-collection', disabled: 'notInSchema'
control: 'unique-col-collection', disabled: 'notInSchema',
},{
// Add Security Labels Control
id: 'seclabels', label: gettext('Security labels'),
model: pgBrowser.SecLabelModel, editable: false, type: 'collection',
canEdit: false, group: 'security', canDelete: true,
mode: ['edit', 'create'], canAdd: true, disabled: 'notInSchema',
control: 'unique-col-collection', uniqueCol : ['provider']
control: 'unique-col-collection', uniqueCol : ['provider'],
}],
validate: function() {
// Triggers specific error messages for fields
@ -195,13 +195,13 @@ define('pgadmin.node.view', [
return true;
}
return false;
}
},
}),
/**
Show or hide create view menu option on parent node
and hide for system view in catalogs.
*/
*/
canCreate: function(itemData, item, data) {
// If check is false then, we will allow create menu
@ -235,8 +235,8 @@ define('pgadmin.node.view', [
// by default we do not want to allow create menu
return true;
}
});
},
});
}
return pgBrowser.Nodes['view'];

View File

@ -1,21 +1,21 @@
define('pgadmin.node.database', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser.utils', 'pgadmin.alertifyjs',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
'pgadmin.browser.server.variable'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify) {
'underscore.string', 'sources/pgadmin', 'pgadmin.browser.utils',
'pgadmin.alertifyjs', 'pgadmin.backform', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege', 'pgadmin.browser.server.variable',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify, Backform) {
if (!pgBrowser.Nodes['coll-database']) {
var databases = pgBrowser.Nodes['coll-database'] =
pgBrowser.Nodes['coll-database'] =
pgBrowser.Collection.extend({
node: 'database',
label: gettext('Databases'),
type: 'coll-database',
columns: ['name', 'datowner', 'comments'],
hasStatistics: true,
statsPrettifyFields: ['Size', 'Size of temporary files']
statsPrettifyFields: ['Size', 'Size of temporary files'],
});
};
}
if (!pgBrowser.Nodes['database']) {
pgBrowser.Nodes['database'] = pgBrowser.Node.extend({
@ -38,7 +38,7 @@ define('pgadmin.node.database', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -47,29 +47,29 @@ define('pgadmin.node.database', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Database...'),
icon: 'wcTabIcon pg-icon-database', data: {action: 'create'},
enable: 'can_create_database'
enable: 'can_create_database',
},{
name: 'create_database_on_coll', node: 'coll-database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Database...'),
icon: 'wcTabIcon pg-icon-database', data: {action: 'create'},
enable: 'can_create_database'
enable: 'can_create_database',
},{
name: 'create_database', node: 'database', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Database...'),
icon: 'wcTabIcon pg-icon-database', data: {action: 'create'},
enable: 'can_create_database'
enable: 'can_create_database',
},{
name: 'connect_database', node: 'database', module: this,
applies: ['object', 'context'], callback: 'connect_database',
category: 'connect', priority: 4, label: gettext('Connect Database...'),
icon: 'fa fa-link', enable : 'is_not_connected'
icon: 'fa fa-link', enable : 'is_not_connected',
},{
name: 'disconnect_database', node: 'database', module: this,
applies: ['object', 'context'], callback: 'disconnect_database',
category: 'drop', priority: 5, label: gettext('Disconnect Database...'),
icon: 'fa fa-chain-broken', enable : 'is_connected'
icon: 'fa fa-chain-broken', enable : 'is_connected',
}]);
_.bindAll(this, 'connection_lost');
@ -79,7 +79,7 @@ define('pgadmin.node.database', [
},
can_create_database: function(node, item) {
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
server = treeData['server'];
return server.connected && server.user.can_create_db;
},
@ -90,16 +90,13 @@ define('pgadmin.node.database', [
return (node && node.connected == true && node.canDisconn == true);
},
is_conn_allow: function(node) {
return (node && node.allowConn == true)
return (node && node.allowConn == true);
},
connection_lost: function(i, resp, server_connected) {
if (pgBrowser.tree) {
var t = pgBrowser.tree,
info = i && this.getTreeNodeHierarchy(i),
s = null,
d = i && t.itemData(i),
self = this,
_i = i;
d = i && t.itemData(i),
self = this;
while (d && d._type != 'database') {
i = t.parent(i);
@ -112,21 +109,21 @@ define('pgadmin.node.database', [
d.is_connecting = true;
var disconnect = function(_i, _d) {
if (_d._id == this._id) {
d.is_connecting = false;
pgBrowser.Events.off(
'pgadmin:database:connect:cancelled', disconnect
);
_i = _i && t.parent(_i);
_d = _i && t.itemData(_i);
if (_i && _d) {
pgBrowser.Events.trigger(
'pgadmin:server:disconnect',
{item: _i, data: _d}, false
);
}
}
};
if (_d._id == this._id) {
d.is_connecting = false;
pgBrowser.Events.off(
'pgadmin:database:connect:cancelled', disconnect
);
_i = _i && t.parent(_i);
_d = _i && t.itemData(_i);
if (_i && _d) {
pgBrowser.Events.trigger(
'pgadmin:server:disconnect',
{item: _i, data: _d}, false
);
}
}
};
pgBrowser.Events.on(
'pgadmin:database:connect:cancelled', disconnect
@ -157,13 +154,13 @@ define('pgadmin.node.database', [
callbacks: {
/* Connect the database */
connect_database: function(args){
var input = args || {};
obj = this,
t = pgBrowser.tree,
i = input.item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined;
var input = args || {},
obj = this,
t = pgBrowser.tree,
i = input.item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined;
if (!d || d.label == "template0")
if (!d || d.label == 'template0')
return false;
connect_to_database(obj, d, t, i, true);
@ -183,7 +180,7 @@ define('pgadmin.node.database', [
Alertify.confirm(
gettext('Disconnect the database'),
S(gettext('Are you sure you want to disconnect the database - %s?')).sprintf(d.label).value(),
function(evt) {
function() {
var data = d;
$.ajax({
url: obj.generate_url(i, 'connect', d, true),
@ -199,38 +196,39 @@ define('pgadmin.node.database', [
t.unload(i);
t.setInode(i);
setTimeout(function() {
t.select(prv_i);
t.select(prv_i);
}, 10);
}
else {
} else {
try {
Alertify.error(res.errormsg);
} catch (e) {}
} catch (e) {
console.warn(e.stack || e);
}
t.unload(i);
}
},
error: function(xhr, status, error) {
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
Alertify.error(err.errormsg);
}
} catch (e) {}
} catch (e) {
console.warn(e.stack || e);
}
t.unload(i);
}
},
});
},
function(evt) {
return true;
});
},
function() { return true; });
return false;
},
/* Connect the database (if not connected), before opening this node */
beforeopen: function(item, data) {
if(!data || data._type != 'database' || data.label == "template0") {
if(!data || data._type != 'database' || data.label == 'template0') {
return false;
}
@ -257,14 +255,13 @@ define('pgadmin.node.database', [
},
refresh: function(cmd, i) {
var self = this,
t = pgBrowser.tree,
item = i || t.selected(),
d = t.itemData(item);
var t = pgBrowser.tree,
item = i || t.selected(),
d = t.itemData(item);
if (!d.allowConn) return;
pgBrowser.Node.callbacks.refresh.apply(this, arguments);
}
},
},
model: pgBrowser.Node.Model.extend({
defaults: {
@ -286,7 +283,7 @@ define('pgadmin.node.database', [
deffuncacl: [],
defseqacl: [],
is_template: false,
deftypeacl: []
deftypeacl: [],
},
// Default values!
@ -302,37 +299,37 @@ define('pgadmin.node.database', [
schema: [{
id: 'name', label: gettext('Database'), cell: 'string',
editable: false, type: 'text'
editable: false, type: 'text',
},{
id: 'did', label: gettext('OID'), cell: 'string', mode: ['properties'],
editable: false, type: 'text'
editable: false, type: 'text',
},{
id: 'datowner', label: gettext('Owner'),
editable: false, type: 'text', node: 'role',
control: Backform.NodeListByNameControl, select2: { allowClear: false }
control: Backform.NodeListByNameControl, select2: { allowClear: false },
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'tblacl', label: gettext('Default TABLE privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'seqacl', label: gettext('Default SEQUENCE privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'funcacl', label: gettext('Default FUNCTION privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'typeacl', label: gettext('Default TYPE privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true, min_version: 90200
group: gettext('Security'), mode: ['properties'], disabled: true, min_version: 90200,
},{
id: 'comments', label: gettext('Comment'),
editable: false, type: 'multiline'
editable: false, type: 'multiline',
},{
id: 'encoding', label: gettext('Encoding'),
editable: false, type: 'text', group: gettext('Definition'),
disabled: function(m) { return !m.isNew(); }, url: 'get_encodings',
control: 'node-ajax-options', cache_level: 'server'
control: 'node-ajax-options', cache_level: 'server',
},{
id: 'template', label: gettext('Template'),
editable: false, type: 'text', group: gettext('Definition'),
@ -341,8 +338,8 @@ define('pgadmin.node.database', [
select2: { allowClear: false }, mode: ['create'],
transform: function(data, cell) {
var res = [],
control = cell || this,
label = control.model.get('name');
control = cell || this,
label = control.model.get('name');
if (!control.model.isNew()) {
res.push({label: label, value: label});
@ -351,34 +348,34 @@ define('pgadmin.node.database', [
if (data && _.isArray(data)) {
_.each(data, function(d) {
res.push({label: d.label, value: d.label,
image: 'pg-icon-database'});
})
image: 'pg-icon-database'});
});
}
}
return res;
}
},
},{
id: 'spcname', label: gettext('Tablespace'),
editable: false, type: 'text', group: gettext('Definition'),
control: 'node-list-by-name', node: 'tablespace',
select2: { allowClear: false },
filter: function(m) {
if (m.label == "pg_global") return false;
if (m.label == 'pg_global') return false;
else return true;
}
},
},{
id: 'datcollate', label: gettext('Collation'),
editable: false, type: 'text', group: gettext('Definition'),
disabled: function(m) { return !m.isNew(); }, url: 'get_ctypes',
control: 'node-ajax-options', cache_level: 'server'
control: 'node-ajax-options', cache_level: 'server',
},{
id: 'datctype', label: gettext('Character type'),
editable: false, type: 'text', group: gettext('Definition'),
disabled: function(m) { return !m.isNew(); }, url: 'get_ctypes',
control: 'node-ajax-options', cache_level: 'server'
control: 'node-ajax-options', cache_level: 'server',
},{
id: 'datconnlimit', label: gettext('Connection limit'),
editable: false, type: 'int', group: gettext('Definition'), min: -1
editable: false, type: 'int', group: gettext('Definition'), min: -1,
},{
id: 'is_template', label: gettext('Template?'),
editable: false, type: 'switch', group: gettext('Definition'),
@ -386,8 +383,8 @@ define('pgadmin.node.database', [
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},{
id: 'datallowconn', label: gettext('Allow connections?'),
editable: false, type: 'switch', group: gettext('Definition'),
@ -395,12 +392,12 @@ define('pgadmin.node.database', [
options: {
'onText': gettext('Yes'), 'offText': gettext('No'),
'onColor': 'success', 'offColor': 'primary',
'size': 'small'
}
'size': 'small',
},
},{
id: 'datacl', label: gettext('Privileges'), type: 'collection',
model: pgBrowser.Node.PrivilegeRoleModel.extend({
privileges: ['C', 'T', 'c']
privileges: ['C', 'T', 'c'],
}), uniqueCol : ['grantee', 'grantor'], editable: false,
group: gettext('Security'), mode: ['edit', 'create'],
canAdd: true, canDelete: true, control: 'unique-col-collection',
@ -409,7 +406,7 @@ define('pgadmin.node.database', [
model: pgBrowser.Node.VariableModel.extend({keys:['name', 'role']}), editable: false,
group: gettext('Parameters'), mode: ['edit', 'create'],
canAdd: true, canEdit: false, canDelete: true, hasRole: true,
control: Backform.VariableCollectionControl, node: 'role'
control: Backform.VariableCollectionControl, node: 'role',
},{
id: 'seclabels', label: gettext('Security Labels'),
model: pgBrowser.SecLabelModel,
@ -417,43 +414,43 @@ define('pgadmin.node.database', [
group: gettext('Security'), canDelete: true,
mode: ['edit', 'create'], canAdd: true,
control: 'unique-col-collection', uniqueCol : ['provider'],
min_version: 90200
min_version: 90200,
},{
type: 'nested', control: 'tab', group: gettext('Default Privileges'),
mode: ['edit'],
schema:[{
id: 'deftblacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
id: 'deftblacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['a', 'r', 'w', 'd', 'D', 'x', 't']}), label: gettext('Default Privileges: Tables'),
editable: false, type: 'collection', group: gettext('Tables'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor']
},{
id: 'defseqacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
editable: false, type: 'collection', group: gettext('Tables'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
},{
id: 'defseqacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['r', 'w', 'U']}), label: gettext('Default Privileges: Sequences'),
editable: false, type: 'collection', group: gettext('Sequences'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor']
},{
id: 'deffuncacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
editable: false, type: 'collection', group: gettext('Sequences'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
},{
id: 'deffuncacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['X']}), label: gettext('Default Privileges: Functions'),
editable: false, type: 'collection', group: gettext('Functions'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor']
},{
id: 'deftypeacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
editable: false, type: 'collection', group: gettext('Functions'),
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
},{
id: 'deftypeacl', model: pgBrowser.Node.PrivilegeRoleModel.extend(
{privileges: ['U']}), label: gettext('Default Privileges: Types'),
editable: false, type: 'collection', group: 'deftypesacl_group',
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
min_version: 90200
},{
id: 'deftypesacl_group', type: 'group', label: gettext('Types'),
mode: ['edit', 'create'], min_version: 90200
}
]
}
editable: false, type: 'collection', group: 'deftypesacl_group',
mode: ['edit', 'create'], control: 'unique-col-collection',
canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'],
min_version: 90200,
},{
id: 'deftypesacl_group', type: 'group', label: gettext('Types'),
mode: ['edit', 'create'], min_version: 90200,
},
],
},
],
validate: function(keys) {
validate: function() {
var name = this.get('name');
if (_.isUndefined(name) || _.isNull(name) ||
String(name).replace(/^\s+|\s+$/g, '') == '') {
@ -464,8 +461,8 @@ define('pgadmin.node.database', [
this.errorModel.unset('name');
}
return null;
}
})
},
}),
});
pgBrowser.SecurityGroupSchema = {
@ -479,15 +476,14 @@ define('pgadmin.node.database', [
return 'catalog' in node_info ? false : true;
}
return true;
}
},
};
function connect_to_database(obj, data, tree, item, interactive) {
connect(obj, data, tree, item)
}
function connect(obj, data, tree, item, _wasConnected) {
var wasConnected = _wasConnected || data.connected,
var connect_to_database = function(obj, data, tree, item) {
connect(obj, data, tree, item);
},
connect = function (obj, data, tree, item, _wasConnected) {
var wasConnected = _wasConnected || data.connected,
onFailure = function(
xhr, status, error, _model, _data, _tree, _item, _status
) {
@ -539,7 +535,7 @@ define('pgadmin.node.database', [
}
}
},
onCancel = function(_tree, _item, _data, _status) {
onCancel = function(_tree, _item, _data) {
_data.is_connecting = false;
var server = _tree.parent(_item);
_tree.unload(_item);
@ -553,18 +549,18 @@ define('pgadmin.node.database', [
_tree.select(server);
};
$.post(
obj.generate_url(item, "connect", data, true)
).done(function(res) {
if (res.success == 1) {
return onSuccess(res, obj, data, tree, item, wasConnected);
}
}).fail(function(xhr, status, error) {
return onFailure(
xhr, status, error, obj, data, tree, item, wasConnected
);
});
}
$.post(
obj.generate_url(item, 'connect', data, true)
).done(function(res) {
if (res.success == 1) {
return onSuccess(res, obj, data, tree, item, wasConnected);
}
}).fail(function(xhr, status, error) {
return onFailure(
xhr, status, error, obj, data, tree, item, wasConnected
);
});
};
}
return pgBrowser.Nodes['coll-database'];

View File

@ -1,8 +1,11 @@
define('pgadmin.node.pga_schedule', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'moment', 'pgadmin.browser', 'alertify',
'backform', 'pgadmin.backform'
], function(gettext, url_for, $, _, S, pgAdmin, moment, pgBrowser, Alertify, Backform) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'moment', 'pgadmin.browser', 'alertify',
'pgadmin.backform', 'pgadmin.backgrid',
], function(
gettext, url_for, $, _, S, pgAdmin, moment, pgBrowser, Alertify, Backform,
Backgrid
) {
if (!pgBrowser.Nodes['coll-pga_schedule']) {
pgBrowser.Nodes['coll-pga_schedule'] =
@ -11,7 +14,7 @@ define('pgadmin.node.pga_schedule', [
label: gettext('Schedules'),
type: 'coll-pga_schedule',
columns: ['jscid', 'jscname', 'jscenabled'],
hasStatistics: false
hasStatistics: false,
});
}
@ -20,7 +23,7 @@ define('pgadmin.node.pga_schedule', [
var weekdays = [
gettext('Sunday'), gettext('Monday'), gettext('Tuesday'),
gettext('Wednesday'), gettext('Thursday'), gettext('Friday'),
gettext('Saturday')
gettext('Saturday'),
],
monthdays = [
gettext('1st'), gettext('2nd'), gettext('3rd'),
@ -33,13 +36,13 @@ define('pgadmin.node.pga_schedule', [
gettext('22nd'), gettext('23rd'), gettext('24th'),
gettext('25th'), gettext('26th'), gettext('27th'),
gettext('28th'), gettext('29th'), gettext('30th'),
gettext('31st'), gettext('Last day')
gettext('31st'), gettext('Last day'),
],
months = [
gettext('January'), gettext('February'), gettext('March'),
gettext('April'), gettext('May'), gettext('June'),
gettext('July'), gettext('August'), gettext('September'),
gettext('October'), gettext('November'), gettext('December')
gettext('October'), gettext('November'), gettext('December'),
],
hours = [
gettext('00'), gettext('01'), gettext('02'), gettext('03'),
@ -47,7 +50,7 @@ define('pgadmin.node.pga_schedule', [
gettext('08'), gettext('09'), gettext('10'), gettext('11'),
gettext('12'), gettext('13'), gettext('14'), gettext('15'),
gettext('16'), gettext('17'), gettext('18'), gettext('19'),
gettext('20'), gettext('21'), gettext('22'), gettext('23')
gettext('20'), gettext('21'), gettext('22'), gettext('23'),
],
minutes = [
gettext('00'), gettext('01'), gettext('02'), gettext('03'),
@ -64,21 +67,21 @@ define('pgadmin.node.pga_schedule', [
gettext('44'), gettext('45'), gettext('46'), gettext('47'),
gettext('48'), gettext('49'), gettext('50'), gettext('51'),
gettext('52'), gettext('53'), gettext('54'), gettext('55'),
gettext('56'), gettext('57'), gettext('58'), gettext('59')
gettext('56'), gettext('57'), gettext('58'), gettext('59'),
],
AnyDatetimeCell = Backgrid.Extension.MomentCell.extend({
editor: Backgrid.Extension.DatetimePickerEditor,
render: function() {
this.$el.empty();
var model = this.model;
this.$el.text(this.formatter.fromRaw(model.get(this.column.get("name")), model) || gettext('<any>'));
this.$el.text(this.formatter.fromRaw(model.get(this.column.get('name')), model) || gettext('<any>'));
this.delegateEvents();
return this;
}
},
}),
DatetimeCell = Backgrid.Extension.MomentCell.extend({
editor: Backgrid.Extension.DatetimePickerEditor
editor: Backgrid.Extension.DatetimePickerEditor,
}),
BooleanArrayFormatter = function(selector, indexes) {
var self = this;
@ -101,7 +104,7 @@ define('pgadmin.node.pga_schedule', [
}
return self.indexes ? resIdx : res.join(', ');
}
};
this.toRaw = function(d) {
if (!self.indexes)
return d;
@ -111,14 +114,14 @@ define('pgadmin.node.pga_schedule', [
res.push(_.indexOf(d, String(i + 1)) != -1);
}
return res;
}
};
return self;
},
BooleanArrayOptions = function(ctrl) {
var selector = ctrl.field.get('selector'),
val = ctrl.model.get(ctrl.field.get('name')),
res = [];
val = ctrl.model.get(ctrl.field.get('name')),
res = [];
if (selector) {
res = _.map(
@ -133,7 +136,7 @@ define('pgadmin.node.pga_schedule', [
defaults: {
jexid: undefined,
jexdate: null,
jextime: null
jextime: null,
},
idAttribute: 'jexid',
schema: [{
@ -141,20 +144,20 @@ define('pgadmin.node.pga_schedule', [
editable: true, placeholder: gettext('<any>'),
cell: AnyDatetimeCell, options: {format: 'YYYY-MM-DD'},
displayFormat: 'YYYY-MM-DD', modelFormat: 'YYYY-MM-DD',
cellHeaderClasses:'width_percent_50', allowEmpty: true
cellHeaderClasses:'width_percent_50', allowEmpty: true,
},{
id: 'jextime', type: 'text', placeholder: gettext('<any>'),
label: gettext('Time'), editable: true, cell: AnyDatetimeCell,
options: {format: 'HH:mm'}, displayFormat: 'HH:mm',
modelFormat: 'HH:mm:ss', displayInUTC: false, allowEmpty: true,
cellHeaderClasses:'width_percent_50', modalInUTC: false
cellHeaderClasses:'width_percent_50', modalInUTC: false,
}],
validate: function() {
var self = this, exceptions = this.collection,
dates = {}, errMsg, hasExceptionErr = false,
d = (this.get('jexdate') || '<any>'),
t = this.get('jextime') || '<any>',
id = this.get('jexid') || this.cid;
errMsg, hasExceptionErr = false,
d = (this.get('jexdate') || '<any>'),
t = this.get('jextime') || '<any>',
id = this.get('jexid') || this.cid;
self.errorModel.unset('jscdate');
if (d == t && d == '<any>') {
@ -169,17 +172,17 @@ define('pgadmin.node.pga_schedule', [
if (
d == (ex.get('jexdate') || '<any>') &&
t == (ex.get('jextime') || '<any>')
t == (ex.get('jextime') || '<any>')
) {
errMsg = gettext('Please specify unique set of exceptions.');
if (ex.errorModel.get('jscdate') != errMsg)
self.errorModel.set('jscdate', errMsg);
self.errorModel.set('jscdate', errMsg);
hasExceptionErr = true;
}
});
return errMsg;
}
},
});
pgBrowser.Nodes['pga_schedule'] = pgBrowser.Node.extend({
@ -189,15 +192,13 @@ define('pgadmin.node.pga_schedule', [
hasSQL: true,
hasDepends: false,
hasStatistics: false,
canDrop: function(node) {
return true;
},
canDrop: true,
label: gettext('Schedule'),
node_image: 'icon-pga_schedule',
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -205,17 +206,17 @@ define('pgadmin.node.pga_schedule', [
name: 'create_pga_schedule_on_job', node: 'pga_job', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Schedule...'),
icon: 'wcTabIcon icon-pga_schedule', data: {action: 'create'}
icon: 'wcTabIcon icon-pga_schedule', data: {action: 'create'},
},{
name: 'create_pga_schedule_on_coll', node: 'coll-pga_schedule', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Schedule...'),
icon: 'wcTabIcon icon-pga_schedule', data: {action: 'create'}
icon: 'wcTabIcon icon-pga_schedule', data: {action: 'create'},
},{
name: 'create_pga_schedule', node: 'pga_schedule', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Schedule...'),
icon: 'wcTabIcon icon-pga_schedule', data: {action: 'create'}
icon: 'wcTabIcon icon-pga_schedule', data: {action: 'create'},
}]);
},
model: pgBrowser.Node.Model.extend({
@ -232,7 +233,7 @@ define('pgadmin.node.pga_schedule', [
jscmonths: _.map(months, function() { return false; }),
jschours: _.map(hours, function() { return false; }),
jscminutes: _.map(minutes, function() { return false; }),
jscexceptions: []
jscexceptions: [],
},
idAttribute: 'jscid',
parse: function(d) {
@ -243,7 +244,7 @@ define('pgadmin.node.pga_schedule', [
d.jscexceptions.push({
'jexid': d.jexid[idx],
'jexdate': d.jexdate[idx],
'jextime': d.jextime[idx]
'jextime': d.jextime[idx],
});
}
}
@ -255,15 +256,15 @@ define('pgadmin.node.pga_schedule', [
},
schema: [{
id: 'jscid', label: gettext('ID'), type: 'int',
cellHeaderClasses: 'width_percent_5', mode: ['properties']
cellHeaderClasses: 'width_percent_5', mode: ['properties'],
},{
id: 'jscname', label: gettext('Name'), type: 'text',
cellHeaderClasses: 'width_percent_45',
disabled: function() { return false; }
disabled: function() { return false; },
},{
id: 'jscenabled', label: gettext('Enabled?'), type: 'switch',
disabled: function() { return false; },
cellHeaderClasses: 'width_percent_5'
cellHeaderClasses: 'width_percent_5',
},{
id: 'jscstart', label: gettext('Start'), type: 'text',
control: 'datetimepicker', cell: DatetimeCell,
@ -271,42 +272,42 @@ define('pgadmin.node.pga_schedule', [
displayFormat: 'YYYY-MM-DD HH:mm:ss Z',
modelFormat: 'YYYY-MM-DD HH:mm:ss Z', options: {
format: 'YYYY-MM-DD HH:mm:ss Z',
minDate: moment().add(0, 'm')
}, cellHeaderClasses: 'width_percent_25'
minDate: moment().add(0, 'm'),
}, cellHeaderClasses: 'width_percent_25',
},{
id: 'jscend', label: gettext('End'), type: 'text',
control: 'datetimepicker', cell: DatetimeCell,
disabled: function() { return false; }, displayInUTC: false,
displayFormat: 'YYYY-MM-DD HH:mm:ss Z', options: {
format: 'YYYY-MM-DD HH:mm:ss Z', useCurrent: false,
minDate: moment().add(0, 'm')
minDate: moment().add(0, 'm'),
}, cellHeaderClasses: 'width_percent_25',
modelFormat: 'YYYY-MM-DD HH:mm:ss Z'
modelFormat: 'YYYY-MM-DD HH:mm:ss Z',
},{
id: 'jscweekdays', label: gettext('Week days'), type: 'text',
control: Backform.Control.extend({
formatter: new BooleanArrayFormatter(weekdays, false)
}), mode: ['properties']
formatter: new BooleanArrayFormatter(weekdays, false),
}), mode: ['properties'],
},{
id: 'jscmonthdays', label: gettext('Month days'), type: 'text',
control: Backform.Control.extend({
formatter: new BooleanArrayFormatter(monthdays, false)
}), mode: ['properties']
formatter: new BooleanArrayFormatter(monthdays, false),
}), mode: ['properties'],
},{
id: 'jscmonths', label: gettext('Months'), type: 'text',
control: Backform.Control.extend({
formatter: new BooleanArrayFormatter(months, false)
}), mode: ['properties']
formatter: new BooleanArrayFormatter(months, false),
}), mode: ['properties'],
},{
id: 'jschours', label: gettext('Hours'), type: 'text',
control: Backform.Control.extend({
formatter: new BooleanArrayFormatter(hours, false)
}), mode: ['properties']
formatter: new BooleanArrayFormatter(hours, false),
}), mode: ['properties'],
},{
id: 'jscminutes', label: gettext('Minutes'), type: 'text',
control: Backform.Control.extend({
formatter: new BooleanArrayFormatter(minutes, false)
}), mode: ['properties']
formatter: new BooleanArrayFormatter(minutes, false),
}), mode: ['properties'],
},{
id: 'jscexceptions', label: gettext('Exceptions'), type: 'text',
control: Backform.Control.extend({
@ -321,17 +322,17 @@ define('pgadmin.node.pga_schedule', [
for (; idx < rawData.length; idx++) {
d = rawData[idx];
if (idx)
res += ', ';
res += ', ';
res += '[' + String((d.jexdate || '') + ' ' + (d.jextime || '')).replace(/^\s+|\s+$/g, '') + ']';
}
return res;
}
this.toRaw = function(data) { return data; }
};
this.toRaw = function(data) { return data; };
return this;
}
}), mode: ['properties']
},
}), mode: ['properties'],
},{
type: 'nested', label: gettext('Days'), group: gettext('Repeat'),
mode: ['create', 'edit'],
@ -343,13 +344,13 @@ define('pgadmin.node.pga_schedule', [
this.$el.prepend(
'<div class="set-group pg-el-xs-12 ' +
Backform.helpMessageClassName + '">' +
gettext('Schedules are specified using a <b>cron-style</b> format.<br/><ul><li>For each selected time or date element, the schedule will execute.<br/>e.g. To execute at 5 minutes past every hour, simply select 05 in the Minutes list box.<br/></li><li>Values from more than one field may be specified in order to further control the schedule.<br/>e.g. To execute at 12:05 and 14:05 every Monday and Thursday, you would click minute 05, hours 12 and 14, and weekdays Monday and Thursday.</li><li>For additional flexibility, the Month Days check list includes an extra Last Day option. This matches the last day of the month, whether it happens to be the 28th, 29th, 30th or 31st.</li></ul>') +
'</div>'
Backform.helpMessageClassName + '">' +
gettext('Schedules are specified using a <b>cron-style</b> format.<br/><ul><li>For each selected time or date element, the schedule will execute.<br/>e.g. To execute at 5 minutes past every hour, simply select 05 in the Minutes list box.<br/></li><li>Values from more than one field may be specified in order to further control the schedule.<br/>e.g. To execute at 12:05 and 14:05 every Monday and Thursday, you would click minute 05, hours 12 and 14, and weekdays Monday and Thursday.</li><li>For additional flexibility, the Month Days check list includes an extra Last Day option. This matches the last day of the month, whether it happens to be the 28th, 29th, 30th or 31st.</li></ul>') +
'</div>'
);
return res;
}
},
}),
schema:[{
id: 'jscweekdays', label: gettext('Week Days'), cell: 'select2',
@ -362,11 +363,11 @@ define('pgadmin.node.pga_schedule', [
width: 'style',
dropdownAdapter: $.fn.select2.amd.require(
'select2/selectAllAdapter'
)
),
},
selector: weekdays,
formatter: new BooleanArrayFormatter(weekdays, true),
options: BooleanArrayOptions
options: BooleanArrayOptions,
},{
id: 'jscmonthdays', label: gettext('Month Days'), cell: 'select2',
group: gettext('Days'), control: 'select2',
@ -378,10 +379,10 @@ define('pgadmin.node.pga_schedule', [
width: 'style',
dropdownAdapter: $.fn.select2.amd.require(
'select2/selectAllAdapter'
)
),
},
formatter: new BooleanArrayFormatter(monthdays, true),
selector: monthdays, options: BooleanArrayOptions
selector: monthdays, options: BooleanArrayOptions,
},{
id: 'jscmonths', label: gettext('Months'), cell: 'select2',
group: gettext('Days'), control: 'select2',
@ -393,11 +394,11 @@ define('pgadmin.node.pga_schedule', [
width: 'style',
dropdownAdapter: $.fn.select2.amd.require(
'select2/selectAllAdapter'
)
),
},
formatter: new BooleanArrayFormatter(months, true),
selector: months, options: BooleanArrayOptions
}]
selector: months, options: BooleanArrayOptions,
}],
},{
type: 'nested', control: 'fieldset', label: gettext('Times'),
group: gettext('Repeat'), mode: ['create', 'edit'],
@ -412,10 +413,10 @@ define('pgadmin.node.pga_schedule', [
width: 'style',
dropdownAdapter: $.fn.select2.amd.require(
'select2/selectAllAdapter'
)
),
},
formatter: new BooleanArrayFormatter(hours, true),
selector: hours, options: BooleanArrayOptions
selector: hours, options: BooleanArrayOptions,
},{
id: 'jscminutes', label: gettext('Minutes'), cell: 'select2',
group: gettext('Times'), control: 'select2',
@ -427,26 +428,26 @@ define('pgadmin.node.pga_schedule', [
width: 'style',
dropdownAdapter: $.fn.select2.amd.require(
'select2/selectAllAdapter'
)
),
},
formatter: new BooleanArrayFormatter(minutes, true),
selector: minutes, options: BooleanArrayOptions
}]
selector: minutes, options: BooleanArrayOptions,
}],
},{
id: 'jscexceptions', type: 'collection', mode: ['edit', 'create'],
label: "", canEdit: false, model: ExceptionModel, canAdd: true,
label: '', canEdit: false, model: ExceptionModel, canAdd: true,
group: gettext('Exceptions'), canDelete: true,
cols: ['jexdate', 'jextime'], control: 'sub-node-collection'
cols: ['jexdate', 'jextime'], control: 'sub-node-collection',
},{
id: 'jscdesc', label: gettext('Comment'), type: 'multiline'
id: 'jscdesc', label: gettext('Comment'), type: 'multiline',
}],
validate: function(keys) {
validate: function() {
var val = this.get('jscname'),
errMsg = null;
errMsg = null, msg;
if (_.isUndefined(val) || _.isNull(val) ||
String(val).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Name cannot be empty.');
msg = gettext('Name cannot be empty.');
this.errorModel.set('jscname', msg);
errMsg = msg;
} else {
@ -456,7 +457,7 @@ define('pgadmin.node.pga_schedule', [
val = this.get('jscstart');
if (_.isUndefined(val) || _.isNull(val) ||
String(val).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Please enter the start time.');
msg = gettext('Please enter the start time.');
this.errorModel.set('jscstart', msg);
errMsg = errMsg || msg;
} else {
@ -466,7 +467,7 @@ define('pgadmin.node.pga_schedule', [
val = this.get('jscend');
if (_.isUndefined(val) || _.isNull(val) ||
String(val).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Please enter the end time.');
msg = gettext('Please enter the end time.');
this.errorModel.set('jscend', msg);
errMsg = errMsg || msg;
} else {
@ -476,21 +477,22 @@ define('pgadmin.node.pga_schedule', [
// End time must be greater than Start time
if(!errMsg) {
var start_time = this.get('jscstart'),
end_time = this.get('jscend'), elapsed_time,
end_time = this.get('jscend'),
start_time_js = start_time.split(' '),
end_time_js = end_time.split(' ');
start_time_js = moment(start_time_js[0] + ' ' + start_time_js[1]);
end_time_js = moment(end_time_js[0] + ' ' + end_time_js[1]);
if(end_time_js.isBefore(start_time_js)) {
errMsg = gettext('Start time must be less than end time');
this.errorModel.set('jscstart', errMsg);
}
start_time_js = moment(start_time_js[0] + ' ' + start_time_js[1]);
end_time_js = moment(end_time_js[0] + ' ' + end_time_js[1]);
if(end_time_js.isBefore(start_time_js)) {
errMsg = gettext('Start time must be less than end time');
this.errorModel.set('jscstart', errMsg);
}
}
return errMsg;
}
})
},
}),
});
}

View File

@ -1,19 +1,19 @@
define('pgadmin.node.pga_job', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
'pgadmin.node.pga_jobstep', 'pgadmin.node.pga_schedule'
'pgadmin.node.pga_jobstep', 'pgadmin.node.pga_schedule',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-pga_job']) {
var pga_jobs = pgBrowser.Nodes['coll-pga_job'] =
pgBrowser.Nodes['coll-pga_job'] =
pgBrowser.Collection.extend({
node: 'pga_job',
label: gettext('pga_jobs'),
type: 'coll-pga_job',
columns: ['jobid', 'jobname', 'jobenabled', 'jlgstatus', 'jobnextrun', 'joblastrun', 'jobdesc'],
hasStatistics: false
hasStatistics: false,
});
};
}
if (!pgBrowser.Nodes['pga_job']) {
pgBrowser.Nodes['pga_job'] = pgBrowser.Node.extend({
@ -26,9 +26,7 @@ define('pgadmin.node.pga_job', [
hasCollectiveStatistics: true,
width: '80%',
height: '80%',
canDrop: function(node) {
return true;
},
canDrop: true,
label: gettext('pgAgent Job'),
node_image: function() {
return 'icon-pga_job';
@ -36,7 +34,7 @@ define('pgadmin.node.pga_job', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -44,17 +42,17 @@ define('pgadmin.node.pga_job', [
name: 'create_pga_job_on_coll', node: 'coll-pga_job', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('pgAgent Job...'),
icon: 'wcTabIcon icon-pga_job', data: {action: 'create'}
icon: 'wcTabIcon icon-pga_job', data: {action: 'create'},
},{
name: 'create_pga_job', node: 'pga_job', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('pgAgent Job...'),
icon: 'wcTabIcon icon-pga_job', data: {action: 'create'}
icon: 'wcTabIcon icon-pga_job', data: {action: 'create'},
}, {
name: 'run_now_pga_job', node: 'pga_job', module: this,
applies: ['object', 'context'], callback: 'run_pga_job_now',
priority: 4, label: gettext('Run now'), data: {action: 'create'},
icon: 'fa fa-play-circle'
icon: 'fa fa-play-circle',
}]);
},
model: pgBrowser.Node.Model.extend({
@ -72,80 +70,80 @@ define('pgadmin.node.pga_job', [
jobrunningat: undefined,
jobdesc: '',
jsteps: [],
jschedules: []
jschedules: [],
},
idAttribute: 'jobid',
parse: function() {
var d = pgBrowser.Node.Model.prototype.parse.apply(this, arguments);
if (d) {
d.jobrunningat = d.jaghostagent || gettext("Not running currently.");
d.jlgstatus = d.jlgstatus || gettext("Unknown");
d.jobrunningat = d.jaghostagent || gettext('Not running currently.');
d.jlgstatus = d.jlgstatus || gettext('Unknown');
}
return d;
},
schema: [{
id: 'jobname', label: gettext('Name'), type: 'text',
cellHeaderClasses: 'width_percent_30'
cellHeaderClasses: 'width_percent_30',
},{
id: 'jobid', label: gettext('ID'), mode: ['properties'],
type: 'int'
type: 'int',
},{
id: 'jobenabled', label: gettext('Enabled?'), type: 'switch',
cellHeaderClasses: 'width_percent_5'
cellHeaderClasses: 'width_percent_5',
},{
id: 'jobclass', label: gettext('Job class'), type: 'text',
mode: ['properties']
mode: ['properties'],
},{
id: 'jobjclid', label: gettext('Job class'), type: 'int',
control: 'node-ajax-options', url: 'classes', url_with_id: false,
cache_node: 'server', mode: ['create', 'edit'],
select2: {allowClear: false},
helpMessage: gettext('Please select a class to categorize the job. This option will not affect the way the job runs.')
helpMessage: gettext('Please select a class to categorize the job. This option will not affect the way the job runs.'),
},{
id: 'jobhostagent', label: gettext('Host agent'), type: 'text',
mode: ['edit', 'create'],
helpMessage: gettext('Enter the hostname of a machine running pgAgent if you wish to ensure only that machine will run this job. Leave blank if any host may run the job.')
helpMessage: gettext('Enter the hostname of a machine running pgAgent if you wish to ensure only that machine will run this job. Leave blank if any host may run the job.'),
},{
id: 'jobhostagent', label: gettext('Host agent'), type: 'text',
mode: ['properties']
mode: ['properties'],
},{
id: 'jobcreated', type: 'text', mode: ['properties'],
label: gettext('Created')
label: gettext('Created'),
},{
id: 'jobchanged', type: 'text', mode: ['properties'],
label: gettext('Changed')
label: gettext('Changed'),
},{
id: 'jobnextrun', type: 'text', mode: ['properties'],
label: gettext('Next run'), cellHeaderClasses: 'width_percent_20'
label: gettext('Next run'), cellHeaderClasses: 'width_percent_20',
},{
id: 'joblastrun', type: 'text', mode: ['properties'],
label: gettext('Last run'), cellHeaderClasses: 'width_percent_20'
label: gettext('Last run'), cellHeaderClasses: 'width_percent_20',
},{
id: 'jlgstatus', type: 'text', label: gettext('Last result'),
cellHeaderClasses: 'width_percent_5', mode: ['properties']
cellHeaderClasses: 'width_percent_5', mode: ['properties'],
},{
id: 'jobrunningat', type: 'text', mode: ['properties'],
label: gettext('Running at')
label: gettext('Running at'),
},{
id: 'jobdesc', label: gettext('Comment'), type: 'multiline',
cellHeaderClasses: 'width_percent_15'
cellHeaderClasses: 'width_percent_15',
},{
id: 'jsteps', label: '', group: gettext('Steps'),
type: 'collection', mode: ['edit', 'create'],
model: pgBrowser.Nodes['pga_jobstep'].model, canEdit: true,
control: 'sub-node-collection', canAdd: true, canDelete: true,
columns: [
'jstname', 'jstenabled', 'jstkind', 'jstconntype', 'jstonerror'
]
'jstname', 'jstenabled', 'jstkind', 'jstconntype', 'jstonerror',
],
},{
id: 'jschedules', label: '', group: gettext('Schedules'),
type: 'collection', mode: ['edit', 'create'],
control: 'sub-node-collection', canAdd: true, canDelete: true,
canEdit: true, model: pgBrowser.Nodes['pga_schedule'].model,
columns: ['jscname', 'jscenabled', 'jscstart', 'jscend']
columns: ['jscname', 'jscenabled', 'jscstart', 'jscend'],
}],
validate: function(keys) {
validate: function() {
var name = this.get('jobname');
if (_.isUndefined(name) || _.isNull(name) ||
String(name).replace(/^\s+|\s+$/g, '') == '') {
@ -156,7 +154,7 @@ define('pgadmin.node.pga_job', [
this.errorModel.unset('jobname');
}
return null;
}
},
}),
/* Run pgagent job now */
run_pga_job_now: function(args) {
@ -172,15 +170,15 @@ define('pgadmin.node.pga_job', [
$.ajax({
url: obj.generate_url(i, 'run_now', d, true),
method:'PUT',
success: function(res) {
// 'pgagent.pga_job' table updated with current time
// to run the job now.
t.unload(i);
},
error: function(xhr, status, error) {
var error_msg = "Unable to run pgagent job.";
// 'pgagent.pga_job' table updated with current time to run the job
// now.
success: function() { t.unload(i); },
error: function(xhr) {
var error_msg = gettext('Unable to run pgagent job.');
if (xhr.readyState == 0) {
alertify.error(gettext('Not connected to the server or the connection to the server has been closed.'));
alertify.error(
gettext('Not connected to the server or the connection to the server has been closed.')
);
}
else {
if (_.isUndefined(xhr.responseText)) {
@ -194,7 +192,7 @@ define('pgadmin.node.pga_job', [
}
}
t.unload(i);
}
},
});
return false;

View File

@ -1,7 +1,7 @@
define('pgadmin.node.pga_jobstep', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify', 'backform',
'backgrid', 'pgadmin.backform', 'pgadmin.backgrid'
'backgrid', 'pgadmin.backform', 'pgadmin.backgrid',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify, Backform, Backgrid) {
if (!pgBrowser.Nodes['coll-pga_jobstep']) {
@ -12,9 +12,9 @@ define('pgadmin.node.pga_jobstep', [
type: 'coll-pga_jobstep',
columns: [
'jstid', 'jstname', 'jstenabled', 'jstkind', 'jstconntype',
'jstonerror'
'jstonerror',
],
hasStatistics: false
hasStatistics: false,
});
}
@ -26,18 +26,18 @@ define('pgadmin.node.pga_jobstep', [
},
dependentChanged: function dependentChanged() {
var model = this.model,
column = this.column,
editable = this.column.get("editable"),
input = this.$el.find('input[type=checkbox]').first(),
self_name = column.get('name'),
is_editable;
column = this.column,
editable = this.column.get('editable'),
input = this.$el.find('input[type=checkbox]').first(),
self_name = column.get('name'),
is_editable;
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
if (is_editable) {
this.$el.addClass("editable");
this.$el.addClass('editable');
input.bootstrapSwitch('disabled', false);
} else {
this.$el.removeClass("editable");
this.$el.removeClass('editable');
input.bootstrapSwitch('disabled', true);
// Set self value into model
setTimeout(function () {
@ -49,7 +49,7 @@ define('pgadmin.node.pga_jobstep', [
this.delegateEvents();
return this;
},
remove: Backgrid.Extension.DependentCell.prototype.remove
remove: Backgrid.Extension.DependentCell.prototype.remove,
});
if (!pgBrowser.Nodes['pga_jobstep']) {
@ -63,9 +63,7 @@ define('pgadmin.node.pga_jobstep', [
hasCollectiveStatistics: true,
width: '70%',
height: '80%',
canDrop: function(node) {
return true;
},
canDrop: true,
label: gettext('Step'),
node_image: function() {
return 'icon-pga_jobstep';
@ -73,7 +71,7 @@ define('pgadmin.node.pga_jobstep', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -81,17 +79,17 @@ define('pgadmin.node.pga_jobstep', [
name: 'create_pga_jobstep_on_job', node: 'pga_job', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Job Step...'),
data: {'action': 'create'}, icon: 'wcTabIcon icon-pga_jobstep'
data: {'action': 'create'}, icon: 'wcTabIcon icon-pga_jobstep',
},{
name: 'create_pga_jobstep_on_coll', node: 'coll-pga_jobstep', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Job Step...'),
data: {'action': 'create'}, icon: 'wcTabIcon icon-pga_jobstep'
data: {'action': 'create'}, icon: 'wcTabIcon icon-pga_jobstep',
},{
name: 'create_pga_jobstep', node: 'pga_jobstep', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Job Step...'),
data: {'action': 'create'}, icon: 'wcTabIcon icon-pga_jobstep'
data: {'action': 'create'}, icon: 'wcTabIcon icon-pga_jobstep',
}]);
},
model: pgBrowser.Node.Model.extend({
@ -107,7 +105,7 @@ define('pgadmin.node.pga_jobstep', [
jstconnstr: null,
jstdbname: null,
jstonerror: 'f',
jstnextrun: ''
jstnextrun: '',
},
initialize: function() {
pgBrowser.Node.Model.prototype.initialize.apply(this, arguments);
@ -125,29 +123,28 @@ define('pgadmin.node.pga_jobstep', [
idAttribute: 'jstid',
schema: [{
id: 'jstid', label: gettext('ID'), type: 'int',
cellHeaderClasses: 'width_percent_5', mode: ['properties']
cellHeaderClasses: 'width_percent_5', mode: ['properties'],
},{
id: 'jstname', label: gettext('Name'), type: 'text',
disabled: function(m) { return false; },
cellHeaderClasses: 'width_percent_60'
disabled: false, cellHeaderClasses: 'width_percent_60',
},{
id: 'jstenabled', label: gettext('Enabled?'), type: 'switch',
disabled: function(m) { return false; }
disabled: function() { return false; },
},{
id: 'jstkind', label: gettext('Kind'), type: 'switch',
options: {
'onText': gettext('SQL'), 'offText': gettext('Batch'),
'onColor': 'primary', 'offColor': 'primary'
'onColor': 'primary', 'offColor': 'primary',
}, control: Backform.SwitchControl,
disabled: function(m) { return false; }
disabled: function() { return false; },
},{
id: 'jstconntype', label: gettext('Connection type'),
type: 'switch', deps: ['jstkind'], mode: ['properties'],
disabled: function(m) { return !m.get('jstkind'); },
options: {
'onText': gettext('Local'), 'offText': gettext('Remote'),
'onColor': 'primary', 'offColor': 'primary'
}
'onColor': 'primary', 'offColor': 'primary',
},
},{
id: 'jstconntype', label: gettext('Connection type'),
type: 'switch', deps: ['jstkind'], mode: ['create', 'edit'],
@ -159,14 +156,14 @@ define('pgadmin.node.pga_jobstep', [
},
options: {
'onText': gettext('Local'), 'offText': gettext('Remote'),
'onColor': 'primary', 'offColor': 'primary'
}, helpMessage: gettext('Select <b>Local</b> if the job step will execute on the local database server, or <b>Remote</b> to specify a remote database server.')
'onColor': 'primary', 'offColor': 'primary',
}, helpMessage: gettext('Select <b>Local</b> if the job step will execute on the local database server, or <b>Remote</b> to specify a remote database server.'),
},{
id: 'jstdbname', label: gettext('Database'), type: 'text',
mode: ['properties'], disabled: function(m) { return false; }
mode: ['properties'], disabled: function() { return false; },
},{
id: 'jstconnstr', type: 'text', mode: ['properties'],
label: gettext('Connection string')
label: gettext('Connection string'),
},{
id: 'jstdbname', label: gettext('Database'), type: 'text',
control: 'node-list-by-name', node: 'database',
@ -174,30 +171,30 @@ define('pgadmin.node.pga_jobstep', [
disabled: function(m) {
return !m.get('jstkind') || !m.get('jstconntype');
}, deps: ['jstkind', 'jstconntype'], mode: ['create', 'edit'],
helpMessage: gettext('Please select the database on which the job step will run.')
helpMessage: gettext('Please select the database on which the job step will run.'),
},{
id: 'jstconnstr', label: gettext('Connection string'), type: 'text',
deps: ['jstkind', 'jstconntype'], disabled: function(m) {
return !m.get('jstkind') || m.get('jstconntype');
}, helpMessage: S(
gettext("Please specify the connection string for the remote database server. Each parameter setting is in the form keyword = value. Spaces around the equal sign are optional. To write an empty value, or a value containing spaces, surround it with single quotes, e.g., keyword = 'a value'. Single quotes and backslashes within the value must be escaped with a backslash, i.e., \' and \\.<br>For more information, please see the documentation on %s")
gettext('Please specify the connection string for the remote database server. Each parameter setting is in the form keyword = value. Spaces around the equal sign are optional. To write an empty value, or a value containing spaces, surround it with single quotes, e.g., keyword = \'a value\'. Single quotes and backslashes within the value must be escaped with a backslash, i.e., \' and \\.<br>For more information, please see the documentation on %s')
).sprintf(
'<a href="https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING" target="_blank">libpq connection strings</a>'
).value(), mode: ['create', 'edit']
).value(), mode: ['create', 'edit'],
},{
id: 'jstonerror', label: gettext('On error'), cell: 'select2',
control: 'select2', options: [
{'label': gettext('Fail'), 'value': "f"},
{'label': gettext('Success'), 'value': "s"},
{'label': gettext('Ignore'), 'value': "i"}
], select2: {allowClear: false}, disabled: function(m) {
{'label': gettext('Fail'), 'value': 'f'},
{'label': gettext('Success'), 'value': 's'},
{'label': gettext('Ignore'), 'value': 'i'},
], select2: {allowClear: false}, disabled: function() {
return false;
}
},
},{
id: 'jstdesc', label: gettext('Comment'), type: 'multiline'
id: 'jstdesc', label: gettext('Comment'), type: 'multiline',
},{
id: 'jstcode', label: '', cell: 'string', deps: ['jstkind'],
type: 'text', control: 'sql-field', group: gettext('Code'),
type: 'text', group: gettext('Code'),
control: Backform.SqlFieldControl.extend({
render: function() {
if (this.model.get('jstkind')) {
@ -208,16 +205,16 @@ define('pgadmin.node.pga_jobstep', [
return Backform.SqlFieldControl.prototype.render.apply(
this, arguments
);
}
})
},
}),
}],
validate: function(keys) {
validate: function() {
var val = this.get('jstname'),
errMsg = null;
errMsg = null, msg;
if (
_.isUndefined(val) || _.isNull(val) ||
String(val).replace(/^\s+|\s+$/g, '') == ''
String(val).replace(/^\s+|\s+$/g, '') == ''
) {
errMsg = gettext('Name cannot be empty.');
this.errorModel.set('jstname', errMsg);
@ -232,7 +229,7 @@ define('pgadmin.node.pga_jobstep', [
_.isUndefined(val) || _.isNull(val) ||
String(val).replace(/^\s+|\s+$/g, '') == ''
) {
var msg = gettext('Please select a database.');
msg = gettext('Please select a database.');
errMsg = errMsg || msg;
this.errorModel.set('jstdbname', msg);
} else {
@ -240,8 +237,7 @@ define('pgadmin.node.pga_jobstep', [
}
} else {
this.errorModel.unset('jstdbname');
var msg,
r = /\s*\b(\w+)\s*=\s*('([^'\\]*(?:\\.[^'\\]*)*)'|[\w|\.]*)/g;
var r = /\s*\b(\w+)\s*=\s*('([^'\\]*(?:\\.[^'\\]*)*)'|[\w|\.]*)/g;
val = this.get('jstconnstr');
if (
_.isUndefined(val) || _.isNull(val) ||
@ -252,18 +248,18 @@ define('pgadmin.node.pga_jobstep', [
msg = gettext('Please enter a valid connection string.');
} else {
var m,
params = {
'host': true, 'hostaddr': true, 'port': true,
'dbname': true, 'user': true, 'password': true,
'connect_timeout': true, 'client_encoding': true,
'application_name': true, 'options': true,
'fallback_application_name': true, 'sslmode': true,
'sslcert': true, 'sslkey': true, 'sslrootcert': true,
'sslcrl': true, 'keepalives': true, 'service': true,
'keepalives_idle': true, 'keepalives_interval': true,
'keepalives_count': true, 'sslcompression': true,
'requirepeer': true, 'krbsrvname': true, 'gsslib': true,
};
params = {
'host': true, 'hostaddr': true, 'port': true,
'dbname': true, 'user': true, 'password': true,
'connect_timeout': true, 'client_encoding': true,
'application_name': true, 'options': true,
'fallback_application_name': true, 'sslmode': true,
'sslcert': true, 'sslkey': true, 'sslrootcert': true,
'sslcrl': true, 'keepalives': true, 'service': true,
'keepalives_idle': true, 'keepalives_interval': true,
'keepalives_count': true, 'sslcompression': true,
'requirepeer': true, 'krbsrvname': true, 'gsslib': true,
};
while((m = r.exec(val))) {
if (params[m[1]]) {
@ -295,9 +291,9 @@ define('pgadmin.node.pga_jobstep', [
val = this.get('jstcode');
if (
_.isUndefined(val) || _.isNull(val) ||
String(val).replace(/^\s+|\s+$/g, '') == ''
String(val).replace(/^\s+|\s+$/g, '') == ''
) {
var msg = gettext('Please specify code to execute.');
msg = gettext('Please specify code to execute.');
errMsg = errMsg || msg;
this.errorModel.set('jstcode', msg);
} else {
@ -305,8 +301,8 @@ define('pgadmin.node.pga_jobstep', [
}
return errMsg;
}
})
},
}),
});
}

View File

@ -1,6 +1,6 @@
define('pgadmin.node.resource_group', [
'sources/gettext', 'sources/url_for', 'underscore', 'pgadmin.browser',
'pgadmin.browser.collection'
'pgadmin.browser.collection',
], function(gettext, url_for, _, pgBrowser) {
// Extend the browser's collection class for resource group collection
@ -10,8 +10,8 @@ define('pgadmin.node.resource_group', [
node: 'resource_group',
label: gettext('Resource Groups'),
type: 'coll-resource_group',
columns: ['name', 'cpu_rate_limit', 'dirty_rate_limit']
});
columns: ['name', 'cpu_rate_limit', 'dirty_rate_limit'],
});
}
// Extend the browser's node class for resource group node
@ -43,21 +43,21 @@ define('pgadmin.node.resource_group', [
*/
enable: function(node, item) {
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
server = treeData['server'];
return server.connected && node.server_type === 'ppas' &&
node.version >= 90400;
}
node.version >= 90400;
},
},{
name: 'create_resource_group_on_coll', node: 'coll-resource_group', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Resource Group...'),
icon: 'wcTabIcon icon-resource_group', data: {action: 'create'}
icon: 'wcTabIcon icon-resource_group', data: {action: 'create'},
},{
name: 'create_resource_group', node: 'resource_group', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Resource Group...'),
icon: 'wcTabIcon icon-resource_group', data: {action: 'create'}
}
icon: 'wcTabIcon icon-resource_group', data: {action: 'create'},
},
]);
},
@ -66,7 +66,7 @@ define('pgadmin.node.resource_group', [
defaults: {
name: undefined,
cpu_rate_limit: 0.0,
dirty_rate_limit: 0.0
dirty_rate_limit: 0.0,
},
// Defining schema for the resource group node
@ -75,22 +75,23 @@ define('pgadmin.node.resource_group', [
type: 'text',
},{
id: 'cpu_rate_limit', label: gettext('CPU rate limit (%%)'), cell: 'string',
type: 'numeric', min:0, max:16777216
type: 'numeric', min:0, max:16777216,
},{
id: 'dirty_rate_limit', label: gettext('Dirty rate limit (KB)'), cell: 'string',
type: 'numeric', min:0, max:16777216
type: 'numeric', min:0, max:16777216,
}],
/* validate function is used to validate the input given by
* the user. In case of error, message will be displayed on
* the GUI for the respective control.
*/
validate: function(keys) {
var msg, cpu_rate_limit, dirty_rate_limit, name,
name = this.get('name');
validate: function() {
var msg,
name = this.get('name');
if (_.isUndefined(name) || _.isNull(name) ||
String(name).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Name cannot be empty.');
String(name).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Name cannot be empty.');
this.errorModel.set('name', msg);
return msg;
} else {
@ -99,8 +100,8 @@ define('pgadmin.node.resource_group', [
var cpu_rate_limit = this.get('cpu_rate_limit');
if (_.isUndefined(cpu_rate_limit) || _.isNull(cpu_rate_limit) ||
String(cpu_rate_limit).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('CPU rate limit cannot be empty.');
String(cpu_rate_limit).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('CPU rate limit cannot be empty.');
this.errorModel.set('cpu_rate_limit', msg);
return msg;
} else {
@ -110,15 +111,15 @@ define('pgadmin.node.resource_group', [
var dirty_rate_limit = this.get('dirty_rate_limit');
if (_.isUndefined(dirty_rate_limit) || _.isNull(dirty_rate_limit) ||
String(dirty_rate_limit).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Dirty rate limit cannot be empty.');
msg = gettext('Dirty rate limit cannot be empty.');
this.errorModel.set('dirty_rate_limit', msg);
return msg;
} else {
this.errorModel.unset('dirty_rate_limit');
}
return null;
}
})
},
}),
});
}

View File

@ -2,70 +2,66 @@ define('pgadmin.node.role', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.backform', 'select2', 'pgadmin.browser.collection',
'pgadmin.browser.node.ui', 'pgadmin.browser.server.variable'
'pgadmin.browser.node.ui', 'pgadmin.browser.server.variable',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Backform) {
if (!pgBrowser.Nodes['coll-role']) {
var role = pgAdmin.Browser.Nodes['coll-role'] =
pgAdmin.Browser.Nodes['coll-role'] =
pgAdmin.Browser.Collection.extend({
node: 'role',
type: 'coll-role',
columns: [
'rolname', 'rolvaliduntil', 'rolconnlimit', 'rolcanlogin',
'rolsuper', 'rolcreaterole', 'rolcreatedb', 'rolcatupdate',
'rolinherit', 'rolreplication'
]
'rolinherit', 'rolreplication',
],
});
};
}
var SecurityModel = pgAdmin.Browser.SecurityModel =
pgAdmin.Browser.SecurityModel || pgAdmin.Browser.Node.Model.extend({
defaults: {
provider: null,
label: null
},
schema: [{
id: 'provider', label: gettext('Provider'),
type: 'text', disabled: false,
cellHeaderClasses:'width_percent_50'
},{
id: 'label', label: gettext('Security Label'),
type: 'text', disabled: false,
}],
validate: function() {
var err = {},
errmsg = null,
data = this.toJSON();
pgAdmin.Browser.SecurityModel || pgAdmin.Browser.Node.Model.extend({
defaults: {
provider: null,
label: null,
},
schema: [{
id: 'provider', label: gettext('Provider'),
type: 'text', disabled: false,
cellHeaderClasses:'width_percent_50',
},{
id: 'label', label: gettext('Security Label'),
type: 'text', disabled: false,
}],
validate: function() {
var data = this.toJSON(), msg;
if (_.isUndefined(data.provider) ||
_.isNull(data.provider) ||
String(data.provider).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Please specify the value for all the security providers.');
if (_.isUndefined(data.provider) ||
_.isNull(data.provider) ||
String(data.provider).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Please specify the value for all the security providers.');
this.errorModel.set('provider', msg);
return msg;
} else {
this.errorModel.unset('provider');
}
this.errorModel.set('provider', msg);
return msg;
} else {
this.errorModel.unset('provider');
}
if (_.isUndefined(data.label) ||
_.isNull(data.label) ||
String(data.label).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Please specify the value for all the security providers.') ;
this.errorModel.set('label', msg);
return msg;
} else {
this.errorModel.unset('label');
}
if (_.isUndefined(data.label) ||
_.isNull(data.label) ||
String(data.label).replace(/^\s+|\s+$/g, '') == '') {
var msg = gettext('Please specify the value for all the security providers.') ;
this.errorModel.set('label', msg);
return msg;
} else {
this.errorModel.unset('label');
}
return null;
}
});
return null;
},
});
var switchOptions = {
'onText': gettext('Yes'), 'offText': gettext('No'),
'size': 'mini'
'size': 'mini',
};
var RoleCustomSwitchControl = Backform.SwitchControl.extend({
@ -81,26 +77,24 @@ define('pgadmin.node.role', [
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
' <% } %>',
'</div>',
].join("\n"))
].join('\n')),
});
var RoleMembersControl = Backform.Control.extend({
defaults: _.defaults(
{extraClasses: ['col-xs-12 col-sm-12 col-md-12']},
Backform.NodeListByNameControl.prototype.defaults
),
{extraClasses: ['col-xs-12 col-sm-12 col-md-12']},
Backform.NodeListByNameControl.prototype.defaults
),
initialize: function() {
Backform.NodeListByNameControl.prototype.initialize.apply(this, arguments);
},
formatter: {
fromRaw: function (rawData, model) {
fromRaw: function (rawData) {
var res = _.isObject(rawData) ? rawData : JSON.parse(rawData);
return _.pluck(res, 'role');
},
toRaw: function (formattedData, model) {
return formattedData;
}
toRaw: function (formattedData) { return formattedData; },
},
template: _.template([
'<label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
@ -115,7 +109,7 @@ define('pgadmin.node.role', [
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
' <% } %>',
'</div>',
].join("\n")),
].join('\n')),
selectionTemplate: _.template([
'<span>',
' <span class="wcTabIcon <%= optimage %>"></span>',
@ -123,13 +117,13 @@ define('pgadmin.node.role', [
' <% if (checkbox) { %>',
' <input type="checkbox" <%=disabled ? "disabled=\'disabled\'" : ""%>/>',
' <% } %>',
'</span>'
].join("\n")),
events: {"change select": "onChange"},
'</span>',
].join('\n')),
events: {'change select': 'onChange'},
getValueFromDOM: function() {
var res = [];
this.$el.find("select").find(':selected').each(function() {
this.$el.find('select').find(':selected').each(function() {
res.push($(this).attr('value'));
});
@ -137,39 +131,41 @@ define('pgadmin.node.role', [
},
render: function() {
var field = _.defaults(this.field.toJSON(), this.defaults),
attributes = this.model.toJSON(),
attrArr = field.name.split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
rawValue = this.keyPathAccessor(attributes[name], path),
data = _.extend(field, {
rawValue: rawValue,
value: this.formatter.fromRaw(rawValue, this.model),
attributes: attributes,
formatter: this.formatter
}),
evalF = function(f, d, m) {
return (_.isFunction(f) ? !!f.apply(d, [m]) : !!f);
},
evalASFunc = function(f, d, m) {
return (_.isFunction(f) ? f.apply(d, [m]) : f);
};
attributes = this.model.toJSON(),
attrArr = field.name.split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
rawValue = this.keyPathAccessor(attributes[name], path),
data = _.extend(field, {
rawValue: rawValue,
value: this.formatter.fromRaw(rawValue, this.model),
attributes: attributes,
formatter: this.formatter,
}),
evalF = function(f, d, m) {
return (_.isFunction(f) ? !!f.apply(d, [m]) : !!f);
},
evalASFunc = function(f, d, m) {
return (_.isFunction(f) ? f.apply(d, [m]) : f);
};
// Evaluate the disabled, visible, and required option
_.extend(data, {
disabled: evalF(data.disabled, data, this.model),
visible: evalF(data.visible, data, this.model),
required: evalF(data.required, data, this.model),
helpMessage: evalASFunc(data.helpMessage, data, this.model)
helpMessage: evalASFunc(data.helpMessage, data, this.model),
});
// Evaluation the options
if (_.isFunction(data.options)) {
try {
data.options = data.options.apply(this)
data.options = data.options.apply(this);
} catch(e) {
// Do nothing
data.options = []
this.model.trigger('pgadmin-view:transform:error', m, self.field, e);
data.options = [];
this.model.trigger(
'pgadmin-view:transform:error', this.model, this.field, e
);
}
}
@ -183,66 +179,66 @@ define('pgadmin.node.role', [
this.updateInvalid();
var self = this,
collection = this.model.get(this.field.get('name')),
formatState = function(opt) {
if (!opt.id) {
return opt.text;
}
collection = this.model.get(this.field.get('name')),
formatState = function(opt) {
if (!opt.id) {
return opt.text;
}
var optimage = $(opt.element).data('icon');
var optimage = $(opt.element).data('icon');
if(!optimage){
return opt.text;
} else {
var d = _.extend(
{}, data, {
'opttext': _.escape(opt.text),
'optimage': optimage,
'checkbox': false
});
return $(self.selectionTemplate(d));
}
},
formatSelection = function (opt) {
if(!optimage){
return opt.text;
} else {
var d = _.extend(
{}, data, {
'opttext': _.escape(opt.text),
'optimage': optimage,
'checkbox': false,
});
return $(self.selectionTemplate(d));
}
},
formatSelection = function (opt) {
if (!opt.id) {
return opt.text;
}
if (!opt.id) {
return opt.text;
}
var optimage = $(opt.element).data('icon'),
grantUpdate = function(ev) {
var optimage = $(opt.element).data('icon'),
grantUpdate = function(ev) {
_.each(collection.where({role: opt.id}), function(m) {
m.set('admin', $(ev.target).is(":checked"));
});
_.each(collection.where({role: opt.id}), function(m) {
m.set('admin', $(ev.target).is(':checked'));
});
return false;
};
return false;
};
if(!optimage){
return opt.text;
} else {
var d = _.extend(
{}, data, {
'opttext': _.escape(opt.text),
'optimage': optimage,
'checkbox': true
}),
j = $(self.selectionTemplate(d));
if(!optimage){
return opt.text;
} else {
var d = _.extend(
{}, data, {
'opttext': _.escape(opt.text),
'optimage': optimage,
'checkbox': true,
}),
j = $(self.selectionTemplate(d));
// Update the checkbox lazy
setTimeout(
function() {
_.each(collection.where({role: opt.id}), function(m) {
j.find('input').prop('checked', m.get('admin'));
});
}, 200);
// Update the checkbox lazy
setTimeout(
function() {
_.each(collection.where({role: opt.id}), function(m) {
j.find('input').prop('checked', m.get('admin'));
});
}, 200);
(j.find('input')).on('change', grantUpdate);
(j.find('input')).on('change', grantUpdate);
return j;
}
};
return j;
}
};
this.$el.find('select').select2({
templateResult: formatState,
@ -250,34 +246,32 @@ define('pgadmin.node.role', [
multiple: true,
tags: true,
allowClear: data.disabled ? false : true,
placeholder: data.disabled ? "" : gettext("Select members"),
width: 'style'
}).on("change", function(e) {
placeholder: data.disabled ? '' : gettext('Select members'),
width: 'style',
}).on('change', function(e) {
$(e.target).find(':selected').each(function() {
});
});
return this;
},
onChange: function(e) {
onChange: function() {
var model = this.model,
$el = $(e.target),
attrArr = this.field.get("name").split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
vals = this.getValueFromDOM(),
collection = model.get(name),
removed = [];
attrArr = this.field.get('name').split('.'),
name = attrArr.shift(),
vals = this.getValueFromDOM(),
collection = model.get(name),
removed = [];
this.stopListening(this.model, "change:" + name, this.render);
this.stopListening(this.model, 'change:' + name, this.render);
/*
* Iterate through all the values, and find out how many are already
* present in the collection.
*/
/*
* Iterate through all the values, and find out how many are already
* present in the collection.
*/
collection.each(function(m) {
var role = m.get('role'),
idx = _.indexOf(vals, role);
idx = _.indexOf(vals, role);
if (idx > -1) {
vals.splice(idx, 1);
@ -286,26 +280,26 @@ define('pgadmin.node.role', [
}
});
/*
* Adding new values
*/
/*
* Adding new values
*/
_.each(vals, function(v) {
collection.add({role: v});
});
/*
* Removing unwanted!
*/
/*
* Removing unwanted!
*/
_.each(removed, function(v) {
collection.remove(collection.where({role: v}));
});
this.listenTo(this.model, "change:" + name, this.render);
}
this.listenTo(this.model, 'change:' + name, this.render);
},
});
if (!pgBrowser.Nodes['role']) {
var role = pgAdmin.Browser.Nodes['role'] = pgAdmin.Browser.Node.extend({
pgAdmin.Browser.Nodes['role'] = pgAdmin.Browser.Node.extend({
parent_type: 'server',
type: 'role',
sqlAlterHelp: 'sql-alterrole.html',
@ -316,16 +310,16 @@ define('pgadmin.node.role', [
width: '550px',
canDrop: function(node, item) {
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
/*
server = treeData['server'];
/*
To Drop a role:
1) If Role we are deleting is superuser then User must be superuser
2) And for non-superuser roles User must have Create Role permission
*/
*/
// Role you are trying to drop is Superuser ?
if(node.is_superuser) {
return server.connected && server.user.is_superuser;
return server.connected && server.user.is_superuser;
}
// For non super users
return server.connected && server.user.can_create_role;
@ -336,7 +330,7 @@ define('pgadmin.node.role', [
},
node_image: function(r) {
if (r == null || r == undefined)
return 'icon-role';
return 'icon-role';
return (r.can_login ? 'icon-role' : 'icon-group');
},
title: function(d) {
@ -351,7 +345,7 @@ define('pgadmin.node.role', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -360,24 +354,24 @@ define('pgadmin.node.role', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Login/Group Role...'),
icon: 'wcTabIcon icon-role', data: {action: 'create'},
enable: 'can_create_role'
enable: 'can_create_role',
},{
name: 'create_role_on_roles', node: 'coll-role', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Login/Group Role...'),
icon: 'wcTabIcon icon-role', data: {action: 'create'},
enable: 'can_create_role'
enable: 'can_create_role',
},{
name: 'create_role', node: 'role', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Login/Group Role...'),
icon: 'wcTabIcon icon-role', data: {action: 'create'},
enable: 'can_create_role'
enable: 'can_create_role',
}]);
},
can_create_role: function(node, item) {
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
server = treeData['server'];
return server.connected && server.user.can_create_role;
},
@ -398,14 +392,14 @@ define('pgadmin.node.role', [
rolmembership: [],
rolvaliduntil: null,
seclabels: [],
variables: []
variables: [],
},
schema: [{
id: 'rolname', label: gettext('Name'), type: 'text',
disabled: 'readonly'
disabled: 'readonly',
},{
id: 'oid', label: gettext('OID'), cell: 'string', mode: ['properties'],
editable: false, type: 'text', visible: true, disabled: true
editable: false, type: 'text', visible: true, disabled: true,
},{
id: 'rolpassword', label: gettext('Password'), type: 'password',
group: gettext('Definition'), mode: ['edit', 'create'],
@ -415,23 +409,23 @@ define('pgadmin.node.role', [
var user = this.node_info.server.user;
return (!(user.is_superuser || user.can_create_role) &&
user.id != m.get('oid'));
user.id != m.get('oid'));
}
return false;
}
},
},{
id: 'rolvaliduntil', disabled: 'readonly', type: 'text',
group: gettext('Definition'), label: gettext('Account expires'),
mode: ['properties', 'edit', 'create'], control: 'datetimepicker',
deps: ['rolcanlogin'], options: {format: 'YYYY-MM-DD HH:mm:ss Z'}
deps: ['rolcanlogin'], options: {format: 'YYYY-MM-DD HH:mm:ss Z'},
},{
id: 'rolconnlimit', type: 'int', group: gettext('Definition'),
label: gettext('Connection limit'), cell: 'integer', min : -1,
mode: ['properties', 'edit', 'create'], disabled: 'readonly'
mode: ['properties', 'edit', 'create'], disabled: 'readonly',
},{
id: 'rolcanlogin', label: gettext('Can login?'), type: 'switch',
group: gettext('Privileges'), options: switchOptions,
disabled: 'readonly', control: RoleCustomSwitchControl
disabled: 'readonly', control: RoleCustomSwitchControl,
},{
id: 'rolsuper', label: gettext('Superuser'), type: 'switch',
group: gettext('Privileges'), options: switchOptions,
@ -442,40 +436,40 @@ define('pgadmin.node.role', [
this.model.set('rolcatupdate', this.model.get('rolsuper'));
this.model.set('rolcreaterole', this.model.get('rolsuper'));
this.model.set('rolcreatedb', this.model.get('rolsuper'));
}
},
}),
disabled: 'readonly'
disabled: 'readonly',
},{
id: 'rolcreaterole', label: gettext('Create roles?'),
group: gettext('Privileges'), type: 'switch',
options: switchOptions, disabled: 'readonly',
control: RoleCustomSwitchControl
control: RoleCustomSwitchControl,
},{
id: 'description', label: gettext('Comments'), type: 'multiline',
group: null, mode: ['properties', 'edit', 'create'],
options: switchOptions, disabled: 'readonly'
options: switchOptions, disabled: 'readonly',
},{
id: 'rolcreatedb', label: gettext('Create databases?'),
group: gettext('Privileges'), type: 'switch',
options: switchOptions, disabled: 'readonly',
control: RoleCustomSwitchControl
control: RoleCustomSwitchControl,
},{
id: 'rolcatupdate', label: gettext('Update catalog?'),
type: 'switch', max_version: 90400, options: switchOptions,
control: RoleCustomSwitchControl,
group: gettext('Privileges'), disabled: function(m) {
return (m.get('read_only') || (!m.get('rolsuper')));
}
},
},{
id: 'rolinherit', group: gettext('Privileges'),
label: gettext('Inherit rights from the parent roles?'),
type: 'switch', options: switchOptions, disabled: 'readonly',
control: RoleCustomSwitchControl
control: RoleCustomSwitchControl,
},{
id: 'rolreplication', group: gettext('Privileges'),
label: gettext('Can initiate streaming replication and backups?'),
type: 'switch', min_version: 90100, options: switchOptions,
disabled: 'readonly', control: RoleCustomSwitchControl
disabled: 'readonly', control: RoleCustomSwitchControl,
},{
id: 'rolmembership', label: gettext('Roles'),
group: gettext('Membership'), type: 'collection',
@ -486,11 +480,11 @@ define('pgadmin.node.role', [
idAttribute: 'role',
defaults: {
role: undefined,
admin: false
admin: false,
},
validate: function() {
return null;
}
},
}),
filter: function(d) {
return this.model.isNew() || (this.model.get('rolname') != d.label);
@ -501,20 +495,20 @@ define('pgadmin.node.role', [
} else {
return gettext('Roles shown with a check mark have the WITH ADMIN OPTION set.');
}
}
},
},{
id: 'variables', label: gettext('Parameters'), type: 'collection',
group: gettext('Parameters'), hasDatabase: true, url: 'variables',
model: pgBrowser.Node.VariableModel.extend({keys:['name', 'database']}),
control: 'variable-collection',
mode: [ 'edit', 'create'], canAdd: true, canDelete: true,
url: "variables", disabled: 'readonly'
disabled: 'readonly',
},{
id: 'seclabels', label: gettext('Security Labels'),
model: SecurityModel, editable: false, type: 'collection',
group: gettext('Security'), mode: ['edit', 'create'],
min_version: 90200, disabled: 'readonly', canAdd: true,
canEdit: false, canDelete: true, control: 'unique-col-collection'
canEdit: false, canDelete: true, control: 'unique-col-collection',
}],
readonly: function(m) {
if (!m.has('read_only')) {
@ -528,8 +522,8 @@ define('pgadmin.node.role', [
validate: function()
{
var err = {},
errmsg,
seclabels = this.get('seclabels');
errmsg,
seclabels = this.get('seclabels');
if (_.isUndefined(this.get('rolname')) || String(this.get('rolname')).replace(/^\s+|\s+$/g, '') == '') {
err['name'] = gettext('Name cannot be empty.');
@ -555,9 +549,9 @@ define('pgadmin.node.role', [
}
return null;
}
})
})
},
}),
});
}
return pgBrowser.Nodes['role'];

View File

@ -1,7 +1,6 @@
define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
'backgrid', 'alertify', 'pgadmin.browser.node', 'pgadmin.browser.node.ui'
],
function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgNode) {
'backgrid', 'alertify', 'pgadmin.browser.node', 'pgadmin.browser.node.ui',
], function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgNode) {
/**
* Each Privilege, supporeted by an database object, will be represented
* using this Model.
@ -17,11 +16,11 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
defaults: {
privilege_type: undefined,
privilege: false,
with_grant: false
with_grant: false,
},
validate: function() {
return null;
}
},
});
/**
@ -39,7 +38,7 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
defaults: {
grantee: undefined,
grantor: undefined,
privileges: undefined
privileges: undefined,
},
keys: ['grantee', 'grantor'],
/*
@ -58,28 +57,28 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
}
return !(
m.top && m.top.node_info &&
m.top.node_info.server.user.name == m.get('grantor')
m.top.node_info.server.user.name == m.get('grantor')
);
},
transform: function(data) {
transform: function() {
var res =
Backgrid.Extension.NodeListByNameCell.prototype.defaults.transform.apply(
this, arguments
);
);
res.unshift({label: 'PUBLIC', value: 'PUBLIC'});
return res;
},
cell: Backgrid.Extension.NodeListByNameCell.extend({
initialize: function(opts) {
var self = this,
override_opts = true;
override_opts = true;
// We would like to override the original options, because - we
// should omit the existing role/user from the privilege cell.
// Because - the column is shared among all the cell, we can only
// override only once.
if (opts && opts.column &&
opts.column instanceof Backbone.Model &&
opts.column instanceof Backbone.Model &&
opts.column.get('options_cached')) {
override_opts = false;
}
@ -89,8 +88,10 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
// Let's override the options
if (override_opts) {
var opts = self.column.get('options');
self.column.set('options', self.omit_selected_roles.bind(self, opts));
opts = self.column.get('options');
self.column.set(
'options', self.omit_selected_roles.bind(self, opts)
);
}
var rerender = function (m) {
@ -108,32 +109,30 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
// collection, because - we need to omit the newly selected roles
// form the list. Also, the render will be automatically called for
// the model represented by this cell, we will not do that again.
this.listenTo(self.model.collection, "change", rerender, this);
this.listenTo(self.model.collection, "remove", rerender, this);
this.listenTo(self.model.collection, 'change', rerender, this);
this.listenTo(self.model.collection, 'remove', rerender, this);
},
// Remove all the selected roles (though- not mine).
omit_selected_roles: function(opts, cell) {
var res = opts(cell),
selected = {},
model = cell.model,
cid = model.cid,
// We need to check node_info values in parent when object is nested.
// eg: column level privileges in table dialog
// In this case node_info will not be avilable to column node as
// it is not loaded yet
node_info = (_.has(model.top, 'node_info')
&& !_.isUndefined(model.top.node_info)) ?
model.top.node_info :
model.handler.top.node_info,
curr_user = node_info.server.user.name;
var idx = 0;
selected = {},
model = cell.model,
cid = model.cid,
// We need to check node_info values in parent when object is nested.
// eg: column level privileges in table dialog
// In this case node_info will not be avilable to column node as
// it is not loaded yet
node_info = (_.has(model.top, 'node_info')
&& !_.isUndefined(model.top.node_info)) ?
model.top.node_info :
model.handler.top.node_info,
curr_user = node_info.server.user.name;
model.collection.each(function(m) {
var grantee = m.get('grantee');
if (m.cid != cid && !_.isUndefined(grantee) &&
curr_user == m.get('grantor')) {
curr_user == m.get('grantor')) {
selected[grantee] = m.cid;
}
});
@ -143,23 +142,26 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
});
return res;
}
},
}),
},{
id: 'privileges', label: gettext('Privileges'),
type: 'collection', model: PrivilegeModel, group: null,
cell: 'privilege', control: 'text', cellHeaderClasses: 'width_percent_40',
disabled : function(column, collection) {
disabled : function(column) {
if (column instanceof Backbone.Collection) {
// This has been called during generating the header cell
return false;
}
return !(this.node_info && this.node_info.server.user.name == column.get('grantor') ||
this.attributes.node_info.server.user.name == column.get('grantor'));
}
return !(
this.node_info &&
this.node_info.server.user.name == column.get('grantor') ||
this.attributes.node_info.server.user.name == column.get('grantor')
);
},
},{
id: 'grantor', label: gettext('Grantor'), type: 'text', disabled: true,
cell: 'node-list-by-name', node: 'role'
cell: 'node-list-by-name', node: 'role',
}],
/*
@ -172,36 +174,36 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
if (_.isNull(attrs)) {
this.set(
'grantor',
opts && opts.top && opts.top.node_info && opts.top.node_info.server.user.name,
{silent: true}
);
'grantor',
opts && opts.top && opts.top.node_info && opts.top.node_info.server.user.name,
{silent: true}
);
}
/*
* Define the collection of the privilege supported by this model
*/
var self = this,
models = self.get('privileges'),
privileges = this.get('privileges') || {};
models = self.get('privileges'),
privileges = this.get('privileges') || {};
if (_.isArray(privileges)) {
privileges = new (pgNode.Collection)(
models, {
model: PrivilegeModel,
top: this.top || this,
handler: this,
silent: true,
parse: false
});
models, {
model: PrivilegeModel,
top: this.top || this,
handler: this,
silent: true,
parse: false,
});
this.set('privileges', privileges, {silent: true});
}
var privs = {};
_.each(self.privileges, function(p) {
privs[p] = {
'privilege_type': p, 'privilege': false, 'with_grant': false
}
'privilege_type': p, 'privilege': false, 'with_grant': false,
};
});
privileges.each(function(m) {
@ -212,7 +214,7 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
privileges.add(p, {silent: true});
});
self.on("change:grantee", self.granteeChanged);
self.on('change:grantee', self.granteeChanged);
privileges.on('change', function() {
self.trigger('change:privileges', self);
});
@ -222,22 +224,22 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
granteeChanged: function() {
var privileges = this.get('privileges'),
grantee = this.get('grantee');
grantee = this.get('grantee');
// Reset all with grant options if grantee is public.
if (grantee == 'PUBLIC') {
privileges.each(function(m) {
m.set("with_grant", false, {silent: true});
m.set('with_grant', false, {silent: true});
});
}
},
toJSON: function(session) {
toJSON: function() {
var privileges = [];
if (this.attributes &&
!this.attributes['privileges']) {
!this.attributes['privileges']) {
return null;
}
@ -251,71 +253,68 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
return {
'grantee': this.get('grantee'),
'grantor': this.get('grantor'),
'privileges': privileges
};
'privileges': privileges,
};
},
validate: function() {
var err = {},
errmsg = null,
changedAttrs = this.sessAttrs,
msg = undefined;
var errmsg = null,
msg;
if (_.isUndefined(this.get('grantee'))) {
msg = gettext('A grantee must be selected.');
this.errorModel.set('grantee', msg);
errmsg = msg;
} else {
this.errorModel.unset('grantee');
this.errorModel.unset('grantee');
}
if (this.attributes &&
this.attributes['privileges']) {
var anyPrivSelected = false;
this.attributes['privileges'].each(
this.attributes['privileges']) {
var anyPrivSelected = false;
this.attributes['privileges'].each(
function(p) {
if (p.get('privilege')) {
anyPrivSelected = true;
}
});
if (!anyPrivSelected) {
msg = gettext('At least one privilege should be selected.');
this.errorModel.set('privileges', msg);
errmsg = errmsg || msg;
} else {
this.errorModel.unset('privileges');
}
if (!anyPrivSelected) {
msg = gettext('At least one privilege should be selected.');
this.errorModel.set('privileges', msg);
errmsg = errmsg || msg;
} else {
this.errorModel.unset('privileges');
}
}
return errmsg;
}
},
});
/**
Custom cell editor for editing privileges.
Custom cell editor for editing privileges.
*/
var PrivilegeCellEditor = Backgrid.Extension.PrivilegeCellEditor =
Backgrid.CellEditor.extend({
tagName: "div",
tagName: 'div',
// All available privileges in the PostgreSQL database server for
// generating the label for the specific Control
Labels: {
"C": "CREATE",
"T": "TEMPORARY",
"c": "CONNECT",
"a": "INSERT",
"r": "SELECT",
"w": "UPDATE",
"d": "DELETE",
"D": "TRUNCATE",
"x": "REFERENCES",
"t": "TRIGGER",
"U": "USAGE",
"X": "EXECUTE"
},
'C': 'CREATE',
'T': 'TEMPORARY',
'c': 'CONNECT',
'a': 'INSERT',
'r': 'SELECT',
'w': 'UPDATE',
'd': 'DELETE',
'D': 'TRUNCATE',
'x': 'REFERENCES',
't': 'TRIGGER',
'U': 'USAGE',
'X': 'EXECUTE',
},
template: _.template([
'<tr class="<%= header ? "header" : "" %>">',
@ -331,11 +330,11 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
' WITH GRANT OPTION',
' </label>',
' </td>',
'</tr>'].join(" "), null, {variable: null}),
'</tr>'].join(' '), null, {variable: null}),
events: {
'change': 'privilegeChanged',
'blur': 'lostFocus'
'blur': 'lostFocus',
},
render: function () {
@ -343,10 +342,10 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
this.$el.attr('tabindex', '1');
this.$el.attr('target', this.elId);
var collection = this.model.get(this.column.get("name")),
tbl = $("<table></table>").appendTo(this.$el),
self = this,
privilege = true, with_grant = true;
var collection = this.model.get(this.column.get('name')),
tbl = $('<table></table>').appendTo(this.$el),
self = this,
privilege = true, with_grant = true;
// For each privilege generate html template.
// List down all the Privilege model.
@ -362,8 +361,8 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
'header': false,
'privilege_label': self.Labels[d.privilege_type],
'with_grant': (self.model.get('grantee') != 'PUBLIC' && d.with_grant),
'enable_with_grant': (self.model.get('grantee') != 'PUBLIC' && d.privilege)
});
'enable_with_grant': (self.model.get('grantee') != 'PUBLIC' && d.privilege),
});
privilege = (privilege && d.privilege);
with_grant = (with_grant && privilege && d.with_grant);
tbl.append(self.template(d));
@ -372,15 +371,15 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
if (collection.length > 1) {
// Preprend the ALL controls on that table
tbl.prepend(
self.template({
'target': self.cid,
'privilege_label': 'ALL',
'privilege_type': 'ALL',
'privilege': privilege,
'with_grant': (self.model.get('grantee') != 'PUBLIC' && with_grant),
'enable_with_grant': (self.model.get('grantee') != 'PUBLIC' && privilege),
'header': true
}));
self.template({
'target': self.cid,
'privilege_label': 'ALL',
'privilege_type': 'ALL',
'privilege': privilege,
'with_grant': (self.model.get('grantee') != 'PUBLIC' && with_grant),
'enable_with_grant': (self.model.get('grantee') != 'PUBLIC' && privilege),
'header': true,
}));
}
self.$el.find('input[type=checkbox]').first().focus();
// Since blur event does not bubble we need to explicitly call parent's blur event.
@ -406,13 +405,14 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
* We're looking for checkboxes only.
*/
var $el = $(ev.target),
privilege_type = $el.attr('privilege'),
type = $el.attr('name'),
checked = $el.prop('checked'),
$tr = $el.closest('tr'),
$tbl = $tr.closest('table'),
collection = this.model.get('privileges'),
grantee = this.model.get('grantee');
privilege_type = $el.attr('privilege'),
type = $el.attr('name'),
checked = $el.prop('checked'),
$tr = $el.closest('tr'),
$tbl = $tr.closest('table'),
collection = this.model.get('privileges'),
grantee = this.model.get('grantee'), $allGrants,
$allPrivileges, $elGrant;
this.undelegateEvents();
/*
@ -420,14 +420,15 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
* the checkbox for each privilege.
*/
if (privilege_type == 'ALL') {
var $elGrant = $tr.find('input[name=with_grant]'),
$allPrivileges = $tbl.find(
'input[name=privilege][privilege!=\'ALL\']'
),
$allGrants = $tbl.find(
'input[name=with_grant][privilege!=\'ALL\']'
),
allPrivilege, allWithGrant;
var allPrivilege, allWithGrant;
$elGrant = $tr.find('input[name=with_grant]');
$allPrivileges = $tbl.find(
'input[name=privilege][privilege!=\'ALL\']'
);
$allGrants = $tbl.find(
'input[name=with_grant][privilege!=\'ALL\']'
);
if (type == 'privilege') {
/*
@ -439,6 +440,7 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
if (checked) {
$allPrivileges.prop('checked', true);
/*
* We have clicked the ALL checkbox, we should be able to select
* the grant options too.
@ -461,7 +463,7 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
*/
$allPrivileges.prop('checked', false);
$elGrant.prop('checked', false),
$allGrants.prop('checked', false);
$allGrants.prop('checked', false);
$elGrant.prop('disabled', true);
$allGrants.prop('disabled', true);
}
@ -479,146 +481,149 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
$allGrants.prop('checked', checked);
}
/*
* Set the values for each Privilege Model.
*/
collection.each(function(m) {
m.set(
{'privilege': allPrivilege, 'with_grant': allWithGrant},
{silent: true}
/*
* Set the values for each Privilege Model.
*/
collection.each(function(m) {
m.set(
{'privilege': allPrivilege, 'with_grant': allWithGrant},
{silent: true}
);
});
} else {
/*
* Particular privilege has been selected/deselected, which can be
* identified using the privilege="X" attribute.
*/
var attrs = {};
$tbl = $tr.closest('table');
$allPrivileges = $tbl.find(
'input[name=privilege][privilege=\'ALL\']'
);
$allGrants = $tbl.find(
'input[name=with_grant][privilege=\'ALL\']'
);
});
} else {
/*
* Particular privilege has been selected/deselected, which can be
* identified using the privilege="X" attribute.
*/
var attrs = {},
$tbl = $tr.closest('table'),
$allPrivilege = $tbl.find(
'input[name=privilege][privilege=\'ALL\']'
),
$allGrant = $tbl.find(
'input[name=with_grant][privilege=\'ALL\']'
);
attrs[type] = checked;
attrs[type] = checked;
if (type == 'privilege') {
var $elGrant = ($el.closest('tr')).find('input[name=with_grant]');
if (!checked) {
attrs['with_grant'] = false;
if (type == 'privilege') {
$elGrant = ($el.closest('tr')).find('input[name=with_grant]');
if (!checked) {
attrs['with_grant'] = false;
$elGrant.prop('checked', false).prop('disabled', true);
$allPrivilege.prop('checked', false);
$allGrant.prop('disabled', true);
$allGrant.prop('checked', false);
} else if (grantee != "PUBLIC") {
$elGrant.prop('disabled', false);
$elGrant.prop('checked', false).prop('disabled', true);
$allPrivileges.prop('checked', false);
$allGrants.prop('disabled', true);
$allGrants.prop('checked', false);
} else if (grantee != 'PUBLIC') {
$elGrant.prop('disabled', false);
}
} else if (!checked) {
$allGrants.prop('checked', false);
}
} else if (!checked) {
$allGrant.prop('checked', false);
}
collection.get(privilege_type).set(attrs, {silent: true});
collection.get(privilege_type).set(attrs, {silent: true});
if (checked) {
var $allPrivileges = $tbl.find(
'input[name=privilege][privilege!=\'ALL\']:checked'
);
if (checked) {
$allPrivileges = $tbl.find(
'input[name=privilege][privilege!=\'ALL\']:checked'
);
if ($allPrivileges.length > 1 &&
$allPrivileges.length == collection.models.length) {
if ($allPrivileges.length > 1 &&
$allPrivileges.length == collection.models.length) {
$allPrivilege.prop('checked', true);
$allPrivileges.prop('checked', true);
if (type == 'with_grant') {
var $allGrants = $tbl.find(
'input[name=with_grant][privilege!=\'ALL\']:checked'
if (type == 'with_grant') {
$allGrants = $tbl.find(
'input[name=with_grant][privilege!=\'ALL\']:checked'
);
if ($allGrants.length == collection.models.length) {
$allGrant.prop('disabled', false);
$allGrant.prop('checked', true);
if ($allGrants.length == collection.models.length) {
$allGrants.prop('disabled', false);
$allGrants.prop('checked', true);
}
} else if (grantee != 'PUBLIC') {
$allGrants.prop('disabled', false);
}
} else if (grantee != "PUBLIC") {
$allGrant.prop('disabled', false);
}
}
}
}
this.model.trigger('change', this.model);
this.model.trigger('change', this.model);
var anySelected = false,
var anySelected = false,
msg = null;
collection.each(function(m) {
anySelected = anySelected || m.get('privilege');
});
collection.each(function(m) {
anySelected = anySelected || m.get('privilege');
});
if (anySelected) {
this.model.errorModel.unset('privileges');
if (this.model.errorModel.has('grantee')) {
msg = this.model.errorModel.get('grantee');
if (anySelected) {
this.model.errorModel.unset('privileges');
if (this.model.errorModel.has('grantee')) {
msg = this.model.errorModel.get('grantee');
}
} else {
this.model.errorModel.set(
'privileges', gettext('At least one privilege should be selected.')
);
msg = gettext('At least one privilege should be selected.');
}
} else {
this.model.errorModel.set(
'privileges', gettext('At least one privilege should be selected.')
if (msg) {
this.model.collection.trigger(
'pgadmin-session:model:invalid', msg, this.model
);
msg = gettext('At least one privilege should be selected.');
} else {
this.model.collection.trigger(
'pgadmin-session:model:valid', this.model
);
}
}
if (msg) {
this.model.collection.trigger(
'pgadmin-session:model:invalid', msg, this.model
);
} else {
this.model.collection.trigger(
'pgadmin-session:model:valid', this.model
);
}
}
this.delegateEvents();
},
this.delegateEvents();
},
lostFocus: function(ev) {
/*
* We lost the focus, it's time for us to exit the editor.
*/
var self = this,
/*
* Function to determine whether one dom element is descendant of another
* dom element.
*/
isDescendant = function (parent, child) {
var node = child.parentNode;
while (node != null) {
if (node == parent) {
return true;
}
node = node.parentNode;
}
return false;
}
/*
* Between leaving the old element focus and entering the new element focus the
* active element is the document/body itself so add timeout to get the proper
* focused active element.
*/
setTimeout(function() {
lostFocus: function(ev) {
/*
Do not close the control if user clicks outside dialog window,
only close the row if user clicks on add button or on another row, if user
clicks somewhere else then we will get tagName as 'BODY' or 'WINDOW'
*/
var is_active_element = document.activeElement.tagName == 'DIV' ||
document.activeElement.tagName == 'BUTTON';
* We lost the focus, it's time for us to exit the editor.
*/
var self = this,
/*
* Function to determine whether one dom element is descendant of another
* dom element.
*/
isDescendant = function (parent, child) {
var node = child.parentNode;
while (node != null) {
if (node == parent) {
return true;
}
node = node.parentNode;
}
return false;
};
if (is_active_element && self.$el[0] != document.activeElement &&
!isDescendant(self.$el[0], document.activeElement)) {
var m = self.model;
m.trigger('backgrid:edited', m, self.column, new Backgrid.Command(ev));
}},10);
return;
}
});
/*
* Between leaving the old element focus and entering the new element focus the
* active element is the document/body itself so add timeout to get the proper
* focused active element.
*/
setTimeout(function() {
/*
* Do not close the control if user clicks outside dialog window,
* only close the row if user clicks on add button or on another row,
* if user clicks somewhere else then we will get tagName as 'BODY'
* or 'WINDOW'
*/
var is_active_element = document.activeElement.tagName == 'DIV' ||
document.activeElement.tagName == 'BUTTON';
if (is_active_element && self.$el[0] != document.activeElement &&
!isDescendant(self.$el[0], document.activeElement)) {
var m = self.model;
m.trigger('backgrid:edited', m, self.column, new Backgrid.Command(ev));
}},10);
return;
},
});
/*
* This will help us transform the privileges value in proper format to be
@ -628,26 +633,25 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
function () {};
_.extend(PrivilegeCellFormatter.prototype, {
notation: {
"CREATE" : "C",
"TEMPORARY" : "T",
"CONNECT" : "c",
"INSERT" : "a",
"SELECT" : "r",
"UPDATE" : "w",
"DELETE" : "d",
"TRUNCATE" : "D",
"REFERENCES" : "x",
"TRIGGER" : "t",
"USAGE" : "U",
"EXECUTE" : "X"
'CREATE' : 'C',
'TEMPORARY' : 'T',
'CONNECT' : 'c',
'INSERT' : 'a',
'SELECT' : 'r',
'UPDATE' : 'w',
'DELETE' : 'd',
'TRUNCATE' : 'D',
'REFERENCES' : 'x',
'TRIGGER' : 't',
'USAGE' : 'U',
'EXECUTE' : 'X',
},
/**
* Takes a raw value from a model and returns an optionally formatted
* string for display.
*/
fromRaw: function (rawData, model) {
var res = '',
self = this;
fromRaw: function (rawData) {
var res = '';
if (rawData instanceof Backbone.Collection) {
rawData.each(function(m) {
@ -660,23 +664,23 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
});
}
return res;
}
},
});
/*
* PrivilegeCell for rendering and taking input for the privileges.
*/
var PrivilegeCell = Backgrid.Extension.PrivilegeCell = Backgrid.Cell.extend({
className: "edit-cell",
Backgrid.Extension.PrivilegeCell = Backgrid.Cell.extend({
className: 'edit-cell',
formatter: PrivilegeCellFormatter,
editor: PrivilegeCellEditor,
initialize: function (options) {
initialize: function () {
var self = this;
Backgrid.Cell.prototype.initialize.apply(this, arguments);
self.model.on("change:grantee", function() {
if (!self.$el.hasClass("editor")) {
self.model.on('change:grantee', function() {
if (!self.$el.hasClass('editor')) {
/*
* Add time out before render; As we might want to wait till model
* is updated by PrivilegeRoleModel:granteeChanged.
@ -686,7 +690,7 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform',
},10);
}
});
}
},
});
return PrivilegeRoleModel;

File diff suppressed because it is too large Load Diff

View File

@ -1,495 +1,480 @@
define([
'sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify',
'sources/pgadmin', 'pgadmin.browser.node', 'pgadmin.browser.node.ui'
],
function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgAdmin, pgNode) {
'sources/pgadmin', 'pgadmin.browser.node', 'pgadmin.browser.node.ui',
],
function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgAdmin, pgNode) {
/*
* cellFunction for variable control.
* This function returns cell class depending on vartype.
*/
var cellFunction = function(model) {
var self = this,
name = model.get("name"),
availVariables = {};
/*
* cellFunction for variable control.
* This function returns cell class depending on vartype.
*/
var cellFunction = function(model) {
var self = this,
name = model.get('name'),
availVariables = {};
self.collection.each(function(col) {
if (col.get("name") == "name") {
availVariables = col.get('availVariables');
}
});
self.collection.each(function(col) {
if (col.get('name') == 'name') {
availVariables = col.get('availVariables');
}
});
var variable = name ? availVariables[name]: undefined,
value = model.get('value');
var variable = name ? availVariables[name]: undefined,
value = model.get("value");
switch(variable && variable.vartype) {
case 'bool':
/*
* bool cell and variable cannot be stateless (i.e undefined).
* It should be either true or false.
*/
switch(variable && variable.vartype) {
case "bool":
/*
* bool cell and variable cannot be stateless (i.e undefined).
* It should be either true or false.
*/
model.set("value", !!model.get("value"), {silent: true});
model.set('value', !!model.get('value'), {silent: true});
return Backgrid.Extension.SwitchCell;
break;
case "enum":
case 'enum':
model.set({'value': value}, {silent:true});
var options = [],
enumVals = variable.enumvals;
enumVals = variable.enumvals;
_.each(enumVals, function(enumVal) {
options.push([enumVal, enumVal]);
});
return Backgrid.Extension.Select2Cell.extend({optionValues: options});
break;
case "integer":
case 'integer':
if (!_.isNaN(parseInt(value))) {
model.set({'value': parseInt(value)}, {silent:true});
} else {
model.set({'value': undefined}, {silent:true});
}
return Backgrid.IntegerCell;
break;
case "real":
case 'real':
if (!_.isNaN(parseFloat(value))) {
model.set({'value': parseFloat(value)}, {silent:true});
} else {
model.set({'value': undefined}, {silent:true});
}
return Backgrid.NumberCell.extend({decimals: 0});
break;
case "string":
case 'string':
return Backgrid.StringCell;
break;
default:
model.set({'value': undefined}, {silent:true});
return Backgrid.Cell;
break;
}
model.set({'value': undefined}, {silent:true});
return Backgrid.Cell;
}
}
};
/*
* This row will define behaviour or value column cell depending upon
* variable name.
*/
var VariableRow = Backgrid.Row.extend({
modelDuplicateColor: "lightYellow",
/*
* This row will define behaviour or value column cell depending upon
* variable name.
*/
var VariableRow = Backgrid.Row.extend({
modelDuplicateColor: 'lightYellow',
modelUniqueColor: "#fff",
modelUniqueColor: '#fff',
initialize: function () {
Backgrid.Row.prototype.initialize.apply(this, arguments);
var self = this;
self.model.on("change:name", function() {
setTimeout(function() {
self.columns.each(function(col) {
if (col.get('name') == 'value') {
initialize: function () {
Backgrid.Row.prototype.initialize.apply(this, arguments);
var self = this;
self.model.on('change:name', function() {
setTimeout(function() {
self.columns.each(function(col) {
if (col.get('name') == 'value') {
var idx = self.columns.indexOf(col),
cf = col.get("cellFunction"),
cell = new (cf.apply(col, [self.model]))({
column: col,
model: self.model
}),
var idx = self.columns.indexOf(col),
cf = col.get('cellFunction'),
cell = new (cf.apply(col, [self.model]))({
column: col,
model: self.model,
}),
oldCell = self.cells[idx];
oldCell.remove();
self.cells[idx] = cell;
self.render();
}
}
});
}, 10);
});
self.listenTo(self.model, 'pgadmin-session:model:duplicate', self.modelDuplicate);
self.listenTo(self.model, 'pgadmin-session:model:unique', self.modelUnique);
},
modelDuplicate: function() {
$(this.el).removeClass("new");
this.el.style.backgroundColor = this.modelDuplicateColor;
},
modelUnique: function() {
this.el.style.backgroundColor = this.modelUniqueColor;
}
});
}, 10);
});
self.listenTo(self.model, 'pgadmin-session:model:duplicate', self.modelDuplicate);
self.listenTo(self.model, 'pgadmin-session:model:unique', self.modelUnique);
},
modelDuplicate: function() {
$(this.el).removeClass('new');
this.el.style.backgroundColor = this.modelDuplicateColor;
},
modelUnique: function() {
this.el.style.backgroundColor = this.modelUniqueColor;
},
})
/**
* VariableModel used to represent configuration parameters (variables tab)
* for database objects.
**/
var VariableModel = pgNode.VariableModel = pgNode.Model.extend({
keys: ['name'],
defaults: {
name: undefined,
value: undefined,
role: null,
database: null,
},
schema: [
{
id: 'name', label: gettext('Name'), type:'text', cellHeaderClasses: 'width_percent_30',
editable: function(m) {
return (m instanceof Backbone.Collection) ? true : m.isNew();
},
cell: Backgrid.Extension.NodeAjaxOptionsCell.extend({
initialize: function() {
Backgrid.Extension.NodeAjaxOptionsCell.prototype.initialize.apply(this, arguments);
});
/**
* VariableModel used to represent configuration parameters (variables tab)
* for database objects.
**/
var VariableModel = pgNode.VariableModel = pgNode.Model.extend({
keys: ['name'],
defaults: {
name: undefined,
value: undefined,
role: null,
database: null,
},
schema: [
{
id: 'name', label: gettext('Name'), type:'text', cellHeaderClasses: 'width_percent_30',
editable: function(m) {
return (m instanceof Backbone.Collection) ? true : m.isNew();
},
cell: Backgrid.Extension.NodeAjaxOptionsCell.extend({
initialize: function() {
Backgrid.Extension.NodeAjaxOptionsCell.prototype.initialize.apply(this, arguments);
// Immediately process options as we need them before render.
// Immediately process options as we need them before render.
var opVals = _.clone(this.optionValues ||
var opVals = _.clone(this.optionValues ||
(_.isFunction(this.column.get('options')) ?
(this.column.get('options'))(this) :
(this.column.get('options'))(this) :
this.column.get('options')));
this.column.set('options', opVals);
}
}),
url: 'vopts',
select2: { allowClear: false },
transform: function(vars, cell) {
var self = this,
res = [],
this.column.set('options', opVals);
},
}),
url: 'vopts',
select2: { allowClear: false },
transform: function(vars, cell) {
var res = [],
availVariables = {};
_.each(vars, function(v) {
res.push({
'value': v.name,
'image': undefined,
'label': v.name
_.each(vars, function(v) {
res.push({
'value': v.name,
'image': undefined,
'label': v.name,
});
availVariables[v.name] = v;
});
availVariables[v.name] = v;
});
cell.column.set("availVariables", availVariables);
return res;
cell.column.set('availVariables', availVariables);
return res;
},
},
{
id: 'value', label: gettext('Value'), type: 'text', editable: true,
cellFunction: cellFunction, cellHeaderClasses: 'width_percent_40',
},
{id: 'database', label: gettext('Database'), type: 'text', editable: true,
node: 'database', cell: Backgrid.Extension.NodeListByNameCell,
},
{id: 'role', label: gettext('Role'), type: 'text', editable: true,
node: 'role', cell: Backgrid.Extension.NodeListByNameCell},
],
toJSON: function() {
var d = Backbone.Model.prototype.toJSON.apply(this);
// Remove not defined values from model values.
// i.e.
// role, database
if (_.isUndefined(d.database) || _.isNull(d.database)) {
delete d.database;
}
},
{
id: 'value', label: gettext('Value'), type: 'text', editable: true,
cellFunction: cellFunction, cellHeaderClasses: 'width_percent_40'
},
{id: 'database', label: gettext('Database'), type: 'text', editable: true,
node: 'database', cell: Backgrid.Extension.NodeListByNameCell
},
{id: 'role', label: gettext('Role'), type: 'text', editable: true,
node: 'role', cell: Backgrid.Extension.NodeListByNameCell}
],
toJSON: function() {
var d = Backbone.Model.prototype.toJSON.apply(this);
// Remove not defined values from model values.
// i.e.
// role, database
if (_.isUndefined(d.database) || _.isNull(d.database)) {
delete d.database;
}
if (_.isUndefined(d.role) || _.isNull(d.role)) {
delete d.role;
}
if (_.isUndefined(d.role) || _.isNull(d.role)) {
delete d.role;
}
return d;
},
validate: function() {
if (_.isUndefined(this.get('name')) ||
return d;
},
validate: function() {
var msg = null;
if (_.isUndefined(this.get('name')) ||
_.isNull(this.get('name')) ||
String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
var msg = 'Please select a parameter name.';
this.errorModel.set('name', msg);
return msg;
} else if (_.isUndefined(this.get('value')) ||
_.isNull(this.get('value')) ||
String(this.get('value')).replace(/^\s+|\s+$/g, '') == '') {
var msg = 'Please enter a value for the parameter.';
this.errorModel.set('value', msg);
return msg;
} else {
this.errorModel.unset('name');
this.errorModel.unset('value');
}
return null;
}
});
/**
* Variable Tab Control to set/update configuration values for database object.
*
**/
var VariableCollectionControl = Backform.VariableCollectionControl =
Backform.UniqueColCollectionControl.extend({
hasDatabase: false,
hasRole: false,
initialize: function(opts) {
var self = this,
keys = ['name'];
/*
* Read from field schema whether user wants to use database and role
* fields in Variable control.
*/
self.hasDatabase = opts.field.get('hasDatabase');
self.hasRole = opts.field.get('hasRole');
// Update unique coll field based on above flag status.
if (self.hasDatabase) {
keys.push('database');
} else if (self.hasRole) {
keys.push('role');
}
// Overriding the uniqueCol in the field
if (opts && opts.field) {
if (opts.field instanceof Backform.Field) {
opts.field.set({
model: pgNode.VariableModel.extend({keys:keys})
},
{
silent: true
});
String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Please select a parameter name.');
this.errorModel.set('name', msg);
} else if (_.isUndefined(this.get('value')) ||
_.isNull(this.get('value')) ||
String(this.get('value')).replace(/^\s+|\s+$/g, '') == '') {
msg = ('Please enter a value for the parameter.');
this.errorModel.set('value', msg);
this.errorModel.unset('name');
} else {
opts.field.extend({
model: pgNode.VariableModel.extend({keys:keys})
});
this.errorModel.unset('name');
this.errorModel.unset('value');
}
}
Backform.UniqueColCollectionControl.prototype.initialize.apply(
self, arguments
);
return msg;
},
});
self.availVariables = {};
/**
* Variable Tab Control to set/update configuration values for database object.
*
**/
Backform.VariableCollectionControl =
Backform.UniqueColCollectionControl.extend({
var node = self.field.get('node').type,
gridCols = ['name', 'value'];
hasDatabase: false,
hasRole: false,
if (self.hasDatabase) {
gridCols.push('database');
}
initialize: function(opts) {
var self = this,
keys = ['name'];
if (self.hasRole) {
gridCols.push('role');
}
/*
* Read from field schema whether user wants to use database and role
* fields in Variable control.
*/
self.hasDatabase = opts.field.get('hasDatabase');
self.hasRole = opts.field.get('hasRole');
self.gridSchema = Backform.generateGridColumnsFromModel(
self.field.get('node_info'), VariableModel.extend({keys:keys}), 'edit', gridCols, self.field.get('schema_node')
);
// Make sure - we do have the data for variables
self.getVariables();
},
/*
* Get the variable data for this node.
*/
getVariables: function() {
var self = this,
url = this.field.get('url'),
m = self.model;
if (!this.field.get('version_compatible'))
return;
if (url && !m.isNew()) {
var node = self.field.get('node'),
node_data = self.field.get('node_data'),
node_info = self.field.get('node_info'),
full_url = node.generate_url.apply(
node, [
null, url, node_data, true, node_info
]),
data,
isTracking = self.collection.trackChanges;
if (isTracking) {
self.collection.stopSession();
}
m.trigger('pgadmin-view:fetching', m, self.field);
$.ajax({
async: false,
url: full_url,
success: function (res) {
data = res.data;
},
error: function() {
m.trigger('pgadmin-view:fetch:error', m, self.field);
// Update unique coll field based on above flag status.
if (self.hasDatabase) {
keys.push('database');
} else if (self.hasRole) {
keys.push('role');
}
// Overriding the uniqueCol in the field
if (opts && opts.field) {
if (opts.field instanceof Backform.Field) {
opts.field.set({
model: pgNode.VariableModel.extend({keys:keys}),
},
{
silent: true,
});
} else {
opts.field.extend({
model: pgNode.VariableModel.extend({keys:keys}),
});
}
}
});
m.trigger('pgadmin-view:fetched', m, self.field);
if (data && _.isArray(data)) {
self.collection.reset(data, {silent: true});
}
Backform.UniqueColCollectionControl.prototype.initialize.apply(
self, arguments
);
self.availVariables = {};
var gridCols = ['name', 'value'];
if (self.hasDatabase) {
gridCols.push('database');
}
if (self.hasRole) {
gridCols.push('role');
}
self.gridSchema = Backform.generateGridColumnsFromModel(
self.field.get('node_info'), VariableModel.extend({keys:keys}), 'edit', gridCols, self.field.get('schema_node')
);
// Make sure - we do have the data for variables
self.getVariables();
},
/*
* Make sure - new data will be taken care by the session management
* Get the variable data for this node.
*/
if (isTracking) {
self.collection.startNewSession();
}
}
},
getVariables: function() {
var self = this,
url = this.field.get('url'),
m = self.model;
showGridControl: function(data) {
if (!this.field.get('version_compatible'))
return;
var self = this,
titleTmpl = _.template([
"<div class='subnode-header'>",
"<label class='control-label'><%-label%></label>",
"<button class='btn-sm btn-default add fa fa-plus' <%=canAdd ? '' : 'disabled=\"disabled\"'%>></button>",
"</div>"].join("\n")),
$gridBody =
$("<div class='pgadmin-control-group backgrid form-group col-xs-12 object subnode'></div>").append(
if (url && !m.isNew()) {
var node = self.field.get('node'),
node_data = self.field.get('node_data'),
node_info = self.field.get('node_info'),
full_url = node.generate_url.apply(
node, [
null, url, node_data, true, node_info,
]),
data,
isTracking = self.collection.trackChanges;
if (isTracking) {
self.collection.stopSession();
}
m.trigger('pgadmin-view:fetching', m, self.field);
$.ajax({
async: false,
url: full_url,
success: function (res) {
data = res.data;
},
error: function() {
m.trigger('pgadmin-view:fetch:error', m, self.field);
},
});
m.trigger('pgadmin-view:fetched', m, self.field);
if (data && _.isArray(data)) {
self.collection.reset(data, {silent: true});
}
/*
* Make sure - new data will be taken care by the session management
*/
if (isTracking) {
self.collection.startNewSession();
}
}
},
showGridControl: function(data) {
var self = this,
titleTmpl = _.template([
'<div class=\'subnode-header\'>',
'<label class=\'control-label\'><%-label%></label>',
'<button class=\'btn-sm btn-default add fa fa-plus\' <%=canAdd ? \'\' : \'disabled="disabled"\'%>></button>',
'</div>'].join('\n')),
$gridBody =
$('<div class=\'pgadmin-control-group backgrid form-group col-xs-12 object subnode\'></div>').append(
titleTmpl(data)
);
// Clean up existing grid if any (in case of re-render)
if (self.grid) {
self.grid.remove();
}
var gridSchema = _.clone(this.gridSchema);
_.each(gridSchema.columns, function(col) {
if (col.name == 'value') {
col.availVariables = self.availVariables;
}
});
// Insert Delete Cell into Grid
if (data.disabled == false && data.canDelete) {
gridSchema.columns.unshift({
name: "pg-backform-delete", label: "",
cell: Backgrid.Extension.DeleteCell,
editable: false, cell_priority: -1
});
}
// Change format of each of the data
// Because - data coming from the server is in string format
self.collection.each(function(model) {
var name = model.get("name");
if (name in self.availVariables) {
switch(self.availVariables[name].vartype) {
case 'real':
var v = parseFloat(model.get('value'));
model.set('value', (isNaN(v) ? undefined : v), {silent: true});
break;
case 'integer':
var v = parseInt(model.get('value'));
model.set('value', (isNaN(v) ? undefined : v), {silent: true});
break;
default:
break;
// Clean up existing grid if any (in case of re-render)
if (self.grid) {
self.grid.remove();
}
}
});
// Initialize a new Grid instance
var grid = self.grid = new Backgrid.Grid({
columns: gridSchema.columns,
collection: self.collection,
row: VariableRow,
className: "backgrid table-bordered"
});
self.$grid = grid.render().$el;
var gridSchema = _.clone(this.gridSchema);
$gridBody.append(self.$grid);
_.each(gridSchema.columns, function(col) {
if (col.name == 'value') {
col.availVariables = self.availVariables;
}
});
// Add button callback
if (!(data.disabled || data.canAdd == false)) {
$gridBody.find('button.add').first().click(function(e) {
e.preventDefault();
var canAddRow = _.isFunction(data.canAddRow) ?
data.canAddRow.apply(self, [self.model]) : true;
if (canAddRow) {
// Insert Delete Cell into Grid
if (data.disabled == false && data.canDelete) {
gridSchema.columns.unshift({
name: 'pg-backform-delete', label: '',
cell: Backgrid.Extension.DeleteCell,
editable: false, cell_priority: -1,
});
}
var allowMultipleEmptyRows = !!self.field.get('allowMultipleEmptyRows');
// Change format of each of the data
// Because - data coming from the server is in string format
self.collection.each(function(model) {
var name = model.get('name'), val;
// If allowMultipleEmptyRows is not set or is false then don't allow second new empty row.
// There should be only one empty row.
if (!allowMultipleEmptyRows && self.collection) {
var isEmpty = false;
self.collection.each(function(model) {
var modelValues = [];
_.each(model.attributes, function(val, key) {
modelValues.push(val);
})
if(!_.some(modelValues, _.identity)) {
isEmpty = true;
}
});
if(isEmpty) {
return false;
}
if (name in self.availVariables) {
switch(self.availVariables[name].vartype) {
case 'real':
val = parseFloat(model.get('value'));
model.set('value', (isNaN(val) ? undefined : val), {silent: true});
break;
case 'integer':
val = parseInt(model.get('value'));
model.set('value', (isNaN(val) ? undefined : val), {silent: true});
break;
default:
break;
}
}
});
$(grid.body.$el.find($("tr.new"))).removeClass("new")
var m = new (data.model) (null, {
silent: true,
handler: self.collection,
top: self.model.top || self.model,
collection: self.collection,
node_info: self.model.node_info
});
self.collection.add(m);
// Initialize a new Grid instance
var grid = self.grid = new Backgrid.Grid({
columns: gridSchema.columns,
collection: self.collection,
row: VariableRow,
className: 'backgrid table-bordered',
});
self.$grid = grid.render().$el;
var idx = self.collection.indexOf(m),
$gridBody.append(self.$grid);
// Add button callback
if (!(data.disabled || data.canAdd == false)) {
$gridBody.find('button.add').first().click(function(e) {
e.preventDefault();
var canAddRow = _.isFunction(data.canAddRow) ?
data.canAddRow.apply(self, [self.model]) : true;
if (canAddRow) {
var allowMultipleEmptyRows = !!self.field.get('allowMultipleEmptyRows');
// If allowMultipleEmptyRows is not set or is false then don't allow second new empty row.
// There should be only one empty row.
if (!allowMultipleEmptyRows && self.collection) {
var isEmpty = false;
self.collection.each(function(model) {
var modelValues = [];
_.each(model.attributes, function(val) {
modelValues.push(val);
});
if(!_.some(modelValues, _.identity)) {
isEmpty = true;
}
});
if(isEmpty) {
return false;
}
}
$(grid.body.$el.find($('tr.new'))).removeClass('new');
var m = new (data.model) (null, {
silent: true,
handler: self.collection,
top: self.model.top || self.model,
collection: self.collection,
node_info: self.model.node_info,
});
self.collection.add(m);
var idx = self.collection.indexOf(m),
newRow = grid.body.rows[idx].$el;
newRow.addClass("new");
$(newRow).pgMakeVisible('backform-tab');
newRow.addClass('new');
$(newRow).pgMakeVisible('backform-tab');
return false;
return false;
}
});
}
});
}
// Render node grid
return $gridBody;
},
// Render node grid
return $gridBody;
},
addVariable: function(ev) {
ev.preventDefault();
addVariable: function(ev) {
ev.preventDefault();
var self = this,
m = new (self.field.get('model'))(
self.headerData.toJSON(), {
silent: true, top: self.collection.top,
handler: self.collection
}),
coll = self.model.get(self.field.get('name'));
var self = this,
m = new (self.field.get('model'))(
self.headerData.toJSON(), {
silent: true, top: self.collection.top,
handler: self.collection,
}),
coll = self.model.get(self.field.get('name'));
coll.add(m);
coll.add(m);
var idx = coll.indexOf(m);
var idx = coll.indexOf(m);
// idx may not be always > -1 because our UniqueColCollection may
// remove 'm' if duplicate value found.
if (idx > -1) {
self.$grid.find('.new').removeClass('new');
// idx may not be always > -1 because our UniqueColCollection may
// remove 'm' if duplicate value found.
if (idx > -1) {
self.$grid.find('.new').removeClass('new');
var newRow = self.grid.body.rows[idx].$el;
var newRow = self.grid.body.rows[idx].$el;
newRow.addClass("new");
$(newRow).pgMakeVisible('backform-tab');
}
newRow.addClass('new');
$(newRow).pgMakeVisible('backform-tab');
}
return false;
}
return false;
},
});
return VariableModel;
});
return VariableModel;
});

View File

@ -1,21 +1,23 @@
define('pgadmin.node.tablespace', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
'pgadmin.browser.collection', 'pgadmin.browser.node.ui',
'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
'pgadmin.backform', 'pgadmin.browser.collection', 'pgadmin.browser.node.ui',
'pgadmin.browser.server.privilege',
], function(
gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser, Alertify, Backform
) {
if (!pgBrowser.Nodes['coll-tablespace']) {
var databases = pgBrowser.Nodes['coll-tablespace'] =
pgBrowser.Nodes['coll-tablespace'] =
pgBrowser.Collection.extend({
node: 'tablespace',
label: gettext('Tablespaces'),
type: 'coll-tablespace',
columns: ['name', 'spcuser', 'description'],
hasStatistics: true,
statsPrettifyFields: ['Size']
statsPrettifyFields: ['Size'],
});
};
}
if (!pgBrowser.Nodes['tablespace']) {
pgBrowser.Nodes['tablespace'] = pgBrowser.Node.extend({
@ -33,7 +35,7 @@ define('pgadmin.node.tablespace', [
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -42,42 +44,42 @@ define('pgadmin.node.tablespace', [
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Tablespace...'),
icon: 'wcTabIcon icon-tablespace', data: {action: 'create'},
enable: 'can_create_tablespace'
enable: 'can_create_tablespace',
},{
name: 'create_tablespace_on_coll', node: 'coll-tablespace', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Tablespace...'),
icon: 'wcTabIcon icon-tablespace', data: {action: 'create'},
enable: 'can_create_tablespace'
enable: 'can_create_tablespace',
},{
name: 'create_tablespace', node: 'tablespace', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 4, label: gettext('Tablespace...'),
icon: 'wcTabIcon icon-tablespace', data: {action: 'create'},
enable: 'can_create_tablespace'
enable: 'can_create_tablespace',
},{
name: 'move_tablespace', node: 'tablespace', module: this,
applies: ['object', 'context'], callback: 'move_objects',
category: 'move_tablespace', priority: 5,
label: gettext('Move objects to...'),
icon: 'fa fa-exchange', data: {action: 'create'},
enable: 'can_move_objects'
}
enable: 'can_move_objects',
},
]);
},
can_create_tablespace: function(node, item) {
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
server = treeData['server'];
return server.connected && server.user.is_superuser;
},
can_move_objects: function(node, item) {
var treeData = this.getTreeNodeHierarchy(item),
server = treeData['server'];
server = treeData['server'];
// Only supported PG9.4 and above version
return server.connected &&
server.user.is_superuser &&
server.version >= 90400;
server.user.is_superuser &&
server.version >= 90400;
},
callbacks: {
/* Move objects from one tablespace to another */
@ -87,7 +89,6 @@ define('pgadmin.node.tablespace', [
t = pgBrowser.tree,
i = input.item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type],
url = obj.generate_url(i, 'move_objects', d, true),
msql_url = obj.generate_url(i, 'move_objects_sql', d, true);
@ -96,107 +97,107 @@ define('pgadmin.node.tablespace', [
// Object model
var objModel = Backbone.Model.extend({
idAttribute: 'id',
defaults: {
new_tblspc: undefined,
obj_type: 'all',
user: undefined
idAttribute: 'id',
defaults: {
new_tblspc: undefined,
obj_type: 'all',
user: undefined,
},
schema: [{
id: 'tblspc', label: gettext('New tablespace'),
type: 'text', disabled: false, control: 'node-list-by-name',
node: 'tablespace', select2: {allowClear: false},
filter: function(o) {
return o && (o.label != d.label);
},
schema: [{
id: 'tblspc', label: gettext('New tablespace'),
type: 'text', disabled: false, control: 'node-list-by-name',
node: 'tablespace', select2: {allowClear: false},
filter: function(o) {
return o && (o.label != d.label);
}
},{
id: 'obj_type', label: gettext('Object type'),
type: 'text', disabled: false, control: 'select2',
select2: { allowClear: false, width: "100%" },
options: [
{label: gettext("All"), value: 'all'},
{label: gettext("Tables"), value: 'tables'},
{label: gettext("Indexes"), value: 'indexes'},
{label: gettext("Materialized views"), value: 'materialized_views'},
]
},{
id: 'user', label: gettext('Object owner'),
type: 'text', disabled: false, control: 'node-list-by-name',
node: 'role', select2: {allowClear: false}
},{
id: 'sqltab', label: gettext('SQL'), group: gettext('SQL'),
type: 'text', disabled: false, control: Backform.SqlTabControl.extend({
initialize: function() {
// Initialize parent class
Backform.SqlTabControl.prototype.initialize.apply(this, arguments);
},
onTabChange: function(obj) {
// Fetch the information only if the SQL tab is visible at the moment.
if (this.dialog && obj.shown == this.tabIndex) {
var self = this,
args = self.model.toJSON();
// Add existing tablespace
args.old_tblspc = d.label;
},{
id: 'obj_type', label: gettext('Object type'),
type: 'text', disabled: false, control: 'select2',
select2: { allowClear: false, width: '100%' },
options: [
{label: gettext('All'), value: 'all'},
{label: gettext('Tables'), value: 'tables'},
{label: gettext('Indexes'), value: 'indexes'},
{label: gettext('Materialized views'), value: 'materialized_views'},
],
},{
id: 'user', label: gettext('Object owner'),
type: 'text', disabled: false, control: 'node-list-by-name',
node: 'role', select2: {allowClear: false},
},{
id: 'sqltab', label: gettext('SQL'), group: gettext('SQL'),
type: 'text', disabled: false, control: Backform.SqlTabControl.extend({
initialize: function() {
// Initialize parent class
Backform.SqlTabControl.prototype.initialize.apply(this, arguments);
},
onTabChange: function(obj) {
// Fetch the information only if the SQL tab is visible at the moment.
if (this.dialog && obj.shown == this.tabIndex) {
var self = this,
args = self.model.toJSON();
// Add existing tablespace
args.old_tblspc = d.label;
// Fetches modified SQL
$.ajax({
url: msql_url,
type: 'GET',
cache: false,
data: args,
dataType: "json",
contentType: "application/json"
}).done(function(res) {
self.sqlCtrl.clearHistory();
self.sqlCtrl.setValue(res.data);
self.sqlCtrl.refresh();
}).fail(function() {
self.model.trigger('pgadmin-view:msql:error');
}).always(function() {
self.model.trigger('pgadmin-view:msql:fetched');
});
}
}
})
}],
validate: function() {
return null;
}
// Fetches modified SQL
$.ajax({
url: msql_url,
type: 'GET',
cache: false,
data: args,
dataType: 'json',
contentType: 'application/json',
}).done(function(res) {
self.sqlCtrl.clearHistory();
self.sqlCtrl.setValue(res.data);
self.sqlCtrl.refresh();
}).fail(function() {
self.model.trigger('pgadmin-view:msql:error');
}).always(function() {
self.model.trigger('pgadmin-view:msql:fetched');
});
}
},
}),
}],
validate: function() {
return null;
},
});
if(!alertify.move_objects_dlg) {
alertify.dialog('move_objects_dlg' ,function factory() {
if(!Alertify.move_objects_dlg) {
Alertify.dialog('move_objects_dlg' ,function factory() {
return {
main: function() {
var title = gettext('Move objects to another tablespace');
this.set('title', title);
var title = gettext('Move objects to another tablespace');
this.set('title', title);
},
build: function() {
alertify.pgDialogBuild.apply(this);
Alertify.pgDialogBuild.apply(this);
},
setup:function() {
return {
buttons: [{
text: '', key: 112, className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs:{name:'dialog_help', type:'button', label: gettext('Users'),
url: url_for('help.static', {'filename': 'move_objects.html'})}
},{
text: gettext('OK'), key: 13, className: 'btn btn-primary fa fa-lg fa-save pg-alertify-button'
},{
text: gettext('Cancel'), key: 27, className: 'btn btn-danger fa fa-lg fa-times pg-alertify-button'
}],
// Set options for dialog
options: {
//disable both padding and overflow control.
padding : !1,
overflow: !1,
modal: false,
resizable: true,
maximizable: true,
pinnable: false,
closableByDimmer: false
}
};
buttons: [{
text: '', key: 112, className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs:{name:'dialog_help', type:'button', label: gettext('Users'),
url: url_for('help.static', {'filename': 'move_objects.html'})},
},{
text: gettext('OK'), key: 13, className: 'btn btn-primary fa fa-lg fa-save pg-alertify-button',
},{
text: gettext('Cancel'), key: 27, className: 'btn btn-danger fa fa-lg fa-times pg-alertify-button',
}],
// Set options for dialog
options: {
//disable both padding and overflow control.
padding : !1,
overflow: !1,
modal: false,
resizable: true,
maximizable: true,
pinnable: false,
closableByDimmer: false,
},
};
},
hooks: {
// Triggered when the dialog is closed
@ -205,11 +206,11 @@ define('pgadmin.node.tablespace', [
// clear our backform model/view
this.view.remove({data: true, internal: true, silent: true});
}
}
},
},
prepare: function() {
var self = this,
$container = $("<div class='move_objects'></div>");
$container = $('<div class=\'move_objects\'></div>');
//Disbale Okay button
this.__internal.buttons[1].element.disabled = true;
// Find current/selected node
@ -224,13 +225,13 @@ define('pgadmin.node.tablespace', [
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
// Instance of backbone model
var newModel = new objModel({}, {node_info: treeInfo}),
fields = Backform.generateViewSchema(
treeInfo, newModel, 'create', node,
treeInfo.server, true
);
fields = Backform.generateViewSchema(
treeInfo, newModel, 'create', node,
treeInfo.server, true
);
var view = this.view = new Backform.Dialog({
el: $container, model: newModel, schema: fields
el: $container, model: newModel, schema: fields,
});
// Add our class to alertify
$(this.elements.body.childNodes[0]).addClass(
@ -248,13 +249,13 @@ define('pgadmin.node.tablespace', [
self.__internal.buttons[1].element.disabled = false;
} else {
self.__internal.buttons[1].element.disabled = true;
this.errorModel.set('tblspc', gettext('Please select tablespace'))
this.errorModel.set('tblspc', gettext('Please select tablespace'));
}
});
},
// Callback functions when click on the buttons of the Alertify dialogs
callback: function(e) {
if (e.button.element.name == "dialog_help") {
if (e.button.element.name == 'dialog_help') {
e.cancel = true;
pgBrowser.showHelp(e.button.element.name, e.button.element.getAttribute('url'),
null, null, e.button.element.getAttribute('label'));
@ -262,10 +263,10 @@ define('pgadmin.node.tablespace', [
}
if (e.button.text === gettext('OK')) {
var self = this,
args = this.view.model.toJSON();
args.old_tblspc = d.label;
args = this.view.model.toJSON();
args.old_tblspc = d.label;
e.cancel = true;
alertify.confirm(
Alertify.confirm(
gettext('Move objects...'),
gettext(
'Are you sure you wish to move the objects from %(old_tablespace)s to %(new_tablespace)s?',
@ -278,20 +279,22 @@ define('pgadmin.node.tablespace', [
data:{'data': JSON.stringify(args) },
success: function(res) {
if (res.success) {
alertify.success(res.info);
Alertify.success(res.info);
self.close();
} else {
alertify.error(res.errormsg);
Alertify.error(res.errormsg);
}
},
error: function(xhr, status, error) {
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
alertify.error(err.errormsg);
Alertify.error(err.errormsg);
}
} catch (e) {}
}
} catch (e) {
console.warn(e.stack || e);
}
},
});
},
function() {
@ -299,12 +302,12 @@ define('pgadmin.node.tablespace', [
}
);
}
}
}
},
};
});
}
alertify.move_objects_dlg(true).resizeTo('40%','50%');;
}
Alertify.move_objects_dlg(true).resizeTo('40%','50%');
},
},
model: pgBrowser.Node.Model.extend({
defaults: {
@ -314,7 +317,7 @@ define('pgadmin.node.tablespace', [
spclocation: undefined,
spcoptions: [],
spcacl: [],
seclabels:[]
seclabels:[],
},
// Default values!
@ -330,10 +333,10 @@ define('pgadmin.node.tablespace', [
schema: [{
id: 'name', label: gettext('Name'), cell: 'string',
type: 'text'
type: 'text',
},{
id: 'oid', label: gettext('OID'), cell: 'string',
type: 'text', disabled: true, mode: ['properties']
type: 'text', disabled: true, mode: ['properties'],
},{
id: 'spclocation', label: gettext('Location'), cell: 'string',
group: gettext('Definition'), type: 'text', mode: ['properties', 'edit','create'],
@ -341,59 +344,58 @@ define('pgadmin.node.tablespace', [
// To disabled it in edit mode,
// We'll check if model is new if yes then disabled it
return !m.isNew();
}
},
},{
id: 'spcuser', label: gettext('Owner'), cell: 'string',
type: 'text', control: 'node-list-by-name', node: 'role',
select2: {allowClear: false}
select2: {allowClear: false},
},{
id: 'acl', label: gettext('Privileges'), type: 'text',
group: gettext('Security'), mode: ['properties'], disabled: true
group: gettext('Security'), mode: ['properties'], disabled: true,
},{
id: 'description', label: gettext('Comment'), cell: 'string',
type: 'multiline'
type: 'multiline',
},{
id: 'spcoptions', label: gettext('Parameters'), type: 'collection',
group: gettext("Parameters"), control: 'variable-collection',
group: gettext('Parameters'), control: 'variable-collection',
model: pgBrowser.Node.VariableModel,
mode: ['edit', 'create'], canAdd: true, canEdit: false,
canDelete: true
},{
canDelete: true,
},{
id: 'spcacl', label: gettext('Privileges'), type: 'collection',
group: gettext('Security'), control: 'unique-col-collection',
model: pgBrowser.Node.PrivilegeRoleModel.extend({privileges: ['C']}),
mode: ['edit', 'create'], canAdd: true, canDelete: true,
uniqueCol : ['grantee'],
columns: ['grantee', 'grantor', 'privileges']
},{
columns: ['grantee', 'grantor', 'privileges'],
},{
id: 'seclabels', label: gettext('Security Labels'),
model: pgBrowser.SecLabelModel, editable: false, type: 'collection',
group: gettext('Security'), mode: ['edit', 'create'],
min_version: 90200, canAdd: true,
canEdit: false, canDelete: true, control: 'unique-col-collection'
}
canEdit: false, canDelete: true, control: 'unique-col-collection',
},
],
validate: function() {
var err = {},
errmsg = null,
changedAttrs = this.sessAttrs,
msg = undefined;
var msg;
if (_.isUndefined(this.get('name'))
|| String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
|| String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Name cannot be empty.');
this.errorModel.set('name', msg);
} else if (_.isUndefined(this.get('spclocation'))
|| String(this.get('spclocation')).replace(/^\s+|\s+$/g, '') == '') {
msg = gettext('Location cannot be empty.');
this.errorModel.set('spclocation', msg);
this.errorModel.unset('name');
} else {
this.errorModel.unset('name');
this.errorModel.unset('spclocation');
}
return null;
}
})
});
},
}),
});
}

View File

@ -1,7 +1,7 @@
define('pgadmin.node.server_group', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'sources/pgadmin',
'backbone', 'pgadmin.browser', 'pgadmin.browser.node'
], function(gettext, url_for, $, _, pgAdmin, Backbone) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.browser.node',
], function(gettext, url_for, $, _, pgAdmin) {
if (!pgAdmin.Browser.Nodes['server_group']) {
pgAdmin.Browser.Nodes['server_group'] = pgAdmin.Browser.Node.extend({
@ -15,7 +15,7 @@ define('pgadmin.node.server_group', [
Init: function() {
/* Avoid multiple registration of menus */
if (this.initialized)
return;
return;
this.initialized = true;
@ -23,26 +23,26 @@ define('pgadmin.node.server_group', [
name: 'create_server_group', node: 'server_group', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: gettext('Server Group...'),
data: {'action': 'create'}, icon: 'wcTabIcon icon-server_group'
data: {'action': 'create'}, icon: 'wcTabIcon icon-server_group',
}]);
},
model: pgAdmin.Browser.Node.Model.extend({
defaults: {
id: undefined,
name: null
name: null,
},
schema: [
{
id: 'id', label: gettext('ID'), type: 'int', group: null,
mode: ['properties']
mode: ['properties'],
},{
id: 'name', label: gettext('Name'), type: 'text', group: null,
mode: ['properties', 'edit', 'create']
}
mode: ['properties', 'edit', 'create'],
},
],
validate: function(attrs, options) {
var err = {},
errmsg = null;
validate: function() {
var errmsg = null;
this.errorModel.clear();
if (!this.isNew() && 'id' in this.changed) {
@ -52,20 +52,15 @@ define('pgadmin.node.server_group', [
}
if (_.isUndefined(this.get('name')) ||
_.isNull(this.get('name')) ||
String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
errmsg = gettext('Name cannot be empty.');
this.errorModel.set('name', errmsg);
return errmsg;
}
return null;
}
},
}),
canDrop: function(itemData, item, data) {
if(itemData.can_delete) {
return true;
}
return false;
},
canDrop: function(itemData) { return itemData.can_delete; },
canDelete: function(i) {
var s = pgAdmin.Browser.tree.siblings(i, true);
@ -74,7 +69,7 @@ define('pgadmin.node.server_group', [
return false;
}
return true;
}
},
});
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
'backbone', 'alertify', 'backform', 'backgrid', 'sources/browser/generate_url', 'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.node'
'pgadmin.browser.node',
], function(gettext, $, _, S, pgAdmin, Backbone, Alertify, Backform, Backgrid, generateUrl) {
var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
@ -13,145 +13,145 @@ define([
pgBrowser.Collection = function() {};
_.extend(
pgBrowser.Collection,
_.clone(pgBrowser.Node), {
///////
// Initialization function
// Generally - used to register the menus for this type of node.
//
// Also, look at pgAdmin.Browser.add_menus(...) function.
//
// Collection will not have 'Properties' menu.
//
// NOTE: Override this for each node for initialization purpose
Init: function() {
if (this.node_initialized)
return;
this.node_initialized = true;
pgAdmin.Browser.add_menus([{
name: 'refresh', node: this.type, module: this,
applies: ['object', 'context'], callback: 'refresh',
priority: 1, label: gettext('Refresh...'),
icon: 'fa fa-refresh'
}]);
// show query tool only in context menu of supported nodes.
if (pgAdmin.DataGrid && pgAdmin.unsupported_nodes) {
if (_.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) {
pgAdmin.Browser.add_menus([{
name: 'show_query_tool', node: this.type, module: this,
applies: ['context'], callback: 'show_query_tool',
priority: 998, label: gettext('Query Tool...'),
icon: 'fa fa-bolt'
}]);
}
}
},
hasId: false,
is_collection: true,
collection_node: true,
// A collection will always have a collection of statistics, when the node
// it represent will have some statistics.
hasCollectiveStatistics: true,
showProperties: function(item, data, panel) {
var that = this,
j = panel.$container.find('.obj_properties').first(),
view = j.data('obj-view'),
content = $('<div></div>')
.addClass('pg-prop-content col-xs-12'),
node = pgBrowser.Nodes[that.node],
// This will be the URL, used for object manipulation.
urlBase = this.generate_url(item, 'properties', data),
collection = new (node.Collection.extend({
url: urlBase,
model: node.model
}))(),
info = this.getTreeNodeHierarchy.apply(this, [item]),
gridSchema = Backform.generateGridColumnsFromModel(
info, node.model, 'properties', that.columns
),
// Initialize a new Grid instance
grid = new Backgrid.Grid({
columns: gridSchema.columns,
collection: collection,
className: "backgrid table-bordered"
}),
gridView = {
'remove': function() {
if (this.grid) {
if (this.grid.collection) {
this.grid.collection.reset(null, {silent: true});
delete (this.grid.collection);
}
delete (this.grid);
this.grid = null;
}
},
grid: grid
};
if (view) {
// Avoid unnecessary reloads
if (_.isEqual($(panel).data('node-prop'), urlBase)) {
_.extend(
pgBrowser.Collection,
_.clone(pgBrowser.Node), {
///////
// Initialization function
// Generally - used to register the menus for this type of node.
//
// Also, look at pgAdmin.Browser.add_menus(...) function.
//
// Collection will not have 'Properties' menu.
//
// NOTE: Override this for each node for initialization purpose
Init: function() {
if (this.node_initialized)
return;
}
this.node_initialized = true;
pgAdmin.Browser.add_menus([{
name: 'refresh', node: this.type, module: this,
applies: ['object', 'context'], callback: 'refresh',
priority: 1, label: gettext('Refresh...'),
icon: 'fa fa-refresh',
}]);
// Cache the current IDs for next time
$(panel).data('node-prop', urlBase);
// Reset the data object
j.data('obj-view', null);
}
// Make sure the HTML element is empty.
j.empty();
j.data('obj-view', gridView);
// Render subNode grid
content.append(grid.render().$el);
j.append(content);
// Fetch Data
collection.fetch({
reset: true,
error: function(xhr, error, message) {
pgBrowser.Events.trigger(
'pgadmin:collection:retrieval:error', 'properties', xhr, error, message, item, that
);
if (
!Alertify.pgHandleItemError(xhr, error, message, {item: item, info: info})
) {
Alertify.pgNotifier(
error, xhr,
S(
gettext("Error retrieving properties - %s.")
).sprintf(message || that.label).value(),
function() {
console.log(arguments);
}
);
// show query tool only in context menu of supported nodes.
if (pgAdmin.DataGrid && pgAdmin.unsupported_nodes) {
if (_.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) {
pgAdmin.Browser.add_menus([{
name: 'show_query_tool', node: this.type, module: this,
applies: ['context'], callback: 'show_query_tool',
priority: 998, label: gettext('Query Tool...'),
icon: 'fa fa-bolt',
}]);
}
}
})
},
generate_url: function(item, type) {
/*
* Using list, and collection functions of a node to get the nodes
* under the collection, and properties of the collection respectively.
*/
var opURL = {
'properties': 'obj', 'children': 'nodes',
},
self = this;
var collectionPickFunction = function (treeInfoValue, treeInfoKey) {
return (treeInfoKey != self.type);
};
var treeInfo = this.getTreeNodeHierarchy(item);
var actionType = type in opURL ? opURL[type] : type;
return generateUrl.generate_url(pgAdmin.Browser.URL, treeInfo, actionType, self.node, collectionPickFunction);
},
});
},
hasId: false,
is_collection: true,
collection_node: true,
// A collection will always have a collection of statistics, when the node
// it represent will have some statistics.
hasCollectiveStatistics: true,
showProperties: function(item, data, panel) {
var that = this,
j = panel.$container.find('.obj_properties').first(),
view = j.data('obj-view'),
content = $('<div></div>')
.addClass('pg-prop-content col-xs-12'),
node = pgBrowser.Nodes[that.node],
// This will be the URL, used for object manipulation.
urlBase = this.generate_url(item, 'properties', data),
collection = new (node.Collection.extend({
url: urlBase,
model: node.model,
}))(),
info = this.getTreeNodeHierarchy.apply(this, [item]),
gridSchema = Backform.generateGridColumnsFromModel(
info, node.model, 'properties', that.columns
),
// Initialize a new Grid instance
grid = new Backgrid.Grid({
columns: gridSchema.columns,
collection: collection,
className: 'backgrid table-bordered',
}),
gridView = {
'remove': function() {
if (this.grid) {
if (this.grid.collection) {
this.grid.collection.reset(null, {silent: true});
delete (this.grid.collection);
}
delete (this.grid);
this.grid = null;
}
},
grid: grid,
};
if (view) {
// Avoid unnecessary reloads
if (_.isEqual($(panel).data('node-prop'), urlBase)) {
return;
}
// Cache the current IDs for next time
$(panel).data('node-prop', urlBase);
// Reset the data object
j.data('obj-view', null);
}
// Make sure the HTML element is empty.
j.empty();
j.data('obj-view', gridView);
// Render subNode grid
content.append(grid.render().$el);
j.append(content);
// Fetch Data
collection.fetch({
reset: true,
error: function(xhr, error, message) {
pgBrowser.Events.trigger(
'pgadmin:collection:retrieval:error', 'properties', xhr, error,
message, item, that
);
if (!Alertify.pgHandleItemError(
xhr, error, message, {item: item, info: info}
)) {
Alertify.pgNotifier(error, xhr, S(
gettext('Error retrieving properties - %s.')
).sprintf(message || that.label).value(), function() {
console.warn(arguments);
});
}
},
});
},
generate_url: function(item, type) {
/*
* Using list, and collection functions of a node to get the nodes
* under the collection, and properties of the collection respectively.
*/
var opURL = {
'properties': 'obj', 'children': 'nodes',
},
self = this;
var collectionPickFunction = function (treeInfoValue, treeInfoKey) {
return (treeInfoKey != self.type);
};
var treeInfo = this.getTreeNodeHierarchy(item);
var actionType = type in opURL ? opURL[type] : type;
return generateUrl.generate_url(
pgAdmin.Browser.URL, treeInfo, actionType, self.node,
collectionPickFunction
);
},
});
return pgBrowser.Collection;
});

File diff suppressed because it is too large Load Diff

View File

@ -10,7 +10,7 @@ function(gettext, _, alertify, pgAdmin) {
<div class="panel-heading" role="tab" id="headingOne">\
<h4 class="panel-title">\
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">\
' + gettext("Error message") + '</a>\
' + gettext('Error message') + '</a>\
</h4>\
</div>\
<div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">\
@ -23,21 +23,21 @@ function(gettext, _, alertify, pgAdmin) {
<div class="panel-heading" role="tab" id="headingTwo">\
<h4 class="panel-title">\
<a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">\
' + gettext("Additional info") + '</a>\
' + gettext('Additional info') + '</a>\
</h4>\
</div>\
<div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">\
<div class="panel-body" style="overflow: auto;">' + unescape(info) + '</div>\
</div>\
</div>\
</div>'
</div>';
}
text += '</div>';
alertify.alert(
title,
text
)
);
},
});

View File

@ -1,18 +1,21 @@
define(
['underscore', 'sources/pgadmin', 'wcdocker'],
function(_, pgAdmin) {
define([
'underscore', 'sources/pgadmin', 'jquery', 'wcdocker',
], function(_, pgAdmin, $) {
var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {},
wcDocker = window.wcDocker,
wcIFrame = window.wcIFrame;
pgAdmin.Browser.Frame = function(options) {
var defaults = [
'name', 'title', 'width', 'height', 'showTitle', 'isCloseable',
'isPrivate', 'url', 'icon', 'onCreate'];
'isPrivate', 'url', 'icon', 'onCreate',
];
_.extend(this, _.pick(options, defaults));
}
};
_.extend(pgAdmin.Browser.Frame.prototype, {
name:'',
name: '',
title: '',
width: 300,
height: 600,
@ -37,7 +40,7 @@ function(_, pgAdmin) {
if (myPanel.showTitle == false)
myPanel.title(false);
myPanel.icon(that.icon)
myPanel.icon(that.icon);
myPanel.closeable(!!that.isCloseable);
@ -75,22 +78,23 @@ function(_, pgAdmin) {
}
_.each([
wcDocker.EVENT.UPDATED, wcDocker.EVENT.VISIBILITY_CHANGED,
wcDocker.EVENT.BEGIN_DOCK, wcDocker.EVENT.END_DOCK,
wcDocker.EVENT.GAIN_FOCUS, wcDocker.EVENT.LOST_FOCUS,
wcDocker.EVENT.CLOSED, wcDocker.EVENT.BUTTON,
wcDocker.EVENT.ATTACHED, wcDocker.EVENT.DETACHED,
wcDocker.EVENT.MOVE_STARTED, wcDocker.EVENT.MOVE_ENDED,
wcDocker.EVENT.MOVED, wcDocker.EVENT.RESIZE_STARTED,
wcDocker.EVENT.RESIZE_ENDED, wcDocker.EVENT.RESIZED,
wcDocker.EVENT.SCROLLED], function(ev) {
myPanel.on(ev, that.eventFunc.bind(myPanel, ev));
});
wcDocker.EVENT.UPDATED, wcDocker.EVENT.VISIBILITY_CHANGED,
wcDocker.EVENT.BEGIN_DOCK, wcDocker.EVENT.END_DOCK,
wcDocker.EVENT.GAIN_FOCUS, wcDocker.EVENT.LOST_FOCUS,
wcDocker.EVENT.CLOSED, wcDocker.EVENT.BUTTON,
wcDocker.EVENT.ATTACHED, wcDocker.EVENT.DETACHED,
wcDocker.EVENT.MOVE_STARTED, wcDocker.EVENT.MOVE_ENDED,
wcDocker.EVENT.MOVED, wcDocker.EVENT.RESIZE_STARTED,
wcDocker.EVENT.RESIZE_ENDED, wcDocker.EVENT.RESIZED,
wcDocker.EVENT.SCROLLED,
], function(ev) {
myPanel.on(ev, that.eventFunc.bind(myPanel, ev));
});
if (that.onCreate && _.isFunction(that.onCreate)) {
that.onCreate.apply(that, [myPanel, frame, $container]);
that.onCreate.apply(that, [myPanel, frame]);
}
}
},
});
}
},
@ -106,9 +110,9 @@ function(_, pgAdmin) {
pgBrowser.Events.trigger('pgadmin-browser:frame-' + name + ':' + eventName, this, arguments);
}
} catch (e) {
console.log(e);
console.warn(e.stack || e);
}
}
},
});
return pgAdmin.Browser.Frame;

View File

@ -1,6 +1,6 @@
define(
['underscore', 'underscore.string', 'sources/pgadmin', 'jquery'],
function(_, S, pgAdmin, $) {
define([
'underscore', 'underscore.string', 'sources/pgadmin', 'jquery',
], function(_, S, pgAdmin, $) {
'use strict';
pgAdmin.Browser = pgAdmin.Browser || {};
@ -8,14 +8,14 @@ function(_, S, pgAdmin, $) {
// Individual menu-item class
var MenuItem = pgAdmin.Browser.MenuItem = function(opts) {
var menu_opts = [
'name', 'label', 'priority', 'module', 'callback', 'data', 'enable',
'category', 'target', 'url'/* Do not show icon in the menus, 'icon' */, 'node'
],
defaults = {
url: '#',
target: '_self',
enable: true
};
'name', 'label', 'priority', 'module', 'callback', 'data', 'enable',
'category', 'target', 'url' /* Do not show icon in the menus, 'icon' */ , 'node',
],
defaults = {
url: '#',
target: '_self',
enable: true,
};
_.extend(this, defaults, _.pick(opts, menu_opts));
};
@ -36,7 +36,7 @@ function(_, S, pgAdmin, $) {
name: this.label,
/* icon: this.icon || this.module && (this.module.type), */
disabled: this.is_disabled,
callback: this.context_menu_callback.bind(this, item)
callback: this.context_menu_callback.bind(this, item),
};
return this.$el;
@ -47,19 +47,21 @@ function(_, S, pgAdmin, $) {
*/
create_el: function(node, item) {
var url = $('<a></a>', {
'id': this.name,
'href': this.url,
'target': this.target,
'data-toggle': 'pg-menu'
}).data('pgMenu', {
module: this.module || pgAdmin.Browser,
cb: this.callback,
data: this.data
}).addClass('menu-link');
'id': this.name,
'href': this.url,
'target': this.target,
'data-toggle': 'pg-menu',
}).data('pgMenu', {
module: this.module || pgAdmin.Browser,
cb: this.callback,
data: this.data,
}).addClass('menu-link');
this.is_disabled = this.disabled(node, item);
if (this.icon) {
url.append($('<i></i>', {'class': this.icon}));
url.append($('<i></i>', {
'class': this.icon,
}));
}
var textSpan = $('<span data-test="menu-item-text"></span>').text(' ' + this.label);
@ -73,7 +75,7 @@ function(_, S, pgAdmin, $) {
this.applyStyle();
},
applyDisabledStyle: function () {
applyDisabledStyle: function() {
var span = this.$el.find('span');
var icon = this.$el.find('i');
@ -84,7 +86,7 @@ function(_, S, pgAdmin, $) {
icon.removeClass('font-white');
},
applyEnabledStyle: function () {
applyEnabledStyle: function() {
var element = this.$el;
var span = this.$el.find('span');
@ -93,11 +95,15 @@ function(_, S, pgAdmin, $) {
element.find('i').addClass('font-white');
element.find('i').removeClass('font-gray-4');
span.mouseover(function () { element.addClass('bg-gray-5'); });
span.mouseout(function () { element.removeClass('bg-gray-5'); });
span.mouseover(function() {
element.addClass('bg-gray-5');
});
span.mouseout(function() {
element.removeClass('bg-gray-5');
});
},
applyStyle: function () {
applyStyle: function() {
if (this.is_disabled) {
this.applyDisabledStyle();
} else {
@ -121,7 +127,7 @@ function(_, S, pgAdmin, $) {
this.$el.removeClass('disabled');
}
if(this.$el) {
if (this.$el) {
this.applyStyle();
}
@ -129,7 +135,7 @@ function(_, S, pgAdmin, $) {
name: this.label,
/* icon: this.icon || (this.module && this.module.type), */
disabled: this.is_disabled,
callback: this.context_menu_callback.bind(this, item)
callback: this.context_menu_callback.bind(this, item),
};
},
@ -137,11 +143,12 @@ function(_, S, pgAdmin, $) {
* This will be called when context-menu is clicked.
*/
context_menu_callback: function(item) {
var o = this, cb;
var o = this,
cb;
if (o.module['callbacks'] && (
o.callback in o.module['callbacks']
)) {
o.callback in o.module['callbacks']
)) {
cb = o.module['callbacks'][o.callback];
} else if (o.callback in o.module) {
cb = o.module[o.callback];
@ -150,8 +157,7 @@ function(_, S, pgAdmin, $) {
cb.apply(o.module, [o.data, item]);
} else {
pgAdmin.Browser.report_error(
S('Developer Warning: Callback - "%s" not found!').
sprintf(o.cb).value()
S('Developer Warning: Callback - "%s" not found!').sprintf(o.cb).value()
);
}
},
@ -169,8 +175,8 @@ function(_, S, pgAdmin, $) {
return true;
}
if (_.isArray(this.node) ? (
_.indexOf(this.node, node) == -1
) : (this.node != node._type)) {
_.indexOf(this.node, node) == -1
) : (this.node != node._type)) {
return true;
}
}
@ -181,7 +187,7 @@ function(_, S, pgAdmin, $) {
if (this.module && _.isFunction(this.module[this.enable])) return !(this.module[this.enable]).apply(this.module, [node, item, this.data]);
return false;
}
},
});
/*
@ -202,59 +208,65 @@ function(_, S, pgAdmin, $) {
pgAdmin.Browser.MenuGroup = function(opts, items, prev, ctx) {
var template = _.template([
'<% if (above) { %><hr><% } %>',
'<li class="menu-item dropdown dropdown-submenu">',
' <a href="#" class="dropdown-toggle" data-toggle="dropdown">',
' <% if (icon) { %><i class="<%= icon %>"></i><% } %>',
' <span><%= label %></span>',
' </a>',
' <ul class="dropdown-menu navbar-inverse">',
' </ul>',
'</li>',
'<% if (below) { %><hr><% } %>',].join('\n')),
data = {
'label': opts.label,
'icon': opts.icon,
'above': opts.above && !prev,
'below': opts.below,
}, m,
$el = $(template(data)),
$menu = $el.find('.dropdown-menu'),
submenus = {},
ctxId = 1;
'<% if (above) { %><hr><% } %>',
'<li class="menu-item dropdown dropdown-submenu">',
' <a href="#" class="dropdown-toggle" data-toggle="dropdown">',
' <% if (icon) { %><i class="<%= icon %>"></i><% } %>',
' <span><%= label %></span>',
' </a>',
' <ul class="dropdown-menu navbar-inverse">',
' </ul>',
'</li>',
'<% if (below) { %><hr><% } %>',
].join('\n')),
data = {
'label': opts.label,
'icon': opts.icon,
'above': opts.above && !prev,
'below': opts.below,
},
m,
$el = $(template(data)),
$menu = $el.find('.dropdown-menu'),
submenus = {},
ctxId = 1;
ctx = _.uniqueId(ctx + '_sub_');
ctx = _.uniqueId(ctx + '_sub_');
// Sort by alphanumeric ordered first
items.sort(function(a, b) {return a.label.localeCompare(b.label);});
// Sort by priority
items.sort(function(a, b) {return a.priority - b.priority;});
// Sort by alphanumeric ordered first
items.sort(function(a, b) {
return a.label.localeCompare(b.label);
});
// Sort by priority
items.sort(function(a, b) {
return a.priority - b.priority;
});
for (var idx in items) {
m = items[idx];
$menu.append(m.$el);
if (!m.is_disabled) {
submenus[ctx + ctxId] = m.context;
}
ctxId++;
for (var idx in items) {
m = items[idx];
$menu.append(m.$el);
if (!m.is_disabled) {
submenus[ctx + ctxId] = m.context;
}
ctxId++;
}
var is_disabled = (_.size(submenus) == 0);
var is_disabled = (_.size(submenus) == 0);
return {
$el: $el,
priority: opts.priority || 10,
label: opts.label,
above: data['above'],
below: opts.below,
is_disabled: is_disabled,
context: {
name: opts.label,
icon: opts.icon,
items: submenus,
disabled: is_disabled
}
};
return {
$el: $el,
priority: opts.priority || 10,
label: opts.label,
above: data['above'],
below: opts.below,
is_disabled: is_disabled,
context: {
name: opts.label,
icon: opts.icon,
items: submenus,
disabled: is_disabled,
},
};
};
/*
@ -274,26 +286,31 @@ function(_, S, pgAdmin, $) {
*
* Returns if any menu generated for the given input.
*/
pgAdmin.Browser.MenuCreator = function($mnu, menus, categories, d, item, menu_items) {
var groups = {'common': []},
common, idx = 0, j, item,
ctxId = _.uniqueId('ctx_'),
update_menuitem = function(m) {
if (m instanceof MenuItem) {
if (m.$el) {
m.$el.remove();
delete m.$el;
}
m.generate(d, item);
var group = groups[m.category || 'common'] =
groups[m.category || 'common'] || [];
group.push(m);
} else {
for (var key in m) {
update_menuitem(m[key]);
}
pgAdmin.Browser.MenuCreator = function(
$mnu, menus, categories, d, item, menu_items
) {
var groups = {
'common': [],
},
common, idx = 0,
ctxId = _.uniqueId('ctx_'),
update_menuitem = function(m) {
if (m instanceof MenuItem) {
if (m.$el) {
m.$el.remove();
delete m.$el;
}
}, ctxIdx = 1;
m.generate(d, item);
var group = groups[m.category || 'common'] =
groups[m.category || 'common'] || [];
group.push(m);
} else {
for (var key in m) {
update_menuitem(m[key]);
}
}
},
ctxIdx = 1;
for (idx in menus) {
update_menuitem(menus[idx]);
@ -307,10 +324,13 @@ function(_, S, pgAdmin, $) {
var prev = true;
for (name in groups) {
for (var name in groups) {
var g = groups[name],
c = categories[name] || {'label': name, single: false},
menu_group = pgAdmin.Browser.MenuGroup(c, g, prev, ctxId);
c = categories[name] || {
'label': name,
single: false,
},
menu_group = pgAdmin.Browser.MenuGroup(c, g, prev, ctxId);
if (g.length <= 1 && !c.single) {
prev = false;
@ -327,9 +347,13 @@ function(_, S, pgAdmin, $) {
// Menu with lowest value has the highest priority. If the priority is
// same, then - it will be ordered by label.
// Sort by alphanumeric ordered first
common.sort(function(a, b) {return a.label.localeCompare(b.label);});
common.sort(function(a, b) {
return a.label.localeCompare(b.label);
});
// Sort by priority
common.sort(function(a, b) {return a.priority - b.priority;});
common.sort(function(a, b) {
return a.priority - b.priority;
});
var len = _.size(common);
for (idx in common) {
@ -360,15 +384,15 @@ function(_, S, pgAdmin, $) {
// MENU PUBLIC CLASS DEFINITION
// ==============================
var Menu = function (element, options) {
this.$element = $(element);
this.options = $.extend({}, Menu.DEFAULTS, options);
var Menu = function(element, options) {
this.$element = $(element);
this.options = $.extend({}, Menu.DEFAULTS, options);
this.isLoading = false;
}
};
Menu.DEFAULTS = {}
Menu.DEFAULTS = {};
Menu.prototype.toggle = function (ev) {
Menu.prototype.toggle = function(ev) {
var $parent = this.$element.closest('.menu-item');
if ($parent.hasClass('disabled')) {
ev.preventDefault();
@ -384,43 +408,43 @@ function(_, S, pgAdmin, $) {
pgAdmin.Browser.report_error('Developer Warning: Callback - "' + d.cb + '" not found!');
}
}
}
};
// BUTTON PLUGIN DEFINITION
// ========================
function Plugin(option, ev) {
return this.each(function () {
var $this = $(this);
var data = $this.data('pg.menu');
return this.each(function() {
var $this = $(this);
var data = $this.data('pg.menu');
var options = typeof option == 'object' && option;
if (!data) $this.data('pg.menu', (data = new Menu(this, options)));
data.toggle(ev);
})
});
}
var old = $.fn.button;
$.fn.pgmenu = Plugin;
$.fn.pgmenu = Plugin;
$.fn.pgmenu.Constructor = Menu;
// BUTTON NO CONFLICT
// ==================
$.fn.pgmenu.noConflict = function () {
$.fn.pgmenu.noConflict = function() {
$.fn.pgmenu = old;
return this;
}
};
// MENU DATA-API
// =============
$(document)
.on('click.pg.menu.data-api', '[data-toggle^="pg-menu"]', function (ev) {
.on('click.pg.menu.data-api', '[data-toggle^="pg-menu"]', function(ev) {
var $menu = $(ev.target);
if (!$menu.hasClass('menu-link'))
$menu = $menu.closest('.menu-link');
@ -429,7 +453,7 @@ function(_, S, pgAdmin, $) {
.on(
'focus.pg.menu.data-api blur.pg.menu.data-api',
'[data-toggle^="pg-menu"]',
function (e) {
function(e) {
$(e.target).closest('.menu').toggleClass(
'focus', /^focus(in)?$/.test(e.type)
);

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,7 @@
define([
'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin', 'backbone', 'backform',
'alertify', 'backgrid', 'select2', 'pgadmin.browser.node'
],
function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
var pgBrowser = pgAdmin.Browser;
'alertify', 'backgrid', 'select2', 'pgadmin.browser.node',
], function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
/*
* Define the selectAll adapter for select2.
@ -15,11 +12,11 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
$.fn.select2.amd.define('select2/selectAllAdapter', [
'select2/utils',
'select2/dropdown',
'select2/dropdown/attachBody'
], function (Utils, Dropdown, AttachBody) {
'select2/dropdown/attachBody',
], function(Utils, Dropdown, AttachBody) {
function SelectAll() { }
SelectAll.prototype.render = function (decorated) {
function SelectAll() {}
SelectAll.prototype.render = function(decorated) {
var self = this,
$rendered = decorated.call(this),
$selectAll = $([
@ -27,41 +24,43 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
' style="width: 49%;margin: 0 0.5%;">',
'<i class="fa fa-check-square-o"></i>',
'<span style="padding: 0px 5px;">',
gettext("Select All"),
'</span></button>'
gettext('Select All'),
'</span></button>',
].join('')),
$unselectAll = $([
'<button class="btn btn-xs btn-default" type="button"',
' style="width: 49%;margin: 0 0.5%;">',
'<i class="fa fa-square-o"></i><span style="padding: 0px 5px;">',
gettext("Unselect All"),
'</span></button>'
gettext('Unselect All'),
'</span></button>',
].join('')),
$btnContainer = $(
'<div style="padding: 3px 0px; background-color: #2C76B4; margin-bottom: 3px;">'
).append($selectAll).append($unselectAll);
if (!this.$element.prop("multiple")) {
if (!this.$element.prop('multiple')) {
// this isn't a multi-select -> don't add the buttons!
return $rendered;
}
$rendered.find('.select2-dropdown').prepend($btnContainer);
$selectAll.on('click', function (e) {
var $results = $rendered.find('.select2-results__option[aria-selected=false]');
$results.each(function () {
self.trigger('select', {
data: $(this).data('data')
});
});
$selectAll.on('click', function() {
$rendered.find('.select2-results__option[aria-selected=false]').each(
function() {
self.trigger('select', {
data: $(this).data('data'),
});
}
);
self.trigger('close');
});
$unselectAll.on('click', function (e) {
var $results = $rendered.find('.select2-results__option[aria-selected=true]');
$results.each(function () {
self.trigger('unselect', {
data: $(this).data('data')
});
});
$unselectAll.on('click', function() {
$rendered.find('.select2-results__option[aria-selected=true]').each(
function() {
self.trigger('unselect', {
data: $(this).data('data'),
});
}
);
self.trigger('close');
});
return $rendered;
@ -89,98 +88,98 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
* data to proper 'label', 'value' format.
*/
var NodeAjaxOptionsControl = Backform.NodeAjaxOptionsControl =
Backform.Select2Control.extend({
defaults: _.extend(Backform.Select2Control.prototype.defaults, {
url: undefined,
transform: undefined,
url_with_id: false,
select2: {
allowClear: true,
placeholder: 'Select from the list',
width: 'style'
}
}),
initialize: function() {
/*
* Initialization from the original control.
*/
Backform.Select2Control.prototype.initialize.apply(this, arguments);
Backform.Select2Control.extend({
defaults: _.extend(Backform.Select2Control.prototype.defaults, {
url: undefined,
transform: undefined,
url_with_id: false,
select2: {
allowClear: true,
placeholder: 'Select from the list',
width: 'style',
},
}),
initialize: function() {
/*
* Initialization from the original control.
*/
Backform.Select2Control.prototype.initialize.apply(this, arguments);
/*
* We're about to fetch the options required for this control.
*/
var self = this,
/*
* We're about to fetch the options required for this control.
*/
var self = this,
url = self.field.get('url') || self.defaults.url,
m = self.model.top || self.model;
// Hmm - we found the url option.
// That means - we needs to fetch the options from that node.
if (url) {
var node = this.field.get('schema_node'),
// Hmm - we found the url option.
// That means - we needs to fetch the options from that node.
if (url) {
var node = this.field.get('schema_node'),
node_info = this.field.get('node_info'),
with_id = this.field.get('url_with_id') || false,
full_url = node.generate_url.apply(
node, [
null, url, this.field.get('node_data'), with_id, node_info
null, url, this.field.get('node_data'), with_id, node_info,
]),
cache_level,
cache_node = this.field.get('cache_node');
cache_node = (cache_node && pgAdmin.Browser.Nodes[cache_node]) || node;
cache_node = (cache_node && pgAdmin.Browser.Nodes[cache_node]) || node;
if (this.field.has('cache_level')) {
cache_level = this.field.get('cache_level');
} else {
cache_level = cache_node.cache_level(node_info, with_id);
}
if (this.field.has('cache_level')) {
cache_level = this.field.get('cache_level');
} else {
cache_level = cache_node.cache_level(node_info, with_id);
}
/*
* We needs to check, if we have already cached data for this url.
* If yes - use that, and do not bother about fetching it again,
* and use it.
*/
var data = cache_node.cache(node.type + '#' + url, node_info, cache_level);
/*
* We needs to check, if we have already cached data for this url.
* If yes - use that, and do not bother about fetching it again,
* and use it.
*/
var data = cache_node.cache(node.type + '#' + url, node_info, cache_level);
if (this.field.get('version_compatible') &&
if (this.field.get('version_compatible') &&
(_.isUndefined(data) || _.isNull(data))) {
m.trigger('pgadmin:view:fetching', m, self.field);
$.ajax({
async: false,
url: full_url,
success: function(res) {
/*
* We will cache this data for short period of time for avoiding
* same calls.
*/
data = cache_node.cache(node.type + '#' + url, node_info, cache_level, res.data);
},
error: function() {
m.trigger('pgadmin:view:fetch:error', m, self.field);
}
});
m.trigger('pgadmin:view:fetched', m, self.field);
}
// To fetch only options from cache, we do not need time from 'at'
// attribute but only options.
//
// It is feasible that the data may not have been fetched.
data = (data && data.data) || [];
m.trigger('pgadmin:view:fetching', m, self.field);
$.ajax({
async: false,
url: full_url,
success: function(res) {
/*
* We will cache this data for short period of time for avoiding
* same calls.
*/
data = cache_node.cache(node.type + '#' + url, node_info, cache_level, res.data);
},
error: function() {
m.trigger('pgadmin:view:fetch:error', m, self.field);
},
});
m.trigger('pgadmin:view:fetched', m, self.field);
}
// To fetch only options from cache, we do not need time from 'at'
// attribute but only options.
//
// It is feasible that the data may not have been fetched.
data = (data && data.data) || [];
/*
* Transform the data
*/
var transform = this.field.get('transform') || self.defaults.transform;
if (transform && _.isFunction(transform)) {
// We will transform the data later, when rendering.
// It will allow us to generate different data based on the
// dependencies.
self.field.set('options', transform.bind(self, data));
} else {
self.field.set('options', data);
/*
* Transform the data
*/
var transform = this.field.get('transform') || self.defaults.transform;
if (transform && _.isFunction(transform)) {
// We will transform the data later, when rendering.
// It will allow us to generate different data based on the
// dependencies.
self.field.set('options', transform.bind(self, data));
} else {
self.field.set('options', data);
}
}
}
}
});
},
});
var formatNode = function(opt) {
if (!opt.id) {
@ -189,14 +188,14 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
var optimage = $(opt.element).data('image');
if(!optimage){
if (!optimage) {
return opt.text;
} else {
return $('<span></span>').append(
$('<span></span>', {class: "wcTabIcon " + optimage})
).append(
$('<span></span>').text(opt.text)
);
$('<span></span>', {
class: 'wcTabIcon ' + optimage,
})
).append($('<span></span>').text(opt.text));
}
};
@ -207,27 +206,29 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
filter: undefined,
transform: function(rows) {
var self = this,
node = self.field.get('schema_node'),
res = [],
filter = self.field.get('filter') || function() { return true; };
node = self.field.get('schema_node'),
res = [],
filter = self.field.get('filter') || function() {
return true;
};
filter = filter.bind(self);
_.each(rows, function(r) {
if (filter(r)) {
var l = (_.isFunction(node['node_label']) ?
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image= (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image = (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
res.push({
'value': r._id,
'image': image,
'label': l
'label': l,
});
}
});
@ -239,62 +240,64 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
placeholder: 'Select from the list',
width: 'style',
templateResult: formatNode,
templateSelection: formatNode
}
})
templateSelection: formatNode,
},
}),
});
var NodeListByNameControl = Backform.NodeListByNameControl = NodeListByIdControl.extend({
Backform.NodeListByNameControl = NodeListByIdControl.extend({
defaults: _.extend({}, NodeListByIdControl.prototype.defaults, {
transform: function(rows) {
var self = this,
node = self.field.get('schema_node'),
res = [],
filter = self.field.get('filter') || function() { return true; };
node = self.field.get('schema_node'),
res = [],
filter = self.field.get('filter') || function() {
return true;
};
filter = filter.bind(self);
_.each(rows, function(r) {
if (filter(r)) {
var l = (_.isFunction(node['node_label']) ?
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image = (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image = (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
res.push({
'value': r.label,
'image': image,
'label': l
'label': l,
});
}
});
return res;
}
})
},
}),
});
/*
* Global function to make visible particular dom element in it's parent
* with given class.
*/
$.fn.pgMakeVisible = function( cls ) {
$.fn.pgMakeVisible = function(cls) {
return this.each(function() {
if (!this || !$(this.length))
return;
var top, p = $(this), hasScrollbar = function(j) {
if (j && j.length > 0) {
return j.get(0).scrollHeight > j.height();
}
return false;
};
var top, p = $(this),
hasScrollbar = function(j) {
if (j && j.length > 0) {
return j.get(0).scrollHeight > j.height();
}
return false;
};
// check if p is not empty
while(p && p.length > 0) {
while (p && p.length > 0) {
top = p.get(0).offsetTop + p.height();
p = p.parent();
if (hasScrollbar(p)) {
@ -327,40 +330,41 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
select2: {
allowClear: true,
placeholder: 'Select from the list',
width: 'style'
width: 'style',
},
opt: {
label: null,
value: null,
image: null,
selected: false
}
selected: false,
},
}),
template: _.template(
'<option <% if (image) { %> data-image=<%= image %> <% } %> value="<%- value %>" <%= selected ? \'selected="selected"\' : "" %>><%- label %></option>'
),
initialize: function () {
initialize: function() {
Backgrid.Extension.Select2Cell.prototype.initialize.apply(this, arguments);
var url = this.column.get('url') || this.defaults.url,
is_options_cached = _.has(this.column.attributes, 'options_cached'),
options_cached = is_options_cached && this.column.get('options_cached');
is_options_cached = _.has(this.column.attributes, 'options_cached'),
options_cached = is_options_cached && this.column.get('options_cached');
// Hmm - we found the url option.
// That means - we needs to fetch the options from that node.
if (url && !options_cached) {
var self = this,
m = this.model, column = this.column,
eventHandler = m.top || m,
node = column.get('schema_node'),
node_info = column.get('node_info'),
with_id = column.get('url_with_id') || false,
full_url = node.generate_url.apply(
node, [
null, url, column.get('node_data'), with_id, node_info
]),
cache_level,
cache_node = column.get('cache_node');
m = this.model,
column = this.column,
eventHandler = m.top || m,
node = column.get('schema_node'),
node_info = column.get('node_info'),
with_id = column.get('url_with_id') || false,
full_url = node.generate_url.apply(
node, [
null, url, column.get('node_data'), with_id, node_info,
]),
cache_level,
cache_node = column.get('cache_node');
cache_node = (cache_node && pgAdmin.Browser.Nodes[cache_node]) || node;
@ -378,7 +382,7 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
var data = cache_node.cache(node.type + '#' + url, node_info, cache_level);
if (column.get('version_compatible') &&
(_.isUndefined(data) || _.isNull(data))) {
(_.isUndefined(data) || _.isNull(data))) {
eventHandler.trigger('pgadmin:view:fetching', m, column);
$.ajax({
async: false,
@ -392,7 +396,7 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
},
error: function() {
eventHandler.trigger('pgadmin:view:fetch:error', m, column);
}
},
});
eventHandler.trigger('pgadmin:view:fetched', m, column);
}
@ -415,41 +419,43 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
column.set('options', data);
}
if(is_options_cached) {
if (is_options_cached) {
column.set('options_cached', true);
}
}
}
},
});
var NodeListByIdCell = Backgrid.Extension.NodeListByIdCell = NodeAjaxOptionsCell.extend({
Backgrid.Extension.NodeListByIdCell = NodeAjaxOptionsCell.extend({
controlClassName: 'pgadmin-node-select backgrid-cell',
defaults: _.extend({}, NodeAjaxOptionsCell.prototype.defaults, {
url: 'nodes',
filter: undefined,
transform: function(rows, control) {
var self = control || this,
node = self.column.get('schema_node'),
res = [],
filter = self.column.get('filter') || function() { return true; };
node = self.column.get('schema_node'),
res = [],
filter = self.column.get('filter') || function() {
return true;
};
filter = filter.bind(self);
_.each(rows, function(r) {
if (filter(r)) {
var l = (_.isFunction(node['node_label']) ?
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image= (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image = (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
res.push({
'value': r._id,
'image': image,
'label': l
'label': l,
});
}
});
@ -460,40 +466,41 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
placeholder: 'Select from the list',
width: 'style',
templateResult: formatNode,
templateSelection: formatNode
}
})
templateSelection: formatNode,
},
}),
});
var NodeListByNameCell = Backgrid.Extension.NodeListByNameCell = NodeAjaxOptionsCell.extend({
Backgrid.Extension.NodeListByNameCell = NodeAjaxOptionsCell.extend({
controlClassName: 'pgadmin-node-select backgrid-cell',
defaults: _.extend({}, NodeAjaxOptionsCell.prototype.defaults, {
url: 'nodes',
filter: undefined,
transform: function(rows, control) {
var self = control || this,
node = self.column.get('schema_node'),
res = [],
filter = self.column.get('filter') || function() { return true; };
node = self.column.get('schema_node'),
res = [],
filter = self.column.get('filter') || function() {
return true;
};
filter = filter.bind(self);
_.each(rows, function(r) {
if (filter(r)) {
var l = (_.isFunction(node['node_label']) ?
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image= (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
(node['node_label']).apply(node, [r, self.model, self]) :
r.label),
image = (_.isFunction(node['node_image']) ?
(node['node_image']).apply(
node, [r, self.model, self]
) :
(node['node_image'] || ('icon-' + node.type)));
res.push({
'value': r.label,
'image': image,
'label': l
'label': l,
});
}
});
@ -504,13 +511,13 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
placeholder: 'Select from the list',
width: 'style',
templateResult: formatNode,
templateSelection: formatNode
}
})
templateSelection: formatNode,
},
}),
});
// Extend the browser's node model class to create a option/value pair
var MultiSelectAjaxCell = Backgrid.Extension.MultiSelectAjaxCell = Backgrid.Extension.NodeAjaxOptionsCell.extend({
// Extend the browser's node model class to create a option/value pair
Backgrid.Extension.MultiSelectAjaxCell = Backgrid.Extension.NodeAjaxOptionsCell.extend({
defaults: _.extend({}, NodeAjaxOptionsCell.prototype.defaults, {
transform: undefined,
url_with_id: false,
@ -518,19 +525,19 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
allowClear: true,
placeholder: 'Select from the list',
width: 'style',
multiple: true
multiple: true,
},
opt: {
label: null,
value: null,
image: null,
selected: false
}
selected: false,
},
}),
getValueFromDOM: function() {
var res = [];
this.$el.find("select").find(':selected').each(function() {
this.$el.find('select').find(':selected').each(function() {
res.push($(this).attr('value'));
});
@ -541,15 +548,15 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
/*
* Control to select multiple columns.
*/
var MultiSelectAjaxControl = Backform.MultiSelectAjaxControl = NodeAjaxOptionsControl.extend({
Backform.MultiSelectAjaxControl = NodeAjaxOptionsControl.extend({
defaults: _.extend({}, NodeAjaxOptionsControl.prototype.defaults, {
select2: {
multiple: true,
allowClear: true,
width: 'style'
}
})
width: 'style',
},
}),
});
return Backform;
});
});

View File

@ -1,66 +1,67 @@
define(
['underscore', 'sources/pgadmin', 'wcdocker'],
function(_, pgAdmin) {
['underscore', 'sources/pgadmin', 'jquery', 'wcdocker'],
function(_, pgAdmin, $) {
var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {},
wcDocker = window.wcDocker;
pgAdmin.Browser.Panel = function(options) {
var defaults = [
'name', 'title', 'width', 'height', 'showTitle', 'isCloseable',
'isPrivate', 'content', 'icon', 'events', 'onCreate', 'elContainer',
'canHide', 'limit'
];
_.extend(this, _.pick(options, defaults));
}
pgAdmin.Browser.Panel = function(options) {
var defaults = [
'name', 'title', 'width', 'height', 'showTitle', 'isCloseable',
'isPrivate', 'content', 'icon', 'events', 'onCreate', 'elContainer',
'canHide', 'limit',
];
_.extend(this, _.pick(options, defaults));
};
_.extend(pgAdmin.Browser.Panel.prototype, {
name:'',
title: '',
width: 300,
height: 600,
showTitle: true,
isCloseable: true,
isPrivate: false,
content: '',
icon: '',
panel: null,
onCreate: null,
elContainer: false,
limit: null,
load: function(docker, title) {
var that = this;
if (!that.panel) {
docker.registerPanelType(that.name, {
title: that.title,
isPrivate: that.isPrivate,
limit: that.limit,
onCreate: function(myPanel) {
$(myPanel).data('pgAdminName', that.name);
myPanel.initSize(that.width, that.height);
_.extend(pgAdmin.Browser.Panel.prototype, {
name: '',
title: '',
width: 300,
height: 600,
showTitle: true,
isCloseable: true,
isPrivate: false,
content: '',
icon: '',
panel: null,
onCreate: null,
elContainer: false,
limit: null,
load: function(docker, title) {
var that = this;
if (!that.panel) {
docker.registerPanelType(that.name, {
title: that.title,
isPrivate: that.isPrivate,
limit: that.limit,
onCreate: function(myPanel) {
$(myPanel).data('pgAdminName', that.name);
myPanel.initSize(that.width, that.height);
if (!that.showTitle)
myPanel.title(false);
else {
myPanel.title(title || that.title);
if (that.icon != '')
myPanel.icon(that.icon)
}
if (!that.showTitle)
myPanel.title(false);
else {
myPanel.title(title || that.title);
if (that.icon != '')
myPanel.icon(that.icon);
}
var $container = $('<div>', {
'class': 'pg-panel-content'
}).append($(that.content));
var $container = $('<div>', {
'class': 'pg-panel-content',
}).append($(that.content));
myPanel.closeable(!!that.isCloseable);
myPanel.layout().addItem($container);
that.panel = myPanel;
if (that.events && _.isObject(that.events)) {
_.each(that.events, function(v, k) {
if (v && _.isFunction(v)) {
myPanel.on(k, v);
}
});
}
_.each([
myPanel.closeable(!!that.isCloseable);
myPanel.layout().addItem($container);
that.panel = myPanel;
if (that.events && _.isObject(that.events)) {
_.each(that.events, function(v, k) {
if (v && _.isFunction(v)) {
myPanel.on(k, v);
}
});
}
_.each([
wcDocker.EVENT.UPDATED, wcDocker.EVENT.VISIBILITY_CHANGED,
wcDocker.EVENT.BEGIN_DOCK, wcDocker.EVENT.END_DOCK,
wcDocker.EVENT.GAIN_FOCUS, wcDocker.EVENT.LOST_FOCUS,
@ -69,109 +70,117 @@ function(_, pgAdmin) {
wcDocker.EVENT.MOVE_STARTED, wcDocker.EVENT.MOVE_ENDED,
wcDocker.EVENT.MOVED, wcDocker.EVENT.RESIZE_STARTED,
wcDocker.EVENT.RESIZE_ENDED, wcDocker.EVENT.RESIZED,
wcDocker.EVENT.SCROLLED], function(ev) {
myPanel.on(ev, that.eventFunc.bind(myPanel, ev));
});
if (that.onCreate && _.isFunction(that.onCreate)) {
that.onCreate.apply(that, [myPanel, $container]);
}
if (that.elContainer) {
myPanel.pgElContainer = $container;
$container.addClass('pg-el-container');
_.each([
wcDocker.EVENT.RESIZED, wcDocker.EVENT.ATTACHED,
wcDocker.EVENT.DETACHED, wcDocker.EVENT.VISIBILITY_CHANGED
wcDocker.EVENT.SCROLLED,
], function(ev) {
myPanel.on(ev, that.resizedContainer.bind(myPanel));
myPanel.on(ev, that.eventFunc.bind(myPanel, ev));
});
that.resizedContainer.apply(myPanel);
}
// Bind events only if they are configurable
if (that.canHide) {
_.each([wcDocker.EVENT.CLOSED, wcDocker.EVENT.VISIBILITY_CHANGED],
function(ev) {
myPanel.on(ev, that.handleVisibility.bind(myPanel, ev));
if (that.onCreate && _.isFunction(that.onCreate)) {
that.onCreate.apply(that, [myPanel, $container]);
}
if (that.elContainer) {
myPanel.pgElContainer = $container;
$container.addClass('pg-el-container');
_.each([
wcDocker.EVENT.RESIZED, wcDocker.EVENT.ATTACHED,
wcDocker.EVENT.DETACHED, wcDocker.EVENT.VISIBILITY_CHANGED,
], function(ev) {
myPanel.on(ev, that.resizedContainer.bind(myPanel));
});
}
that.resizedContainer.apply(myPanel);
}
// Bind events only if they are configurable
if (that.canHide) {
_.each([wcDocker.EVENT.CLOSED, wcDocker.EVENT.VISIBILITY_CHANGED],
function(ev) {
myPanel.on(ev, that.handleVisibility.bind(myPanel, ev));
});
}
},
});
}
},
eventFunc: function(eventName) {
var name = $(this).data('pgAdminName');
try {
pgBrowser.Events.trigger(
'pgadmin-browser:panel', eventName, this, arguments
);
pgBrowser.Events.trigger(
'pgadmin-browser:panel:' + eventName, this, arguments
);
if (name) {
pgBrowser.Events.trigger(
'pgadmin-browser:panel-' + name, eventName, this, arguments
);
pgBrowser.Events.trigger(
'pgadmin-browser:panel-' + name + ':' + eventName, this, arguments
);
}
});
}
},
eventFunc: function(eventName) {
var name = $(this).data('pgAdminName');
try {
pgBrowser.Events.trigger('pgadmin-browser:panel', eventName, this, arguments);
pgBrowser.Events.trigger('pgadmin-browser:panel:' + eventName, this, arguments);
if (name) {
pgBrowser.Events.trigger('pgadmin-browser:panel-' + name, eventName, this, arguments);
pgBrowser.Events.trigger('pgadmin-browser:panel-' + name + ':' + eventName, this, arguments);
} catch (e) {
console.warn(e.stack || e);
}
} catch (e) {
console.log(e);
}
},
resizedContainer: function() {
var p = this;
},
resizedContainer: function() {
var p = this;
if (p.pgElContainer && !p.pgResizeTimeout) {
if (!p.isVisible()) {
clearTimeout(p.pgResizeTimeout);
p.pgResizeTimeout = null;
return;
}
p.pgResizeTimeout = setTimeout(
function() {
var w = p.width();
if (p.pgElContainer && !p.pgResizeTimeout) {
if (!p.isVisible()) {
clearTimeout(p.pgResizeTimeout);
p.pgResizeTimeout = null;
if (w <= 480) {
w = 'xs';
} else if (w < 600) {
w = 'sm';
} else if (w < 768) {
w = 'md';
} else {
w = 'lg';
}
return;
}
p.pgResizeTimeout = setTimeout(
function() {
var w = p.width();
p.pgResizeTimeout = null;
p.pgElContainer.attr('el', w);
},
100
);
}
},
handleVisibility: function(eventName) {
// Currently this function only works with dashboard panel but
// as per need it can be extended
if (this._type != 'dashboard' || _.isUndefined(pgAdmin.Dashboard))
return;
if (w <= 480) {
w = 'xs';
} else if (w < 600) {
w = 'sm';
} else if (w < 768) {
w = 'md';
} else {
w = 'lg';
}
if (eventName == 'panelClosed') {
pgBrowser.save_current_layout(pgBrowser);
pgAdmin.Dashboard.toggleVisibility(false);
}
else if (eventName == 'panelVisibilityChanged') {
if (pgBrowser.tree) {
pgBrowser.save_current_layout(pgBrowser);
var selectedNode = pgBrowser.tree.selected();
// Discontinue this event after first time visible
this.off(wcDocker.EVENT.VISIBILITY_CHANGED);
if (!_.isUndefined(pgAdmin.Dashboard))
pgAdmin.Dashboard.toggleVisibility(true);
// Explicitly trigger tree selected event when we add the tab.
pgBrowser.Events.trigger('pgadmin-browser:tree:selected', selectedNode,
pgBrowser.tree.itemData(selectedNode), pgBrowser.Node);
p.pgElContainer.attr('el', w);
},
100
);
}
}
}
},
handleVisibility: function(eventName) {
// Currently this function only works with dashboard panel but
// as per need it can be extended
if (this._type != 'dashboard' || _.isUndefined(pgAdmin.Dashboard))
return;
if (eventName == 'panelClosed') {
pgBrowser.save_current_layout(pgBrowser);
pgAdmin.Dashboard.toggleVisibility(false);
} else if (eventName == 'panelVisibilityChanged') {
if (pgBrowser.tree) {
pgBrowser.save_current_layout(pgBrowser);
var selectedNode = pgBrowser.tree.selected();
// Discontinue this event after first time visible
this.off(wcDocker.EVENT.VISIBILITY_CHANGED);
if (!_.isUndefined(pgAdmin.Dashboard))
pgAdmin.Dashboard.toggleVisibility(true);
// Explicitly trigger tree selected event when we add the tab.
pgBrowser.Events.trigger('pgadmin-browser:tree:selected', selectedNode,
pgBrowser.tree.itemData(selectedNode), pgBrowser.Node);
}
}
},
});
return pgAdmin.Browser.Panel;
});
return pgAdmin.Browser.Panel;
});

View File

@ -1,20 +1,29 @@
define(
['underscore', 'backbone', 'sources/pgadmin', 'pgadmin.browser', 'sources/gettext'],
function(_, Backbone, pgAdmin, pgBrowser, gettext) {
define([
'underscore', 'jquery', 'backbone', 'sources/pgadmin', 'pgadmin.browser',
'sources/gettext',
], function(_, $, Backbone, pgAdmin, pgBrowser, gettext) {
pgBrowser = pgBrowser || pgAdmin.Browser || {};
var wcDocker = window.wcDocker;
/* Wizard individual Page Model */
var WizardPage = pgBrowser.WizardPage = Backbone.Model.extend({
pgBrowser.WizardPage = Backbone.Model.extend({
defaults: {
id: undefined, /* Id */
page_title: undefined, /* Page Title */
view: undefined, /* A Backbone View */
html: undefined, /* HTML tags to be rendered */
image: undefined, /* Left hand side image */
disable_prev: false, /* Previous Button Flag */
disable_next: false, /* Next Button Flag */
disable_cancel: false, /* Cancel Button Flag */
id: undefined,
/* Id */
page_title: undefined,
/* Page Title */
view: undefined,
/* A Backbone View */
html: undefined,
/* HTML tags to be rendered */
image: undefined,
/* Left hand side image */
disable_prev: false,
/* Previous Button Flag */
disable_next: false,
/* Next Button Flag */
disable_cancel: false,
/* Cancel Button Flag */
show_progress_bar: '',
/* Callback for OnLoad */
onLoad: function() {
@ -24,119 +33,124 @@ function(_, Backbone, pgAdmin, pgBrowser, gettext) {
beforeNext: function() {
return true;
},
onNext: function(){},
onNext: function() {},
onBefore: function() {},
/* Callback for before Previous */
beforePrev: function() {
return true;
}
}
},
},
});
var Wizard = pgBrowser.Wizard = Backbone.View.extend({
pgBrowser.Wizard = Backbone.View.extend({
options: {
title: 'Wizard', /* Main Wizard Title */
image: 'left_panel.png', /* TODO:: We can use default image here */
curr_page: 0, /* Current Page to Load */
title: 'Wizard',
/* Main Wizard Title */
image: 'left_panel.png',
/* TODO:: We can use default image here */
curr_page: 0,
/* Current Page to Load */
disable_next: false,
disable_prev: false,
disable_finish: false,
disable_cancel: false,
show_header_cancel_btn: false, /* show cancel button at wizard header */
show_header_maximize_btn: false, /* show maximize button at wizard header */
show_header_cancel_btn: false,
/* show cancel button at wizard header */
show_header_maximize_btn: false,
/* show maximize button at wizard header */
dialog_api: null,
height: 400,
width: 650,
show_left_panel: true,
wizard_help: ''
wizard_help: '',
},
tmpl: _.template(
" <div class='pgadmin-wizard' style='height: <%= this.options.height %>px;"
+ " width: <%= this.options.width %>px'>"
+ " <div class='wizard-header wizard-badge'>"
+ " <div class='row'>"
+ " <div class='col-sm-10'>"
+ " <h3><span id='main-title'><%= this.options.title %></span> -"
+ " <span id='step-title'><%= page_title %></span></h3>"
+ " </div>"
+ " <% if (this.options.show_header_cancel_btn) { %>"
+ " <div class='col-sm-2'>"
+ " <button class='ajs-close wizard-cancel-event pull-right'"
+ " title='" + gettext("Close") + "'></button>"
+ " <% if (this.options.show_header_maximize_btn) { %>"
+ " <button class='ajs-maximize wizard-maximize-event pull-right'"
+ " title='" + gettext("Maximize") + "'></button>"
+ " <% } %>"
+ " </div>"
+ " <% } %>"
+ " </div>"
+ " </div>"
+ " <div class='wizard-content col-sm-12'>"
+ " <% if (this.options.show_left_panel) { %>"
+ " <div class='col-sm-3 wizard-left-panel'>"
+ " <img src='<%= this.options.image %>'"
+ " alt='" + gettext("Left panel logo") + "'></div>"
+ " <% } %>"
+ " <div class='col-sm-<% if (this.options.show_left_panel) { %>9<% }"
+ " else { %>12<% } %> wizard-right-panel'>"
+ " <% if ( typeof show_description != 'undefined'){ %>"
+ " <div class='wizard-description'>"
+ " <%= show_description %>"
+ " </div>"
+ " <% } %>"
+ " <div class='wizard-progress-bar'><% if (show_progress_bar) { %>"
+ " <p class='alert alert-info col-sm-12'><%= show_progress_bar %></p><% } %>"
+ " </div>"
+ " <div class='wizard-right-panel_content col-xs-12'>"
+ " </div>"
+ " </div>"
+ " </div>"
+ " <div class='col-sm-12 pg-prop-status-bar' style='visibility:hidden'>"
+ " <div class='media error-in-footer bg-red-1 border-red-2 font-red-3 text-14'>"
+ " <div class='media-body media-middle'>"
+ " <div class='alert-icon error-icon'>"
+ " <i class='fa fa-exclamation-triangle' aria-hidden='true'></i>"
+ " </div>"
+ " <div class='alert-text'>"
+ " </div>"
+ " <div class='close-error-bar'>"
+ " <a class='close-error'>x</a>"
+ " </div>"
+ " </div>"
+ " </div>"
+ " </div>"
+ " <div class='footer col-sm-12'>"
+ " <div class='row'>"
+ " <div class='col-sm-4 wizard-buttons pull-left'>"
+ " <button title = '" + gettext("Help for this dialog.") + "'"
+ " class='btn btn-default pull-left wizard-help' <%=this.options.wizard_help ? '' : 'disabled' %>>"
+ " <span class='fa fa-lg fa-question'></span></button>"
+ " </div>"
+ " <div class='col-sm-8'>"
+ " <div class='wizard-buttons'>"
+ " <button class='btn btn-primary wizard-back' <%=this.options.disable_prev ? 'disabled' : ''%>>"
+ " <i class='fa fa-backward'></i>" + gettext("Back") + "</button>"
+ " <button class='btn btn-primary wizard-next' <%=this.options.disable_next ? 'disabled' : ''%>>"
+ gettext("Next")
+ " <i class='fa fa-forward'></i></button>"
+ " <button class='btn btn-danger wizard-cancel' <%=this.options.disable_cancel ? 'disabled' : ''%>>"
+ " <i class='fa fa-lg fa-close'></i>" + gettext("Cancel") + "</button>"
+ " <button class='btn btn-primary wizard-finish' <%=this.options.disable_finish ? 'disabled' : ''%>>"
+ gettext("Finish") + "</button>"
+ " </div>"
+ " </div>"
+ " </div>"
+ " </div>"
+ " </div>"),
' <div class="pgadmin-wizard" style="height: <%= this.options.height %>px;' +
' width: <%= this.options.width %>px">' +
' <div class="wizard-header wizard-badge">' +
' <div class="row">' +
' <div class="col-sm-10">' +
' <h3><span id="main-title"><%= this.options.title %></span> -' +
' <span id="step-title"><%= page_title %></span></h3>' +
' </div>' +
' <% if (this.options.show_header_cancel_btn) { %>' +
' <div class="col-sm-2">' +
' <button class="ajs-close wizard-cancel-event pull-right"' +
' title="' + gettext('Close') + '></button>' +
' <% if (this.options.show_header_maximize_btn) { %>' +
' <button class="ajs-maximize wizard-maximize-event pull-right' +
' title="' + gettext('Maximize') + '"></button>' +
' <% } %>' +
' </div>' +
' <% } %>' +
' </div>' +
' </div>' +
' <div class="wizard-content col-sm-12">' +
' <% if (this.options.show_left_panel) { %>' +
' <div class="col-sm-3 wizard-left-panel">' +
' <img src="<%= this.options.image %>"' +
' alt="' + gettext('Left panel logo') + '"></div>' +
' <% } %>' +
' <div class="col-sm-<% if (this.options.show_left_panel) { %>9<% }' +
' else { %>12<% } %> wizard-right-panel">' +
' <% if ( typeof show_description != "undefined"){ %>' +
' <div class="wizard-description">' +
' <%= show_description %>' +
' </div>' +
' <% } %>' +
' <div class="wizard-progress-bar"><% if (show_progress_bar) { %>' +
' <p class="alert alert-info col-sm-12"><%= show_progress_bar %></p><% } %>' +
' </div>' +
' <div class="wizard-right-panel_content col-xs-12">' +
' </div>' +
' </div>' +
' </div>' +
' <div class="col-sm-12 pg-prop-status-bar" style="visibility:hidden">' +
' <div class="media error-in-footer bg-red-1 border-red-2 font-red-3 text-14">' +
' <div class="media-body media-middle">' +
' <div class="alert-icon error-icon">' +
' <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>' +
' </div>' +
' <div class="alert-text">' +
' </div>' +
' <div class="close-error-bar">' +
' <a class="close-error">x</a>' +
' </div>' +
' </div>' +
' </div>' +
' </div>' +
' <div class="footer col-sm-12">' +
' <div class="row">' +
' <div class="col-sm-4 wizard-buttons pull-left">' +
' <button title = "' + gettext('Help for this dialog.') + '"' +
' class="btn btn-default pull-left wizard-help" <%=this.options.wizard_help ? "" : "disabled" %>>' +
' <span class="fa fa-lg fa-question"></span></button>' +
' </div>' +
' <div class="col-sm-8">' +
' <div class="wizard-buttons">' +
' <button class="btn btn-primary wizard-back" <%=this.options.disable_prev ? "disabled" : ""%>>' +
' <i class="fa fa-backward"></i>' + gettext('Back') + '</button>' +
' <button class="btn btn-primary wizard-next" <%=this.options.disable_next ? "disabled" : ""%>>' +
' ' + gettext('Next') +
' <i class="fa fa-forward"></i></button>' +
' <button class="btn btn-danger wizard-cancel" <%=this.options.disable_cancel ? "disabled" : ""%>>' +
' <i class="fa fa-lg fa-close"></i>' + gettext('Cancel') + '</button>' +
' <button class="btn btn-primary wizard-finish" <%=this.options.disable_finish ? "disabled" : ""%>>' +
' ' + gettext('Finish') + '</button>' +
' </div>' +
' </div>' +
' </div>' +
' </div>' +
' </div>'),
events: {
"click button.wizard-next" : "nextPage",
"click button.wizard-back" : "prevPage",
"click button.wizard-cancel" : "onCancel",
"click button.wizard-cancel-event" : "onCancel",
"click button.wizard-maximize-event" : "onMaximize",
"click button.wizard-finish" : "finishWizard",
"click button.wizard-help" : "onDialogHelp",
"click a.close-error" : "closeErrorMsg",
'click button.wizard-next': 'nextPage',
'click button.wizard-back': 'prevPage',
'click button.wizard-cancel': 'onCancel',
'click button.wizard-cancel-event': 'onCancel',
'click button.wizard-maximize-event': 'onMaximize',
'click button.wizard-finish': 'finishWizard',
'click button.wizard-help': 'onDialogHelp',
'click a.close-error': 'closeErrorMsg',
},
initialize: function(options) {
this.options = _.extend({}, this.options, options.options);
@ -150,15 +164,17 @@ function(_, Backbone, pgAdmin, pgBrowser, gettext) {
this.options.disable_prev = (this.options.disable_prev ? true : this.evalASFunc(this.currPage.disable_prev));
this.options.disable_cancel = (this.currPage.canCancel ? true : this.evalASFunc(this.currPage.disable_cancel));
var that = this;
/* HTML Content */
if (data.html) { data.content = data.html; }
if (data.html) {
data.content = data.html;
}
/* Backbone View */
else if (data.view) { data.content = data.view.render().el;}
else if (data.view) {
data.content = data.view.render().el;
}
$(this.el).html(this.tmpl(data));
$(this.el).find(".wizard-right-panel_content").html(data.content);
$(this.el).find('.wizard-right-panel_content').html(data.content);
/* OnLoad Callback */
this.onLoad();
@ -166,15 +182,16 @@ function(_, Backbone, pgAdmin, pgBrowser, gettext) {
return this;
},
nextPage: function() {
if (!this.beforeNext()) { return false; }
if (!this.beforeNext()) {
return false;
}
var page_id = this.onNext();
if (page_id ) {
if (page_id) {
this.currPage = this.collection.get(page_id).toJSON();
this.options.curr_page = this.collection.indexOf(this.collection.get(page_id));
}
else if (this.options.curr_page < (this.collection.length-1)) {
} else if (this.options.curr_page < (this.collection.length - 1)) {
this.options.curr_page = this.options.curr_page + 1;
this.currPage = this.collection.at(this.options.curr_page).toJSON();
}
@ -185,15 +202,16 @@ function(_, Backbone, pgAdmin, pgBrowser, gettext) {
return this.render();
},
prevPage: function() {
if (!this.beforePrev()) { return false; }
if (!this.beforePrev()) {
return false;
}
var page_id = this.onPrev();
if (page_id){
if (page_id) {
this.currPage = this.collection.get(page_id).toJSON();
this.options.curr_page = this.collection.indexOf(this.collection.get(page_id));
}
else if (this.options.curr_page > 0) {
} else if (this.options.curr_page > 0) {
this.options.curr_page = this.options.curr_page - 1;
this.currPage = this.collection.at(this.options.curr_page).toJSON();
}
@ -212,41 +230,37 @@ function(_, Backbone, pgAdmin, pgBrowser, gettext) {
return true;
},
enableDisableNext: function(disable) {
if (typeof(disable) != 'undefined') {
this.options.disable_next = disable;
}
else if (this.options.curr_page >= (this.collection.length-1)) {
this.options.disable_next = true;
}
else {
this.options.disable_next = false;
}
if (typeof(disable) != 'undefined') {
this.options.disable_next = disable;
} else if (this.options.curr_page >= (this.collection.length - 1)) {
this.options.disable_next = true;
} else {
this.options.disable_next = false;
}
},
enableDisablePrev: function(disable) {
if (typeof(disable) != 'undefined') {
this.options.disable_prev = disable;
}
else if (this.options.curr_page <= 0) {
this.options.disable_prev = true;
}
else {
this.options.disable_prev = false;
}
if (typeof(disable) != 'undefined') {
this.options.disable_prev = disable;
} else if (this.options.curr_page <= 0) {
this.options.disable_prev = true;
} else {
this.options.disable_prev = false;
}
},
closeErrorMsg: function() {
$(this.el).find('.pg-prop-status-bar .alert-text').empty();
$(this.el).find('.pg-prop-status-bar').css("visibility", "hidden");
$(this.el).find('.pg-prop-status-bar').css('visibility', 'hidden');
},
beforeNext: function(){
beforeNext: function() {
return this.evalASFunc(this.currPage.beforeNext);
},
beforePrev: function(){
beforePrev: function() {
return this.evalASFunc(this.currPage.beforePrev);
},
onPrev: function(){
onPrev: function() {
return this.evalASFunc(this.currPage.onPrev);
},
onNext: function(){
onNext: function() {
return this.evalASFunc(this.currPage.onNext);
},
onLoad: function() {
@ -261,12 +275,12 @@ function(_, Backbone, pgAdmin, pgBrowser, gettext) {
},
onMaximize: function() {
var dialog_api = this.options.dialog_api,
old_classes, _el = this.$el.find('.wizard-maximize-event');
_el = this.$el.find('.wizard-maximize-event');
// If no dialog api found then return
if(!dialog_api) return;
if (!dialog_api) return;
if(dialog_api.isMaximized()) {
if (dialog_api.isMaximized()) {
// toggle the icon
_el.removeClass('ajs-maximized');
dialog_api.restore();
@ -297,7 +311,7 @@ function(_, Backbone, pgAdmin, pgBrowser, gettext) {
pnlDialogHelp.focus();
iframe.openURL(this.options.wizard_help);
}
},
});
return pgBrowser;

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,8 @@
define('misc.bgprocess', [
'sources/pgadmin', 'sources/gettext', 'sources/url_for', 'underscore',
'underscore.string', 'jquery', 'pgadmin.browser', 'alertify',
'pgadmin.browser.messages'
], function(
pgAdmin, gettext, url_for, _, S, $, pgBrowser, alertify, pgMessages
pgAdmin, gettext, url_for, _, S, $, pgBrowser, Alertify
) {
pgBrowser.BackgroundProcessObsorver = pgBrowser.BackgroundProcessObsorver || {};
@ -12,6 +11,8 @@ define('misc.bgprocess', [
return pgBrowser.BackgroundProcessObsorver;
}
var wcDocker = window.wcDocker;
var BGProcess = function(info, notify) {
var self = this;
setTimeout(
@ -45,7 +46,9 @@ define('misc.bgprocess', [
notifier: null,
container: null,
panel: null,
logs: $('<ol></ol>', {class: 'pg-bg-process-logs'})
logs: $('<ol></ol>', {
class: 'pg-bg-process-logs',
}),
});
if (this.notify) {
@ -62,7 +65,7 @@ define('misc.bgprocess', [
if (!process.notifier)
process.show.apply(process);
}
)
);
}
var self = this;
@ -75,29 +78,32 @@ define('misc.bgprocess', [
bgprocess_url: function(type) {
switch (type) {
case 'status':
if (this.details && this.out != -1 && this.err != -1) {
return url_for(
case 'status':
if (this.details && this.out != -1 && this.err != -1) {
return url_for(
'bgprocess.detailed_status', {
'pid': this.id,
'out': this.out,
'err': this.err
'err': this.err,
}
);
}
return url_for('bgprocess.status', {'pid': this.id});
case 'acknowledge':
return url_for('bgprocess.acknowledge', {'pid': this.id});
default:
return url_for('bgprocess.list');
}
return url_for('bgprocess.status', {
'pid': this.id,
});
case 'acknowledge':
return url_for('bgprocess.acknowledge', {
'pid': this.id,
});
default:
return url_for('bgprocess.list');
}
},
update: function(data) {
var self = this,
out = [],
err = [],
idx = 0;
out = [],
err = [];
if ('stime' in data)
self.stime = new Date(data.stime);
@ -131,9 +137,7 @@ define('misc.bgprocess', [
}
self.completed = self.completed || (
'err' in data && 'out' in data && data.err.done && data.out.done
) || (
!self.details && !_.isNull(self.exit_code)
);
) || (!self.details && !_.isNull(self.exit_code));
var io = 0,
ie = 0,
@ -145,7 +149,7 @@ define('misc.bgprocess', [
};
while (io < out.length && ie < err.length) {
if (pgAdmin.natural_sort(out[io][0], err[ie][0]) <= 0){
if (pgAdmin.natural_sort(out[io][0], err[ie][0]) <= 0) {
res.push('<li class="pg-bg-res-out">' + escapeHTML(out[io++][1]) + '</li>');
} else {
res.push('<li class="pg-bg-res-err">' + escapeHTML(err[ie++][1]) + '</li>');
@ -179,7 +183,7 @@ define('misc.bgprocess', [
self.curr_status = gettext('Successfully completed.');
} else {
self.curr_status = S(
gettext("Failed (exit code: %s).")
gettext('Failed (exit code: %s).')
).sprintf(String(self.exit_code)).value();
}
}
@ -198,7 +202,9 @@ define('misc.bgprocess', [
);
}
setTimeout(function() {self.show.apply(self)}, 10);
setTimeout(function() {
self.show.apply(self);
}, 10);
}
if (!self.completed) {
@ -219,15 +225,19 @@ define('misc.bgprocess', [
url: self.bgprocess_url('status'),
cache: false,
async: true,
contentType: "application/json",
contentType: 'application/json',
success: function(res) {
setTimeout(function() { self.update(res); }, 10);
setTimeout(function() {
self.update(res);
}, 10);
},
error: function(res) {
// Try after some time only if job id present
if (res.status != 410)
setTimeout(function() { self.update(res); }, 10000);
}
setTimeout(function() {
self.update(res);
}, 10000);
},
});
},
@ -237,35 +247,40 @@ define('misc.bgprocess', [
if (self.notify && !self.details) {
if (!self.notifier) {
var header = $('<div></div>', {
class: "h5 pg-bg-notify-header"
}).append($('<span></span>').text(self.desc)),
content = $('<div class="pg-bg-bgprocess row"></div>').append(
header
).append(
$('<div></div>', {class: 'pg-bg-notify-body h6' }).append(
$('<div></div>', {class: 'pg-bg-start col-xs-12' }).append(
$('<div></div>').text(self.stime.toString())
).append(
$('<div class="pg-bg-etime"></div>')
)
)
),
for_details = $('<div></div>', {
class: "col-xs-12 text-center pg-bg-click h6"
class: 'h5 pg-bg-notify-header',
}).append($('<span></span>').text(self.desc)),
content = $('<div class="pg-bg-bgprocess row"></div>').append(
header
).append(
$('<div></div>', {
class: 'pg-bg-notify-body h6',
}).append(
$('<span></span>').text(gettext('Click here for details.'))
).appendTo(content),
status = $('<div></div>', {
class: "pg-bg-status col-xs-12 h5 " + ((self.exit_code === 0) ?
'bg-success': (self.exit_code == 1) ?
'bg-failed' : '')
}).appendTo(content),
close_me = $(
'<div class="bg-close"><i class="fa fa-close"></i></div>'
).appendTo(header);
$('<div></div>', {
class: 'pg-bg-start col-xs-12',
}).append(
$('<div></div>').text(self.stime.toString())
).append(
$('<div class="pg-bg-etime"></div>')
)
)
),
for_details = $('<div></div>', {
class: 'col-xs-12 text-center pg-bg-click h6',
}).append(
$('<span></span>').text(gettext('Click here for details.'))
).appendTo(content),
close_me = $(
'<div class="bg-close"><i class="fa fa-close"></i></div>'
).appendTo(header);
$('<div></div>', {
class: 'pg-bg-status col-xs-12 h5 ' + ((self.exit_code === 0) ?
'bg-success' : (self.exit_code == 1) ?
'bg-failed' : ''),
}).appendTo(content);
self.container = content;
self.notifier = alertify.notify(
self.notifier = Alertify.notify(
content.get(0), 'bg-bgprocess', 0, null
);
@ -281,7 +296,7 @@ define('misc.bgprocess', [
this.show_detailed_view.apply(this);
}.bind(self));
close_me.on('click', function(ev) {
close_me.on('click', function() {
this.notifier.dismiss();
this.notifier = null;
this.acknowledge_server.apply(this);
@ -312,37 +327,37 @@ define('misc.bgprocess', [
if (self.exit_code === 0) {
$status_bar.addClass('bg-success');
} else if (self.exit_code == 1){
} else if (self.exit_code == 1) {
$status_bar.addClass('bg-failed');
}
} else {
self.show_detailed_view.apply(self)
self.show_detailed_view.apply(self);
}
},
show_detailed_view: function() {
var self = this,
panel = this.panel,
is_new = false;
panel = this.panel,
is_new = false;
if (!self.panel) {
is_new = true;
panel = this.panel =
pgBrowser.BackgroundProcessObsorver.create_panel();
pgBrowser.BackgroundProcessObsorver.create_panel();
panel.title('Process Watcher - ' + _.escape(self.desc));
panel.focus();
}
var container = panel.$container,
status_class = (
(self.exit_code === 0) ?
'bg-bgprocess-success': (self.exit_code == 1) ?
'bg-bgprocess-failed' : ''
),
$logs = container.find('.bg-process-watcher'),
$header = container.find('.bg-process-details'),
$footer = container.find('.bg-process-footer');
status_class = (
(self.exit_code === 0) ?
'bg-bgprocess-success' : (self.exit_code == 1) ?
'bg-bgprocess-failed' : ''
),
$logs = container.find('.bg-process-watcher'),
$header = container.find('.bg-process-details'),
$footer = container.find('.bg-process-footer');
if (is_new) {
// set logs
@ -413,14 +428,15 @@ define('misc.bgprocess', [
url: self.bgprocess_url('acknowledge'),
cache: false,
async: true,
contentType: "application/json",
success: function(res) {
contentType: 'application/json',
success: function() {
return;
},
error: function(res) {
}
error: function() {
console.warn(arguments);
},
});
}
},
});
_.extend(
@ -449,7 +465,7 @@ define('misc.bgprocess', [
}, 1000
);
}
)
);
},
update_process_list: function(recheck) {
@ -461,9 +477,8 @@ define('misc.bgprocess', [
url: url_for('bgprocess.list'),
cache: false,
async: true,
contentType: "application/json",
contentType: 'application/json',
success: function(res) {
var cnt = 0;
if (!res || !_.isArray(res)) {
return;
}
@ -484,9 +499,10 @@ define('misc.bgprocess', [
);
}
},
error: function(res) {
error: function() {
// FIXME:: What to do now?
}
console.warn(arguments);
},
});
},
@ -498,11 +514,11 @@ define('misc.bgprocess', [
wcDocker.DOCK.FLOAT,
null, {
w: (screen.width < 700 ?
screen.width * 0.95 : screen.width * 0.5),
h: (screen.height < 500 ?
screen.height * 0.95 : screen.height * 0.5),
x: (screen.width < 700 ? '2%' : '25%'),
y: (screen.height < 500 ? '2%' : '25%')
screen.width * 0.95 : screen.width * 0.5),
h: (screen.height < 500 ?
screen.height * 0.95 : screen.height * 0.5),
x: (screen.width < 700 ? '2%' : '25%'),
y: (screen.height < 500 ? '2%' : '25%'),
});
},
@ -510,40 +526,40 @@ define('misc.bgprocess', [
var w = pgBrowser.docker,
panels = w.findPanels('bg_process_watcher');
if (panels && panels.length >= 1)
return;
if (panels && panels.length >= 1)
return;
var p = new pgBrowser.Panel({
name: 'bg_process_watcher',
showTitle: true,
isCloseable: true,
isPrivate: true,
content: '<div class="bg-process-details col-xs-12">'+
'<p class="bg-detailed-desc"></p>'+
'<div class="bg-process-stats">'+
'<span><b>' + gettext('Start time') + ': </b>'+
'<span class="bgprocess-start-time"></span>'+
'</span></div>'+
'</div>'+
'<div class="bg-process-watcher col-xs-12">'+
'</div>'+
'<div class="bg-process-footer col-xs-12">'+
'<div class="bg-process-status col-xs-6">'+
'<span><b>' + gettext('Status') + ':</b></span><p></p>'+
'</div>'+
'<div class="bg-process-exec-time col-xs-6">'+
'<div class="exec-div pull-right">'+
'<span><b>' + gettext('Execution time') + ':</b></span><p></p>'+
'</div>'+
'</div>'+
'</div>',
onCreate: function(myPanel, $container) {
$container.addClass('pg-no-overflow');
}
});
p.load(pgBrowser.docker);
}
var p = new pgBrowser.Panel({
name: 'bg_process_watcher',
showTitle: true,
isCloseable: true,
isPrivate: true,
content: '<div class="bg-process-details col-xs-12">' +
'<p class="bg-detailed-desc"></p>' +
'<div class="bg-process-stats">' +
'<span><b>' + gettext('Start time') + ': </b>' +
'<span class="bgprocess-start-time"></span>' +
'</span></div>' +
'</div>' +
'<div class="bg-process-watcher col-xs-12">' +
'</div>' +
'<div class="bg-process-footer col-xs-12">' +
'<div class="bg-process-status col-xs-6">' +
'<span><b>' + gettext('Status') + ':</b></span><p></p>' +
'</div>' +
'<div class="bg-process-exec-time col-xs-6">' +
'<div class="exec-div pull-right">' +
'<span><b>' + gettext('Execution time') + ':</b></span><p></p>' +
'</div>' +
'</div>' +
'</div>',
onCreate: function(myPanel, $container) {
$container.addClass('pg-no-overflow');
},
});
p.load(pgBrowser.docker);
},
});
return pgBrowser.BackgroundProcessObsorver;
});
});

View File

@ -1,7 +1,7 @@
define('misc.depends', [
'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'pgadmin.browser',
'alertify', 'pgadmin.alertifyjs'
], function(gettext, _, S, $, pgBrowser, Alertify) {
'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'backbone',
'pgadmin.browser', 'pgadmin.alertifyjs', 'pgadmin.backgrid',
], function(gettext, _, S, $, Backbone, pgBrowser, Alertify, Backgrid) {
if (pgBrowser.ShowNodeDepends)
return pgBrowser.ShowNodeDepends;
@ -20,19 +20,15 @@ define('misc.depends', [
/* Parameter is used to set the proper label of the
* backgrid header cell.
*/
var dependent = true,
dependentGrid = null, // Refer to the backgrid object render under Dependents tab
dependenciesGrid = null; // Refer to the backgrid object render under Dependencies tab
_.bindAll(this, 'showDependents', 'dependentsPanelVisibilityChanged',
'showDependencies', 'dependenciesPanelVisibilityChanged', '__updateCollection'
'showDependencies', 'dependenciesPanelVisibilityChanged', '__updateCollection'
);
// We will listened to the visibility change of the Dependencies and Dependents panel
pgBrowser.Events.on('pgadmin-browser:panel-dependencies:' + wcDocker.EVENT.VISIBILITY_CHANGED,
this.dependenciesPanelVisibilityChanged);
this.dependenciesPanelVisibilityChanged);
pgBrowser.Events.on('pgadmin-browser:panel-dependents:' + wcDocker.EVENT.VISIBILITY_CHANGED,
this.dependentsPanelVisibilityChanged);
this.dependentsPanelVisibilityChanged);
// Defining Backbone Model for Dependencies and Dependents.
var Model = Backbone.Model.extend({
@ -43,28 +39,28 @@ define('misc.depends', [
/* field contains 'Database Name' for 'Tablespace and Role node',
* for other node it contains 'Restriction'.
*/
field: undefined
field: undefined,
},
// This function is used to fetch/set the icon for the type(Function, Role, Database, ....)
parse: function(res) {
var node = pgBrowser.Nodes[res.type];
res.icon = node ? (_.isFunction(node['node_image']) ?
(node['node_image']).apply(node, [null, null]) :
(node['node_image'] || ('icon-' + res.type))) :
('icon-' + res.type);
res.type = S.titleize(res.type.replace(/_/g, " "), true);
(node['node_image']).apply(node, [null, null]) :
(node['node_image'] || ('icon-' + res.type))) :
('icon-' + res.type);
res.type = S.titleize(res.type.replace(/_/g, ' '), true);
return res;
}
},
});
// Defining Backbone Collection for Dependents.
this.dependentCollection = new (Backbone.Collection.extend({
model: Model
this.dependentCollection = new(Backbone.Collection.extend({
model: Model,
}))(null);
// Defining Backbone Collection for Dependencies.
this.dependenciesCollection = new (Backbone.Collection.extend({
model: Model
this.dependenciesCollection = new(Backbone.Collection.extend({
model: Model,
}))(null);
var self = this;
@ -75,39 +71,40 @@ define('misc.depends', [
*/
var appendGridToPanel = function(collection, panel, is_dependent) {
var $container = panel[0].layout().scene().find('.pg-panel-content'),
$gridContainer = $container.find('.pg-panel-depends-container'),
grid = new Backgrid.Grid({
columns: [
{
name : 'type',
label: gettext('Type'),
// Extend it to render the icon as per the type.
cell: Backgrid.Cell.extend({
render: function() {
Backgrid.Cell.prototype.render.apply(this, arguments);
this.$el.prepend($('<i>', {class: "wcTabIcon " + this.model.get('icon')}));
return this;
}
}),
editable: false
$gridContainer = $container.find('.pg-panel-depends-container'),
grid = new Backgrid.Grid({
columns: [{
name: 'type',
label: gettext('Type'),
// Extend it to render the icon as per the type.
cell: Backgrid.Cell.extend({
render: function() {
Backgrid.Cell.prototype.render.apply(this, arguments);
this.$el.prepend($('<i>', {
class: 'wcTabIcon ' + this.model.get('icon'),
}));
return this;
},
{
name : 'name',
label: gettext('Name'),
cell: 'string',
editable: false
},
{
name : 'field',
label: '', // label kept blank, it will change dynamically
cell: 'string',
editable: false
}
],
}),
editable: false,
},
{
name: 'name',
label: gettext('Name'),
cell: 'string',
editable: false,
},
{
name: 'field',
label: '', // label kept blank, it will change dynamically
cell: 'string',
editable: false,
},
],
collection: collection,
className: "backgrid presentation table backgrid-striped table-bordered table-hover",
});
collection: collection,
className: 'backgrid presentation table backgrid-striped table-bordered table-hover',
});
// Condition is used to save grid object to change the label of the header.
if (is_dependent)
@ -122,11 +119,12 @@ define('misc.depends', [
// We will listened to the visibility change of the Dependencies and Dependents panel
pgBrowser.Events.on('pgadmin-browser:panel-dependencies:' + wcDocker.EVENT.VISIBILITY_CHANGED,
this.dependenciesPanelVisibilityChanged);
this.dependenciesPanelVisibilityChanged);
pgBrowser.Events.on('pgadmin-browser:panel-dependents:' + wcDocker.EVENT.VISIBILITY_CHANGED,
this.dependentsPanelVisibilityChanged);
this.dependentsPanelVisibilityChanged);
pgBrowser.Events.on(
'pgadmin:browser:node:updated', function() {
'pgadmin:browser:node:updated',
function() {
if (this.dependenciesPanels && this.dependenciesPanels.length) {
$(this.dependenciesPanels[0]).data('node-prop', '');
this.dependenciesPanelVisibilityChanged(this.dependenciesPanels[0]);
@ -153,10 +151,10 @@ define('misc.depends', [
// If Dependencies panel exists and is focused then we need to listen the browser tree selection events.
if ((dependenciesPanels[0].isVisible()) || dependenciesPanels.length != 1) {
pgBrowser.Events.on('pgadmin-browser:tree:selected', this.showDependencies);
pgBrowser.Events.on('pgadmin-browser:tree:selected', this.showDependencies);
}
}.bind(this)
);
);
} else {
appendGridToPanel(this.dependenciesCollection, this.dependenciesPanels, false);
@ -178,7 +176,7 @@ define('misc.depends', [
pgBrowser.Events.on('pgadmin-browser:tree:selected', this.showDependents);
}
}.bind(this)
);
);
} else {
appendGridToPanel(this.dependentCollection, this.dependentsPanels, true);
@ -192,12 +190,11 @@ define('misc.depends', [
// Fetch the actual data and update the collection
__updateCollection: function(collection, panel, url, messages, node, item, type) {
var msg = messages[0],
$container = panel[0].layout().scene().find('.pg-panel-content'),
$msgContainer = $container.find('.pg-panel-depends-message'),
$gridContainer = $container.find('.pg-panel-depends-container'),
treeHierarchy = node.getTreeNodeHierarchy(item),
n_value = -1,
n_type = type;
$container = panel[0].layout().scene().find('.pg-panel-content'),
$msgContainer = $container.find('.pg-panel-depends-message'),
$gridContainer = $container.find('.pg-panel-depends-container'),
treeHierarchy = node.getTreeNodeHierarchy(item),
n_type = type;
// Avoid unnecessary reloads
if (_.isEqual($(panel[0]).data('node-prop'), treeHierarchy)) {
@ -230,20 +227,26 @@ define('misc.depends', [
* it should be 'Restriction'.
*/
if (this.dependent && (node.type == 'tablespace' || node.type == 'role'))
this.dependentGrid.columns.models[2].set({'label': gettext('Database')});
this.dependentGrid.columns.models[2].set({
'label': gettext('Database'),
});
else {
this.dependenciesGrid.columns.models[2].set({'label': gettext('Restriction')});
this.dependentGrid.columns.models[2].set({'label': gettext('Restriction')});
this.dependenciesGrid.columns.models[2].set({
'label': gettext('Restriction'),
});
this.dependentGrid.columns.models[2].set({
'label': gettext('Restriction'),
});
}
// Hide message container and show grid container.
$msgContainer.addClass('hidden');
$gridContainer.removeClass('hidden');
var timer = setTimeout(function(){
var timer = setTimeout(function() {
// notify user if request is taking longer than 1 second
$msgContainer.text(gettext("Retrieving data from the server..."));
$msgContainer.text(gettext('Retrieving data from the server...'));
$msgContainer.removeClass('hidden');
if ($gridContainer) {
$gridContainer.addClass('hidden');
@ -266,24 +269,23 @@ define('misc.depends', [
pgBrowser.Events.trigger(
'pgadmin:node:retrieval:error', 'depends', xhr, error, message
);
if (
!Alertify.pgHandleItemError(xhr, error, message, {
item: item, info: treeHierarchy
})
) {
if (!Alertify.pgHandleItemError(xhr, error, message, {
item: item,
info: treeHierarchy,
})) {
Alertify.pgNotifier(
error, xhr,
S(
gettext("Error retrieving the information - %s")
gettext('Error retrieving the information - %s')
).sprintf(message || _label).value(),
function() {
console.log(arguments);
console.warn(arguments);
}
);
}
// show failed message.
$msgContainer.text(gettext("Failed to retrieve data from the server."));
}
$msgContainer.text(gettext('Failed to retrieve data from the server.'));
},
});
}
}
@ -305,25 +307,23 @@ define('misc.depends', [
if (self.timeout) {
clearTimeout(self.timeout);
}
self.timeout = setTimeout(
self.timeout = setTimeout(
self.__updateCollection(
self.dependentCollection,
self.dependentsPanels,
node.generate_url(item, 'dependent', data, true),
[gettext('No object selected.'), gettext('No dependent information is available for the current object.'),
gettext('Fetching dependent information from the server...')],
node,
item,
data._type
self.dependentCollection, self.dependentsPanels,
node.generate_url(item, 'dependent', data, true), [
gettext('No object selected.'),
gettext('No dependent information is available for the current object.'),
gettext('Fetching dependent information from the server...'),
], node, item, data._type
), 400
);
},
dependentsPanelVisibilityChanged: function(panel) {
if (panel.isVisible()) {
var t = pgBrowser.tree,
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
pgBrowser.ShowNodeDepends.showDependents.apply(pgBrowser.ShowNodeDepends, [i, d, n]);
@ -349,13 +349,13 @@ define('misc.depends', [
if (self.timeout) {
clearTimeout(self.timeout);
}
self.timeout = setTimeout(
self.timeout = setTimeout(
self.__updateCollection(
self.dependenciesCollection,
self.dependenciesPanels,
node.generate_url(item, 'dependency', data, true),
[gettext('Please select an object in the tree view.'), gettext('No dependency information is available for the current object.'),
gettext('Fetching dependency information from the server...')],
node.generate_url(item, 'dependency', data, true), [gettext('Please select an object in the tree view.'), gettext('No dependency information is available for the current object.'),
gettext('Fetching dependency information from the server...'),
],
node,
item,
data._type
@ -365,9 +365,9 @@ define('misc.depends', [
dependenciesPanelVisibilityChanged: function(panel) {
if (panel.isVisible()) {
var t = pgBrowser.tree,
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
pgBrowser.ShowNodeDepends.showDependencies.apply(pgBrowser.ShowNodeDepends, [i, d, n]);
@ -377,8 +377,8 @@ define('misc.depends', [
// We don't need to listen the tree item selection event.
pgBrowser.Events.off('pgadmin-browser:tree:selected', pgBrowser.ShowNodeDepends.showDependencies);
}
}
},
});
return pgBrowser.ShowNodeDepends;
});
});

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
define('misc.sql', [
'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'pgadmin.browser',
'alertify', 'pgadmin.alertifyjs'
], function(gettext, _, S, $, pgBrowser, Alertify) {
'sources/gettext', 'underscore', 'underscore.string', 'jquery',
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
], function(gettext, _, S, $, pgAdmin, pgBrowser, Alertify) {
pgBrowser.ShowNodeSQL = pgBrowser.ShowNodeSQL || {};
@ -28,7 +28,8 @@ define('misc.sql', [
);
pgBrowser.Events.on(
'pgadmin:browser:node:updated', function() {
'pgadmin:browser:node:updated',
function() {
if (this.sqlPanels && this.sqlPanels.length) {
$(this.sqlPanels[0]).data('node-prop', '');
this.sqlPanelVisibilityChanged(this.sqlPanels[0]);
@ -49,9 +50,8 @@ define('misc.sql', [
);
}
}.bind(this)
);
}
else {
);
} else {
if ((sqlPanels[0].isVisible()) || sqlPanels.length != 1) {
pgBrowser.Events.on('pgadmin-browser:tree:selected', this.showSQL);
}
@ -67,15 +67,13 @@ define('misc.sql', [
this.timeout && clearTimeout(this.timeout);
var that = this;
this.timeout = setTimeout(
this.timeout = setTimeout(
function() {
var sql = '';
if (node) {
sql = '-- ' + gettext("No SQL could be generated for the selected object.");
var self = this,
n_type = data._type,
n_value = -1,
treeHierarchy = node.getTreeNodeHierarchy(item);
sql = '-- ' + gettext('No SQL could be generated for the selected object.');
var n_type = data._type,
treeHierarchy = node.getTreeNodeHierarchy(item);
// Avoid unnecessary reloads
if (_.isEqual($(that.sqlPanels[0]).data('node-prop'), treeHierarchy)) {
@ -88,19 +86,19 @@ define('misc.sql', [
sql = '';
var url = node.generate_url(item, 'sql', data, true),
timer;
timer;
$.ajax({
url: url,
type:'GET',
beforeSend: function(jqXHR, settings) {
type: 'GET',
beforeSend: function() {
// Generate a timer for the request
timer = setTimeout(function(){
// notify user if request is taking longer than 1 second
timer = setTimeout(function() {
// Notify user if request is taking longer than 1 second
pgAdmin.Browser.editor.setValue(
gettext("Retrieving data from the server...")
);
pgAdmin.Browser.editor.setValue(
gettext('Retrieving data from the server...')
);
}, 1000);
},
success: function(res) {
@ -114,22 +112,19 @@ define('misc.sql', [
pgBrowser.Events.trigger(
'pgadmin:node:retrieval:error', 'sql', xhr, error, message, item
);
if (
!Alertify.pgHandleItemError(xhr, error, message, {
item: item, info: treeHierarchy
})
) {
if (!Alertify.pgHandleItemError(xhr, error, message, {
item: item,
info: treeHierarchy,
})) {
Alertify.pgNotifier(
error, xhr,
S(gettext("Error retrieving the information - %s")).sprintf(
S(gettext('Error retrieving the information - %s')).sprintf(
message || _label
).value(),
function() {
console.log(arguments);
}
function() {}
);
}
}
},
});
}
}
@ -142,9 +137,9 @@ define('misc.sql', [
sqlPanelVisibilityChanged: function(panel) {
if (panel.isVisible()) {
var t = pgBrowser.tree,
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
pgBrowser.ShowNodeSQL.showSQL.apply(pgBrowser.ShowNodeSQL, [i, d, n]);
@ -154,8 +149,8 @@ define('misc.sql', [
// We don't need to listen the tree item selection event.
pgBrowser.Events.off('pgadmin-browser:tree:selected', pgBrowser.ShowNodeSQL.showSQL);
}
}
},
});
return pgBrowser.ShowNodeSQL;
});
});

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,9 @@
define('misc.statistics', [
'sources/gettext', 'underscore', 'underscore.string', 'jquery',
'pgadmin.browser', 'backgrid',
'alertify', 'sources/size_prettify'
], function(gettext, _, S, $, pgBrowser, Backgrid, Alertify, sizePrettify) {
'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'backbone',
'pgadmin.browser', 'pgadmin.backgrid', 'alertify', 'sources/size_prettify',
], function(
gettext, _, S, $, Backbone, pgBrowser, Backgrid, Alertify, sizePrettify
) {
if (pgBrowser.NodeStatistics)
return pgBrowser.NodeStatistics;
@ -13,69 +14,78 @@ define('misc.statistics', [
return pgBrowser.NodeStatistics;
}
var SizeFormatter = Backgrid.SizeFormatter = function () {};
var SizeFormatter = Backgrid.SizeFormatter = function() {};
_.extend(SizeFormatter.prototype, {
/**
Takes a raw value from a model and returns the human readable formatted
string for display.
/**
Takes a raw value from a model and returns the human readable formatted
string for display.
@member Backgrid.SizeFormatter
@param {*} rawData
@param {Backbone.Model} model Used for more complicated formatting
@return {*}
*/
fromRaw: function (rawData, model) {
return sizePrettify(rawData);
},
toRaw: function (formattedData, model) {
return formattedData;
}
@member Backgrid.SizeFormatter
@param {*} rawData
@param {Backbone.Model} model Used for more complicated formatting
@return {*}
*/
fromRaw: function(rawData) {
return sizePrettify(rawData);
},
toRaw: function(formattedData) {
return formattedData;
},
});
var PGBooleanCell = Backgrid.Extension.SwitchCell.extend({
defaults: _.extend({}, Backgrid.Extension.SwitchCell.prototype.defaults)
}),
typeCellMapper = {
// boolean
16: PGBooleanCell,
// int8
20: Backgrid.IntegerCell,
// int2
21: Backgrid.IntegerCell,
// int4
23: Backgrid.IntegerCell,
// float4
700: Backgrid.NumberCell,
// float8
701: Backgrid.NumberCell,
// numeric
1700: Backgrid.NumberCell,
// abstime
702: Backgrid.DatetimeCell,
// reltime
703: Backgrid.DatetimeCell,
// date
1082: Backgrid.DatetimeCell.extend({
includeDate: true, includeTime: false, includeMilli: false
defaults: _.extend({}, Backgrid.Extension.SwitchCell.prototype.defaults),
}),
// time
1083: Backgrid.DatetimeCell.extend({
includeDate: false, includeTime: true, includeMilli: true
}),
// timestamp
1114: Backgrid.DatetimeCell.extend({
includeDate: true, includeTime: true, includeMilli: true
}),
// timestamptz
1184: 'string'/* Backgrid.DatetimeCell.extend({
includeDate: true, includeTime: true, includeMilli: true
}) */,
1266: 'string'/* Backgrid.DatetimeCell.extend({
includeDate: false, includeTime: true, includeMilli: true
}) */
},
GRID_CLASSES = "backgrid presentation table backgrid-striped table-bordered table-hover",
wcDocker = window.wcDocker;
typeCellMapper = {
// boolean
16: PGBooleanCell,
// int8
20: Backgrid.IntegerCell,
// int2
21: Backgrid.IntegerCell,
// int4
23: Backgrid.IntegerCell,
// float4
700: Backgrid.NumberCell,
// float8
701: Backgrid.NumberCell,
// numeric
1700: Backgrid.NumberCell,
// abstime
702: Backgrid.DatetimeCell,
// reltime
703: Backgrid.DatetimeCell,
// date
1082: Backgrid.DatetimeCell.extend({
includeDate: true,
includeTime: false,
includeMilli: false,
}),
// time
1083: Backgrid.DatetimeCell.extend({
includeDate: false,
includeTime: true,
includeMilli: true,
}),
// timestamp
1114: Backgrid.DatetimeCell.extend({
includeDate: true,
includeTime: true,
includeMilli: true,
}),
// timestamptz
1184: 'string'
/* Backgrid.DatetimeCell.extend({
includeDate: true, includeTime: true, includeMilli: true
}) */
,
1266: 'string',
/* Backgrid.DatetimeCell.extend({
includeDate: false, includeTime: true, includeMilli: true
}) */
},
GRID_CLASSES = 'backgrid presentation table backgrid-striped table-bordered table-hover',
wcDocker = window.wcDocker;
_.extend(
PGBooleanCell.prototype.defaults.options, {
@ -83,7 +93,7 @@ define('misc.statistics', [
offText: gettext('False'),
onColor: 'success',
offColor: 'primary',
size: 'mini'
size: 'mini',
}
);
@ -101,23 +111,23 @@ define('misc.statistics', [
_.extend(
this, {
initialized: true,
collection: new (Backbone.Collection)(null),
collection: new(Backbone.Collection)(null),
statistic_columns: [{
editable: false,
name: 'statistics',
label: gettext("Statistics"),
label: gettext('Statistics'),
cell: 'string',
headerCell: Backgrid.Extension.CustomHeaderCell,
cellHeaderClasses: 'width_percent_25'
},{
cellHeaderClasses: 'width_percent_25',
}, {
editable: false,
name: 'value',
label: gettext("Value"),
cell: 'string'
label: gettext('Value'),
cell: 'string',
}],
panel: pgBrowser.docker.findPanels('statistics'),
columns: null,
grid: null
grid: null,
});
var self = this;
@ -125,12 +135,13 @@ define('misc.statistics', [
// We will listen to the visibility change of the statistics panel
pgBrowser.Events.on(
'pgadmin-browser:panel-statistics:' +
wcDocker.EVENT.VISIBILITY_CHANGED,
this.panelVisibilityChanged
wcDocker.EVENT.VISIBILITY_CHANGED,
this.panelVisibilityChanged
);
pgBrowser.Events.on(
'pgadmin:browser:node:updated', function() {
'pgadmin:browser:node:updated',
function() {
if (this.panel && this.panel.length) {
$(this.panel[0]).data('node-prop', '');
this.panelVisibilityChanged(this.panel[0]);
@ -147,16 +158,16 @@ define('misc.statistics', [
function() {
self.panel = pgBrowser.docker.findPanels('statistics');
if (self.panel[0].isVisible() ||
self.panel.length != 1) {
self.panel.length != 1) {
pgBrowser.Events.on(
'pgadmin-browser:tree:selected', this.showStatistics
);
}
}.bind(this)
);
);
} else {
if (self.panel[0].isVisible() ||
self.panel.length != 1) {
self.panel.length != 1) {
pgBrowser.Events.on(
'pgadmin-browser:tree:selected', this.showStatistics
);
@ -164,7 +175,7 @@ define('misc.statistics', [
}
if (self.panel.length > 0 && self.panel[0].isVisible()) {
pgBrowser.Events.on(
'pgadmin-browser:tree:selected', this.showStatistics
'pgadmin-browser:tree:selected', this.showStatistics
);
}
},
@ -172,31 +183,30 @@ define('misc.statistics', [
// Fetch the actual data and update the collection
__updateCollection: function(url, node, item, node_type) {
var $container = this.panel[0].layout().scene().find('.pg-panel-content'),
$msgContainer = $container.find('.pg-panel-statistics-message'),
$gridContainer = $container.find('.pg-panel-statistics-container'),
collection = this.collection,
panel = this.panel,
self = this,
msg = '',
n_type = node_type;
$msgContainer = $container.find('.pg-panel-statistics-message'),
$gridContainer = $container.find('.pg-panel-statistics-container'),
panel = this.panel,
self = this,
msg = '',
n_type = node_type;
if (node) {
msg = gettext("No statistics are available for the selected object.");
msg = gettext('No statistics are available for the selected object.');
/* We fetch the statistics only for those node who set the parameter
* showStatistics function.
*/
// Avoid unnecessary reloads
var treeHierarchy = node.getTreeNodeHierarchy(item);
var cache_flag = {
node_type: node_type,
url: url
};
if (_.isEqual($(panel[0]).data('node-prop'), cache_flag)) {
return;
}
// Cache the current IDs for next time
$(panel[0]).data('node-prop', cache_flag);
// Avoid unnecessary reloads
var treeHierarchy = node.getTreeNodeHierarchy(item);
var cache_flag = {
node_type: node_type,
url: url,
};
if (_.isEqual($(panel[0]).data('node-prop'), cache_flag)) {
return;
}
// Cache the current IDs for next time
$(panel[0]).data('node-prop', cache_flag);
if (node.hasStatistics) {
msg = '';
@ -204,13 +214,13 @@ define('misc.statistics', [
// Set the url, fetch the data and update the collection
$.ajax({
url: url,
type:'GET',
beforeSend: function(jqXHR, settings) {
type: 'GET',
beforeSend: function() {
// Generate a timer for the request
timer = setTimeout(function(){
timer = setTimeout(function() {
// notify user if request is taking longer than 1 second
$msgContainer.text(gettext("Retrieving data from the server..."));
$msgContainer.text(gettext('Retrieving data from the server...'));
$msgContainer.removeClass('hidden');
if (self.grid) {
self.grid.remove();
@ -237,20 +247,20 @@ define('misc.statistics', [
self.grid = new Backgrid.Grid({
columns: self.columns,
collection: self.collection,
className: GRID_CLASSES
className: GRID_CLASSES,
});
self.grid.render();
$gridContainer.empty();
$gridContainer.append(self.grid.$el);
if (!$msgContainer.hasClass('hidden')) {
$msgContainer.addClass('hidden')
$msgContainer.addClass('hidden');
}
$gridContainer.removeClass('hidden');
} else if (res.info) {
if (!$gridContainer.hasClass('hidden')) {
$gridContainer.addClass('hidden')
$gridContainer.addClass('hidden');
}
$msgContainer.text(res.info);
$msgContainer.removeClass('hidden');
@ -261,24 +271,21 @@ define('misc.statistics', [
pgBrowser.Events.trigger(
'pgadmin:node:retrieval:error', 'statistics', xhr, error, message, item
);
if (
!Alertify.pgHandleItemError(xhr, error, message, {
item: item, info: treeHierarchy
})
) {
if (!Alertify.pgHandleItemError(xhr, error, message, {
item: item,
info: treeHierarchy,
})) {
Alertify.pgNotifier(
error, xhr,
S(gettext("Error retrieving the information - %s")).sprintf(
S(gettext('Error retrieving the information - %s')).sprintf(
message || _label
).value(),
function() {
console.log(arguments);
}
function() {}
);
}
// show failed message.
$msgContainer.text(gettext("Failed to retrieve data from the server."));
}
$msgContainer.text(gettext('Failed to retrieve data from the server.'));
},
});
}
}
@ -309,38 +316,38 @@ define('misc.statistics', [
if (self.timeout) {
clearTimeout(self.timeout);
}
self.timeout = setTimeout(
self.timeout = setTimeout(
function() {
self.__updateCollection.call(
self, node.generate_url(item, 'stats', data, true), node, item, data._type
);
}, 400);
}
}
},
__createMultiLineStatistics: function(data, prettifyFields) {
var rows = data['rows'],
columns = data['columns'];
columns = data['columns'];
this.columns = [];
for (var idx in columns) {
var rawColumn = columns[idx],
cell_type = typeCellMapper[rawColumn['type_code']] || 'string';
cell_type = typeCellMapper[rawColumn['type_code']] || 'string';
// Don't show PID comma separated
if(rawColumn['name'] == 'PID') {
if (rawColumn['name'] == 'PID') {
cell_type = cell_type.extend({
orderSeparator: ''
orderSeparator: '',
});
}
var col = {
editable: false,
name: rawColumn['name'],
cell: cell_type
editable: false,
name: rawColumn['name'],
cell: cell_type,
};
if (_.indexOf(prettifyFields, rawColumn['name']) != -1) {
col['formatter'] = SizeFormatter
col['formatter'] = SizeFormatter;
}
this.columns.push(col);
@ -351,8 +358,9 @@ define('misc.statistics', [
__createSingleLineStatistics: function(data, prettifyFields) {
var row = data['rows'][0],
columns = data['columns'],
res = [];
columns = data['columns'],
res = [],
name;
this.columns = this.statistic_columns;
for (var idx in columns) {
@ -360,7 +368,9 @@ define('misc.statistics', [
res.push({
'statistics': name,
// Check if row is undefined?
'value': row && row[name] ? ((_.indexOf(prettifyFields, name) != -1) ? sizePrettify(row[name]) : row[name]) : null
'value': row && row[name] ?
((_.indexOf(prettifyFields, name) != -1) ?
sizePrettify(row[name]) : row[name]) : null,
});
}
@ -370,9 +380,9 @@ define('misc.statistics', [
panelVisibilityChanged: function(panel) {
if (panel.isVisible()) {
var t = pgBrowser.tree,
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
i = t.selected(),
d = i && t.itemData(i),
n = i && d && pgBrowser.Nodes[d._type];
pgBrowser.NodeStatistics.showStatistics.apply(
pgBrowser.NodeStatistics, [i, d, n]
@ -390,7 +400,7 @@ define('misc.statistics', [
pgBrowser.NodeStatistics.showStatistics
);
}
}
},
});
return pgBrowser.NodeStatistics;

View File

@ -1,428 +1,455 @@
define('pgadmin.preferences', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'alertify',
'sources/pgadmin', 'backform', 'pgadmin.browser', 'pgadmin.backform'
], function(gettext, url_for, $, _, alertify, pgAdmin, Backform, pgBrowser) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.backform',
'pgadmin.browser',
], function(
gettext, url_for, $, _, Backbone, Alertify, pgAdmin, Backform, pgBrowser
) {
// This defines the Preference/Options Dialog for pgAdmin IV.
pgAdmin = pgAdmin || window.pgAdmin || {};
/*
* Hmm... this module is already been initialized, we can refer to the old
* object from here.
*/
if (pgAdmin.Preferences)
return pgAdmin.Preferences;
/*
* Hmm... this module is already been initialized, we can refer to the old
* object from here.
*/
if (pgAdmin.Preferences)
return pgAdmin.Preferences;
pgAdmin.Preferences = {
init: function() {
if (this.initialized)
return;
pgAdmin.Preferences = {
init: function() {
if (this.initialized)
return;
this.initialized = true;
this.initialized = true;
// Declare the Preferences dialog
alertify.dialog('preferencesDlg', function() {
// Declare the Preferences dialog
Alertify.dialog('preferencesDlg', function() {
var jTree, // Variable to create the aci-tree
controls = [], // Keep tracking of all the backform controls
// created by the dialog.
// Dialog containter
$container = $("<div class='preferences_dialog'></div>");
var jTree, // Variable to create the aci-tree
controls = [], // Keep tracking of all the backform controls
// created by the dialog.
// Dialog containter
$container = $('<div class=\'preferences_dialog\'></div>');
/*
* Preference Model
*
* This model will be used to keep tracking of the changes done for
* an individual option.
*/
var PreferenceModel = Backbone.Model.extend({
idAttribute: 'id',
defaults: {
id: undefined,
value: undefined,
},
});
/*
* Preferences Collection object.
*
* We will use only one collection object to keep track of all the
* preferences.
*/
var changed = {},
preferences = this.preferences = new(Backbone.Collection.extend({
model: PreferenceModel,
url: url_for('preferences.index'),
updateAll: function() {
// We will send only the modified data to the server.
for (var key in changed) {
this.get(key).save();
}
return true;
},
}))(null);
preferences.on('reset', function() {
// Reset the changed variables
changed = {};
});
preferences.on('change', function(m) {
var id = m.get('id');
if (!(id in changed)) {
// Keep track of the original value
changed[id] = m._previousAttributes.value;
} else if (_.isEqual(m.get('value'), changed[id])) {
// Remove unchanged models.
delete changed[id];
}
});
/*
* Function: renderPreferencePanel
*
* Renders the preference panel in the content div based on the given
* preferences.
*/
var renderPreferencePanel = function(prefs) {
/*
* Clear the existing html in the preferences content
*/
var content = $container.find('.preferences_content');
/*
* We should clean up the existing controls.
*/
if (controls) {
_.each(controls, function(c) {
if ('$sel' in c) {
if (c.$sel.data('select2').isOpen()) c.$sel.data('select2').close();
}
c.remove();
});
}
content.empty();
controls = [];
/*
* Preference Model
*
* This model will be used to keep tracking of the changes done for
* an individual option.
* We will create new set of controls and render it based on the
* list of preferences using the Backform Field, Control.
*/
var PreferenceModel = Backbone.Model.extend({
idAttribute: 'id',
defaults: {
id: undefined,
value: undefined
}
_.each(prefs, function(p) {
var m = preferences.get(p.id);
m.errorModel = new Backbone.Model();
var f = new Backform.Field(
_.extend({}, p, {
id: 'value',
name: 'value',
})
),
cntr = new(f.get('control'))({
field: f,
model: m,
});
content.append(cntr.render().$el);
// We will keep track of all the controls rendered at the
// moment.
controls.push(cntr);
});
/*
* Preferences Collection object.
*
* We will use only one collection object to keep track of all the
* preferences.
*/
var changed = {},
preferences = this.preferences = new (Backbone.Collection.extend({
model: PreferenceModel,
url: url_for('preferences.index'),
updateAll: function() {
var cnt = 0;
// We will send only the modified data to the server.
for (var key in changed) {
this.get(key).save();
}
};
return true;
}
}))(null);
/*
* Function: dialogContentCleanup
*
* Do the dialog container cleanup on openning.
*/
preferences.on('reset', function() {
// Reset the changed variables
changed = {};
});
var dialogContentCleanup = function() {
// Remove the existing preferences
if (!jTree)
return;
preferences.on('change', function(m) {
var id = m.get('id');
if (!(id in changed)) {
// Keep track of the original value
changed[id] = m._previousAttributes.value;
} else if (_.isEqual(m.get('value'), changed[id])) {
// Remove unchanged models.
delete changed[id];
}
});
/*
* Function: renderPreferencePanel
*
* Renders the preference panel in the content div based on the given
* preferences.
*/
var renderPreferencePanel = function(prefs) {
/*
* Clear the existing html in the preferences content
* Remove the aci-tree (mainly to remove the jquery object of
* aciTree from the system for this container).
*/
var content = $container.find('.preferences_content');
try {
jTree.aciTree('destroy');
} catch (ex) {
// Sometimes - it fails to destroy the tree properly and throws
// exception.
console.warn(ex.stack || ex);
}
jTree.off('acitree', treeEventHandler);
// We need to reset the data from the preferences too
preferences.reset();
/*
* We should clean up the existing controls.
* Clean up the existing controls.
*/
if (controls) {
_.each(controls, function(c) {
if ('$sel' in c) {
if (c.$sel.data('select2').isOpen()) c.$sel.data('select2').close();
}
c.remove();
});
}
content.empty();
controls = [];
/*
* We will create new set of controls and render it based on the
* list of preferences using the Backform Field, Control.
*/
_.each(prefs, function(p) {
var m = preferences.get(p.id);
m.errorModel = new Backbone.Model();
var f = new Backform.Field(
_.extend({}, p, {id: 'value', name: 'value'})
),
cntr = new (f.get("control")) ({
field: f,
model: m
});
content.append(cntr.render().$el);
// We will keep track of all the controls rendered at the
// moment.
controls.push(cntr);
});
};
// Remove all the objects now.
$container.empty();
},
/*
* Function: dialogContentCleanup
* Function: selectFirstCategory
*
* Do the dialog container cleanup on openning.
* Whenever a user select a module instead of a category, we should
* select the first categroy of it.
*/
selectFirstCategory = function(api, item) {
var data = item ? api.itemData(item) : null;
var dialogContentCleanup = function() {
// Remove the existing preferences
if (!jTree)
return;
/*
* Remove the aci-tree (mainly to remove the jquery object of
* aciTree from the system for this container).
*/
try {
jTreeApi = jTree.aciTree('destroy');
} catch(ex) {
// Sometimes - it fails to destroy the tree properly and throws
// exception.
}
jTree.off('acitree', treeEventHandler);
// We need to reset the data from the preferences too
preferences.reset();
/*
* Clean up the existing controls.
*/
if (controls) {
_.each(controls, function(c) {
c.remove();
});
}
controls = [];
// Remove all the objects now.
$container.empty();
},
/*
* Function: selectFirstCategory
*
* Whenever a user select a module instead of a category, we should
* select the first categroy of it.
*/
selectFirstCategory = function(api, item) {
var data = item ? api.itemData(item) : null;
if (data && data.preferences) {
api.select(item);
return;
}
item = api.first(item);
selectFirstCategory(api, item);
},
/*
* A map on how to create controls for each datatype in preferences
* dialog.
*/
getControlMappedForType = function(p) {
switch(p.type) {
case 'text':
return 'input';
case 'boolean':
p.options = {
onText: gettext('True'),
offText: gettext('False'),
onColor: 'success',
offColor: 'default',
size: 'mini'
};
return 'switch';
case 'node':
p.options = {
onText: gettext('Show'),
offText: gettext('Hide'),
onColor: 'success',
offColor: 'default',
size: 'mini'
};
return 'switch';
case 'integer':
return 'numeric';
case 'numeric':
return 'numeric';
case 'date':
return 'datepicker';
case 'datetime':
return 'datetimepicker';
case 'options':
var opts = [],
has_value = false;
// Convert the array to SelectControl understandable options.
_.each(p.options, function(o) {
if('label' in o && 'value' in o){
opts.push({'label': o.label, 'value': o.value});
if (o.value == p.value)
has_value = true;
} else {
opts.push({'label': o, 'value': o});
if (o == p.value)
has_value = true;
}
if (data && data.preferences) {
api.select(item);
return;
}
item = api.first(item);
selectFirstCategory(api, item);
},
/*
* A map on how to create controls for each datatype in preferences
* dialog.
*/
getControlMappedForType = function(p) {
switch (p.type) {
case 'text':
return 'input';
case 'boolean':
p.options = {
onText: gettext('True'),
offText: gettext('False'),
onColor: 'success',
offColor: 'default',
size: 'mini',
};
return 'switch';
case 'node':
p.options = {
onText: gettext('Show'),
offText: gettext('Hide'),
onColor: 'success',
offColor: 'default',
size: 'mini',
};
return 'switch';
case 'integer':
return 'numeric';
case 'numeric':
return 'numeric';
case 'date':
return 'datepicker';
case 'datetime':
return 'datetimepicker';
case 'options':
var opts = [],
has_value = false;
// Convert the array to SelectControl understandable options.
_.each(p.options, function(o) {
if ('label' in o && 'value' in o) {
opts.push({
'label': o.label,
'value': o.value,
});
if (p.select2 && p.select2.tags == true && p.value && has_value == false){
opts.push({'label': p.value, 'value': p.value});
}
p.options = opts;
return 'select2';
case 'multiline':
return 'textarea';
case 'switch':
return 'switch';
default:
if (console && console.log) {
// Warning for developer only.
console.log(
"Hmm.. We don't know how to render this type - ''" + type + "' of control."
);
}
return 'input';
}
},
/*
* function: treeEventHandler
*
* It is basically a callback, which listens to aci-tree events,
* and act accordingly.
*
* + Selection of the node will existance of the preferences for
* the selected tree-node, if not pass on to select the first
* category under a module, else pass on to the render function.
*
* + When a new node is added in the tree, it will add the relavent
* preferences in the preferences model collection, which will be
* called during initialization itself.
*
*
*/
treeEventHandler = function(event, api, item, eventName) {
// Look for selected item (if none supplied)!
item = item || api.selected();
// Event tree item has itemData
var d = item ? api.itemData(item) : null;
/*
* boolean (switch/checkbox), string, enum (combobox - enumvals),
* integer (min-max), font, color
*/
switch (eventName) {
case "selected":
if (!d)
return true;
if (d.preferences) {
/*
* Clear the existing html in the preferences content
*/
renderPreferencePanel(d.preferences);
return true;
} else{
selectFirstCategory(api, item);
}
break;
case 'added':
if (!d)
return true;
// We will add the preferences in to the preferences data
// collection.
if (d.preferences && _.isArray(d.preferences)) {
_.each(d.preferences, function(p) {
preferences.add({
'id': p.id, 'value': p.value, 'category_id': d.id,
'mid': d.mid, 'name': p.name,
});
/*
* We don't know until now, how to render the control for
* this preference.
*/
if (!p.control) {
p.control = getControlMappedForType(p);
}
if (p.help_str) {
p.helpMessage = p.help_str;
}
});
}
d.sortable = false;
break;
case 'loaded':
// Let's select the first category from the prefrences.
// We need to wait for sometime before all item gets loaded
// properly.
setTimeout(
function() {
selectFirstCategory(api, null);
}, 300);
break;
}
return true;
};
// Dialog property
return {
main: function() {
// Remove the existing content first.
dialogContentCleanup();
$container.append(
"<div class='pg-el-xs-3 preferences_tree aciTree'></div>"
).append(
"<div class='pg-el-xs-9 preferences_content'>" +
gettext('Category is not selected.') +
"</div>"
);
// Create the aci-tree for listing the modules and categories of
// it.
jTree = $container.find('.preferences_tree');
jTree.on('acitree', treeEventHandler);
jTree.aciTree({
selectable: true,
expand: true,
ajax: {
url: url_for('preferences.index')
if (o.value == p.value)
has_value = true;
} else {
opts.push({
'label': o,
'value': o,
});
if (o == p.value)
has_value = true;
}
});
this.show();
},
setup: function() {
return {
buttons:[{
text: '', key: 112,
className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs:{
name:'dialog_help', type:'button',
label: gettext('Preferences'),
url: url_for(
'help.static', {'filename': 'preferences.html'}
)
}
},{
text: gettext('OK'), key: 13, className: "btn btn-primary fa fa-lg fa-save pg-alertify-button"
},{
text: gettext('Cancel'), key: 27, className: "btn btn-danger fa fa-lg fa-times pg-alertify-button"
}],
focus: { element: 0 },
options: {
padding: !1,
overflow: !1,
title: gettext('Preferences'),
closableByDimmer: false,
modal:false,
pinnable: false
}
};
},
callback: function(e) {
if (e.button.element.name == "dialog_help") {
e.cancel = true;
pgBrowser.showHelp(e.button.element.name, e.button.element.getAttribute('url'),
null, null, e.button.element.getAttribute('label'));
return;
}
if (e.button.text == gettext('OK')){
preferences.updateAll();
// Refresh preferences cache
setTimeout(pgBrowser.cache_preferences(), 2000);
if (p.select2 && p.select2.tags == true && p.value && has_value == false) {
opts.push({
'label': p.value,
'value': p.value,
});
}
},
build: function() {
this.elements.content.appendChild($container.get(0));
alertify.pgDialogBuild.apply(this)
},
hooks: {
onshow: function() {
$(this.elements.body).addClass('pgadmin-preference-body');
p.options = opts;
return 'select2';
case 'multiline':
return 'textarea';
case 'switch':
return 'switch';
default:
if (console && console.warn) {
// Warning for developer only.
console.warn(
'Hmm.. We don\'t know how to render this type - \'\'' + p.type + '\' of control.'
);
}
return 'input';
}
},
/*
* function: treeEventHandler
*
* It is basically a callback, which listens to aci-tree events,
* and act accordingly.
*
* + Selection of the node will existance of the preferences for
* the selected tree-node, if not pass on to select the first
* category under a module, else pass on to the render function.
*
* + When a new node is added in the tree, it will add the relavent
* preferences in the preferences model collection, which will be
* called during initialization itself.
*
*
*/
treeEventHandler = function(event, api, item, eventName) {
// Look for selected item (if none supplied)!
item = item || api.selected();
// Event tree item has itemData
var d = item ? api.itemData(item) : null;
/*
* boolean (switch/checkbox), string, enum (combobox - enumvals),
* integer (min-max), font, color
*/
switch (eventName) {
case 'selected':
if (!d)
return true;
if (d.preferences) {
/*
* Clear the existing html in the preferences content
*/
renderPreferencePanel(d.preferences);
return true;
} else {
selectFirstCategory(api, item);
}
break;
case 'added':
if (!d)
return true;
// We will add the preferences in to the preferences data
// collection.
if (d.preferences && _.isArray(d.preferences)) {
_.each(d.preferences, function(p) {
preferences.add({
'id': p.id,
'value': p.value,
'category_id': d.id,
'mid': d.mid,
'name': p.name,
});
/*
* We don't know until now, how to render the control for
* this preference.
*/
if (!p.control) {
p.control = getControlMappedForType(p);
}
if (p.help_str) {
p.helpMessage = p.help_str;
}
});
}
d.sortable = false;
break;
case 'loaded':
// Let's select the first category from the prefrences.
// We need to wait for sometime before all item gets loaded
// properly.
setTimeout(
function() {
selectFirstCategory(api, null);
}, 300);
break;
}
return true;
};
});
},
show: function() {
alertify.preferencesDlg(true).resizeTo('60%', '60%');
}
};
// Dialog property
return {
main: function() {
return pgAdmin.Preferences;
});
// Remove the existing content first.
dialogContentCleanup();
$container.append(
'<div class=\'pg-el-xs-3 preferences_tree aciTree\'></div>'
).append(
'<div class=\'pg-el-xs-9 preferences_content\'>' +
gettext('Category is not selected.') +
'</div>'
);
// Create the aci-tree for listing the modules and categories of
// it.
jTree = $container.find('.preferences_tree');
jTree.on('acitree', treeEventHandler);
jTree.aciTree({
selectable: true,
expand: true,
ajax: {
url: url_for('preferences.index'),
},
});
this.show();
},
setup: function() {
return {
buttons: [{
text: '',
key: 112,
className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs: {
name: 'dialog_help',
type: 'button',
label: gettext('Preferences'),
url: url_for(
'help.static', {
'filename': 'preferences.html',
}
),
},
}, {
text: gettext('OK'),
key: 13,
className: 'btn btn-primary fa fa-lg fa-save pg-alertify-button',
}, {
text: gettext('Cancel'),
key: 27,
className: 'btn btn-danger fa fa-lg fa-times pg-alertify-button',
}],
focus: {
element: 0,
},
options: {
padding: !1,
overflow: !1,
title: gettext('Preferences'),
closableByDimmer: false,
modal: false,
pinnable: false,
},
};
},
callback: function(e) {
if (e.button.element.name == 'dialog_help') {
e.cancel = true;
pgBrowser.showHelp(e.button.element.name, e.button.element.getAttribute('url'),
null, null, e.button.element.getAttribute('label'));
return;
}
if (e.button.text == gettext('OK')) {
preferences.updateAll();
// Refresh preferences cache
setTimeout(pgBrowser.cache_preferences(), 2000);
}
},
build: function() {
this.elements.content.appendChild($container.get(0));
Alertify.pgDialogBuild.apply(this);
},
hooks: {
onshow: function() {
$(this.elements.body).addClass('pgadmin-preference-body');
},
},
};
});
},
show: function() {
Alertify.preferencesDlg(true).resizeTo('60%', '60%');
},
};
return pgAdmin.Preferences;
});

View File

@ -1,59 +1,59 @@
define('pgadmin.settings',
[
'jquery', 'alertify', 'sources/pgadmin', 'underscore', 'backform',
'sources/gettext', 'sources/url_for', 'pgadmin.backform'
],
define('pgadmin.settings', [
'jquery', 'pgadmin.alertifyjs', 'sources/pgadmin',
'sources/gettext', 'sources/url_for', 'pgadmin.backform',
], function($, Alertify, pgAdmin, gettext, url_for) {
// This defines the Preference/Options Dialog for pgAdmin IV.
function($, alertify, pgAdmin, _, Backform, gettext, url_for) {
pgAdmin = pgAdmin || window.pgAdmin || {};
/*
* Hmm... this module is already been initialized, we can refer to the old
* object from here.
*/
if (pgAdmin.Settings)
return pgAdmin.Settings;
pgAdmin.Settings = {
init: function() {
if (this.initialized)
return;
this.initialized = true;
},
// We will force unload method to not to save current layout
// and reload the window
show: function() {
var obj = this;
alertify.confirm(gettext('Reset layout'),
gettext('Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost.'),
function() {
var reloadingIndicator = $('<div id="reloading-indicator"></div>');
$('body').append(reloadingIndicator);
// Delete the record from database as well, then only reload page
$.ajax({
url: url_for('settings.reset_layout'),
type: 'DELETE',
async: false,
success: function() {
// Prevent saving layout on server for next page reload.
$(window).unbind('unload');
window.onbeforeunload = null;
// Now reload page
location.reload(true);
},
error: function() {
console.log('Something went wrong on server while resetting layout');
}
});
},
function() {
// Do nothing as user canceled the operation.
}
);
}
};
pgAdmin = pgAdmin || window.pgAdmin || {};
/*
* Hmm... this module is already been initialized, we can refer to the old
* object from here.
*/
if (pgAdmin.Settings)
return pgAdmin.Settings;
});
pgAdmin.Settings = {
init: function() {
if (this.initialized)
return;
this.initialized = true;
},
// We will force unload method to not to save current layout
// and reload the window
show: function() {
Alertify.confirm(gettext('Reset layout'),
gettext('Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost.'),
function() {
var reloadingIndicator = $('<div id="reloading-indicator"></div>');
$('body').append(reloadingIndicator);
// Delete the record from database as well, then only reload page
$.ajax({
url: url_for('settings.reset_layout'),
type: 'DELETE',
async: false,
success: function() {
// Prevent saving layout on server for next page reload.
$(window).unbind('unload');
window.onbeforeunload = null;
// Now reload page
location.reload(true);
},
error: function() {
console.warn(
'Something went wrong on server while resetting layout.'
);
},
});
},
function() {
// Do nothing as user canceled the operation.
}
);
},
};
return pgAdmin.Settings;
});

View File

@ -1,135 +1,138 @@
define(
['sources/gettext', 'alertify', 'underscore.string'],
function(gettext, alertify, S) {
alertify.defaults.transition = "zoom";
alertify.defaults.theme.ok = "btn btn-primary";
alertify.defaults.theme.cancel = "btn btn-danger";
alertify.defaults.theme.input = "form-control";
define([
'sources/gettext', 'alertify', 'jquery',
], function(gettext, alertify, $) {
alertify.defaults.transition = 'zoom';
alertify.defaults.theme.ok = 'btn btn-primary';
alertify.defaults.theme.cancel = 'btn btn-danger';
alertify.defaults.theme.input = 'form-control';
alertify.pgIframeDialog || alertify.dialog('pgIframeDialog', function() {
var iframe;
return {
// dialog constructor function, this will be called when the user calls
// alertify.pgIframeDialog(message)
main:function(message){
//set the videoId setting and return current instance for chaining.
return this.set({
'pg_msg': message
});
},
// we only want to override two options (padding and overflow).
setup: function(){
return {
options:{
//disable both padding and overflow control.
padding : !1,
overflow: !1,
}
};
},
// This will be called once the DOM is ready and will never be invoked
// again. Here we create the iframe to embed the video.
build:function() {
// create the iframe element
iframe = document.createElement('iframe');
// dialog constructor function, this will be called when the user calls
// alertify.pgIframeDialog(message)
main: function(message) {
//set the videoId setting and return current instance for chaining.
return this.set({
'pg_msg': message,
});
},
// we only want to override two options (padding and overflow).
setup: function() {
return {
options: {
//disable both padding and overflow control.
padding: !1,
overflow: !1,
},
};
},
// This will be called once the DOM is ready and will never be invoked
// again. Here we create the iframe to embed the video.
build: function() {
// create the iframe element
iframe = document.createElement('iframe');
iframe.src = "";
iframe.frameBorder = "no";
iframe.width = "100%";
iframe.height = "100%";
iframe.src = '';
iframe.frameBorder = 'no';
iframe.width = '100%';
iframe.height = '100%';
// add it to the dialog
this.elements.content.appendChild(iframe);
// add it to the dialog
this.elements.content.appendChild(iframe);
//give the dialog initial height (half the screen height).
this.elements.body.style.minHeight = screen.height * .5 + 'px';
},
// dialog custom settings
settings:{
pg_msg: undefined
},
// listen and respond to changes in dialog settings.
settingUpdated: function(key, oldValue, newValue){
switch(key){
case 'pg_msg':
var doc = iframe.contentWindow || iframe.contentDocument;
if (doc.document) {
doc = doc.document;
}
//give the dialog initial height (half the screen height).
this.elements.body.style.minHeight = screen.height * .5 + 'px';
},
// dialog custom settings
settings: {
pg_msg: undefined,
},
// listen and respond to changes in dialog settings.
settingUpdated: function(key, oldValue, newValue) {
switch (key) {
case 'pg_msg':
var doc = iframe.contentWindow || iframe.contentDocument;
if (doc.document) {
doc = doc.document;
}
doc.open();
doc.write(newValue);
doc.close();
doc.open();
doc.write(newValue);
doc.close();
break;
}
},
// listen to internal dialog events.
hooks: {
// triggered when a dialog option gets update.
// warning! this will not be triggered for settings updates.
onupdate: function(option,oldValue, newValue){
switch(option){
case 'resizable':
if(newValue){
this.elements.content.removeAttribute('style');
iframe && iframe.removeAttribute('style');
}else{
this.elements.content.style.minHeight = 'inherit';
iframe && (iframe.style.minHeight = 'inherit');
}
break;
}
}
break;
}
},
// listen to internal dialog events.
hooks: {
// triggered when a dialog option gets update.
// warning! this will not be triggered for settings updates.
onupdate: function(option, oldValue, newValue) {
switch (option) {
case 'resizable':
if (newValue) {
this.elements.content.removeAttribute('style');
iframe && iframe.removeAttribute('style');
} else {
this.elements.content.style.minHeight = 'inherit';
iframe && (iframe.style.minHeight = 'inherit');
}
break;
}
},
},
};
});
alertify.pgNotifier = function(type, xhr, promptmsg, onJSONResult) {
var msg = xhr.responseText,
contentType = xhr.getResponseHeader('Content-Type');
var msg = xhr.responseText,
contentType = xhr.getResponseHeader('Content-Type');
if (xhr.status == 0) {
msg = gettext('Connection to the server has been lost.');
promptmsg = gettext('Connection Lost');
} else {
if (contentType) {
try {
if (contentType.indexOf('application/json') == 0) {
var resp = $.parseJSON(msg);
if (xhr.status == 0) {
msg = gettext('Connection to the server has been lost.');
promptmsg = gettext('Connection Lost');
} else {
if (contentType) {
try {
if (contentType.indexOf('application/json') == 0) {
var resp = $.parseJSON(msg);
if (resp.result != null && (!resp.errormsg || resp.errormsg == '') &&
onJSONResult && typeof(onJSONResult) == 'function') {
return onJSONResult(resp.result);
}
msg = _.escape(resp.result) || _.escape(resp.errormsg) || "Unknown error";
if (resp.result != null && (!resp.errormsg || resp.errormsg == '') &&
onJSONResult && typeof(onJSONResult) == 'function') {
return onJSONResult(resp.result);
}
if (contentType.indexOf('text/html') == 0) {
var alertMessage = promptmsg;
if (type === 'error') {
alertMessage = '\
msg = _.escape(resp.result) || _.escape(resp.errormsg) || 'Unknown error';
}
if (contentType.indexOf('text/html') == 0) {
var alertMessage = promptmsg;
if (type === 'error') {
alertMessage = '\
<div class="media font-red-3 text-14">\
<div class="media-body media-middle">\
<div class="alert-text">' + promptmsg + '</div><br/>\
<div class="alert-text">' + gettext('Click for details.') + '</div>\
</div>\
</div>';
}
alertify.notify(
alertMessage, type, 0, function() {
alertify.pgIframeDialog().show().set({frameless: false}).set(
'pg_msg', msg
);
});
return;
}
} catch (e) {
alertify.alert().show().set('message', e.message).set('title', "Error");
alertify.notify(
alertMessage, type, 0,
function() {
alertify.pgIframeDialog().show().set({
frameless: false,
}).set(
'pg_msg', msg
);
});
return;
}
} catch (e) {
alertify.alert().show().set('message', e.message).set('title', 'Error');
}
}
alertify.alert().show().set(
'message', msg.replace(new RegExp('\r?\n','g'), '<br />')
).set('title', promptmsg);
}
alertify.alert().show().set(
'message', msg.replace(new RegExp(/\r?\n/, 'g'), '<br />')
).set('title', promptmsg);
};
var alertifyDialogResized = function(stop) {
@ -139,14 +142,14 @@ function(gettext, alertify, S) {
self.pgResizeRecursion = false;
}
if(self.pgResizeTimeout) {
if (self.pgResizeTimeout) {
return;
}
self.pgResizeTimeout = setTimeout(
function() {
var $el = $(this.elements.dialog),
w = $el.width();
w = $el.width();
this.pgResizeTimeout = null;
@ -186,7 +189,7 @@ function(gettext, alertify, S) {
alertify.pgDialogBuild = function() {
this.set('onshow', function() {
this.elements.dialog.classList.add('pg-el-container')
this.elements.dialog.classList.add('pg-el-container');
alertifyDialogResized.apply(this, arguments);
});
this.set('onresize', alertifyDialogStartResizing.bind(this, true));
@ -202,23 +205,21 @@ function(gettext, alertify, S) {
return;
}
var msg = xhr.responseText,
contentType = xhr.getResponseHeader('Content-Type'),
msg = xhr.responseText,
jsonResp = contentType &&
contentType.indexOf('application/json') == 0 &&
$.parseJSON(xhr.responseText);
var contentType = xhr.getResponseHeader('Content-Type'),
jsonResp = contentType &&
contentType.indexOf('application/json') == 0 &&
$.parseJSON(xhr.responseText);
if (
jsonResp && (
xhr.status == 503 ? (
jsonResp.info == 'CONNECTION_LOST' &&
'server' in args.info && jsonResp.data.sid >= 0 &&
jsonResp.data.sid == args.info.server._id
'server' in args.info && jsonResp.data.sid >= 0 &&
jsonResp.data.sid == args.info.server._id
) : (
xhr.status == 428 &&
xhr.status == 428 &&
jsonResp.errormsg &&
jsonResp.errormsg == gettext("Connection to the server has been lost.")
jsonResp.errormsg == gettext('Connection to the server has been lost.')
)
)
) {
@ -231,60 +232,60 @@ function(gettext, alertify, S) {
// Check the status of the maintenance server connection.
var server = pgBrowser.Nodes['server'],
ctx = {
resp: jsonResp,
xhr: xhr,
args: args
},
reconnectServer = function() {
var ctx = this,
onServerConnect = function(_sid, _i, _d) {
// Yay - server is reconnected.
if (this.args.info.server._id == _sid) {
pgBrowser.Events.off(
'pgadmin:server:connected', onServerConnect
);
pgBrowser.Events.off(
'pgadmin:server:connect:cancelled', onConnectCancel
);
ctx = {
resp: jsonResp,
xhr: xhr,
args: args,
},
reconnectServer = function() {
var ctx = this,
onServerConnect = function(_sid, _i, _d) {
// Yay - server is reconnected.
if (this.args.info.server._id == _sid) {
pgBrowser.Events.off(
'pgadmin:server:connected', onServerConnect
);
pgBrowser.Events.off(
'pgadmin:server:connect:cancelled', onConnectCancel
);
// Do we need to connect the disconnected server now?
if (
this.resp.data.database &&
this.resp.data.database != _d.db
) {
// Server is connected now, we will need to inform the
// database to connect it now.
pgBrowser.Events.trigger(
'pgadmin:database:connection:lost', this.args.item,
this.resp, true
);
}
}
}.bind(ctx),
onConnectCancel = function(_sid, _item, _data) {
// User has cancelled the operation in between.
if (_sid == this.args.info.server.id) {
pgBrowser.Events.off('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.off('pgadmin:server:connect:cancelled', onConnectCancel);
// Do we need to connect the disconnected server now?
if (
this.resp.data.database &&
this.resp.data.database != _d.db
) {
// Server is connected now, we will need to inform the
// database to connect it now.
pgBrowser.Events.trigger(
'pgadmin:database:connection:lost', this.args.item,
this.resp, true
);
}
}
}.bind(ctx),
onConnectCancel = function(_sid, _item, _data) {
// User has cancelled the operation in between.
if (_sid == this.args.info.server.id) {
pgBrowser.Events.off('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.off('pgadmin:server:connect:cancelled', onConnectCancel);
// Connection to the database will also be cancelled
pgBrowser.Events.trigger(
'pgadmin:database:connect:cancelled', _sid,
this.resp.data.database || _data.db, _item, _data
);
}
}.bind(ctx);
// Connection to the database will also be cancelled
pgBrowser.Events.trigger(
'pgadmin:database:connect:cancelled', _sid,
this.resp.data.database || _data.db, _item, _data
);
}
}.bind(ctx);
pgBrowser.Events.on('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.on('pgadmin:server:connect:cancelled', onConnectCancel);
pgBrowser.Events.on('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.on('pgadmin:server:connect:cancelled', onConnectCancel);
// Connection to the server has been lost, we need to inform the
// server first to take the action first.
pgBrowser.Events.trigger(
'pgadmin:server:connection:lost', this.args.item, this.resp
);
}.bind(ctx);
// Connection to the server has been lost, we need to inform the
// server first to take the action first.
pgBrowser.Events.trigger(
'pgadmin:server:connection:lost', this.args.item, this.resp
);
}.bind(ctx);
$.ajax({
url: server.generate_url(
@ -309,7 +310,7 @@ function(gettext, alertify, S) {
},
error: function() {
reconnectServer();
}
},
});
return true;
}
@ -317,18 +318,19 @@ function(gettext, alertify, S) {
};
var alertifySuccess = alertify.success,
alertifyError = alertify.error;
alertifyError = alertify.error;
/*
For adding the jasmine test cases, we needed to refer the original success,
and error functions, as orig_success and orig_error respectively.
*/
_.extend(alertify, {
orig_success: alertifySuccess, orig_error: alertifyError
orig_success: alertifySuccess,
orig_error: alertifyError,
});
_.extend(alertify, {
success: function (message, timeout, callback) {
success: function(message, timeout, callback) {
var alertMessage = '\
<div class="media font-green-3 text-14">\
<div class="media-body media-middle">\
@ -364,7 +366,7 @@ function(gettext, alertify, S) {
</div>';
var alert = alertify.notify(alertMessage, timeout);
return alert;
}
},
});
return alertify;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -18,27 +18,27 @@ define(['jquery', 'underscore', 'underscore.string'],
// Target actual node instead of collection.
// If node is disabled then there is no meaning of
// adding collection node menu
if(S.startsWith(node_type, "coll-")) {
node_type = node_type.replace("coll-", "")
if(S.startsWith(node_type, 'coll-')) {
node_type = node_type.replace('coll-', '');
}
// Exclude non-applicable nodes
var nodes_not_supported = [
"server_group", "server", "catalog_object_column"
'server_group', 'server', 'catalog_object_column',
];
if(_.indexOf(nodes_not_supported, node_type) >= 0) {
return true;
}
var preference = pgBrowser.get_preference("browser", 'show_node_'+node_type);
var preference = pgBrowser.get_preference('browser', 'show_node_'+node_type);
if (preference) {
return preference.value
return preference.value;
}
else {
return true;
}
}
};
return check_node_visibility;
});
return check_node_visibility;
});

View File

@ -1,37 +1,47 @@
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["codemirror"], mod);
if (typeof exports == 'object' && typeof module == 'object') // CommonJS
mod(require('codemirror'));
else if (typeof define == 'function' && define.amd) // AMD
define(['codemirror'], mod);
else // Plain browser env
mod(CodeMirror);
mod(window.CodeMirror);
})(function(CodeMirror) {
"use strict";
'use strict';
CodeMirror.pgadminKeywordRangeFinder = function(cm, start, startTkn, endTkn) {
var line = start.line, lineText = cm.getLine(line);
var at = lineText.length, startChar, tokenType;
var line = start.line,
lineText = cm.getLine(line);
var at = lineText.length,
startChar, tokenType;
for (; at > 0;) {
var found = lineText.lastIndexOf(startTkn, at);
var startToken = startTkn;
var endToken = endTkn;
if (found < start.ch) {
var found = lineText.lastIndexOf("[", at);
found = lineText.lastIndexOf('[', at);
if (found < start.ch) break;
var startToken = '[';
var endToken = ']';
startToken = '[';
endToken = ']';
}
tokenType = cm.getTokenAt(CodeMirror.Pos(line, found + 1)).type;
if (!/^(comment|string)/.test(tokenType)) { startChar = found; break; }
if (!/^(comment|string)/.test(tokenType)) {
startChar = found;
break;
}
at = found - 1;
}
if (startChar == null || lineText.lastIndexOf(startToken) > startChar) return;
var count = 1, lastLine = cm.lineCount(), end, endCh;
var count = 1,
lastLine = cm.lineCount(),
end, endCh;
outer: for (var i = line + 1; i < lastLine; ++i) {
var text = cm.getLine(i), pos = 0;
var text = cm.getLine(i),
pos = 0;
for (;;) {
var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
var nextOpen = text.indexOf(startToken, pos),
nextClose = text.indexOf(endToken, pos);
if (nextOpen < 0) nextOpen = text.length;
if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose);
@ -48,8 +58,10 @@
}
}
if (end == null || end == line + 1) return;
return {from: CodeMirror.Pos(line, startChar + startTkn.length),
to: CodeMirror.Pos(end, endCh)};
return {
from: CodeMirror.Pos(line, startChar + startTkn.length),
to: CodeMirror.Pos(end, endCh),
};
};
CodeMirror.pgadminBeginRangeFinder = function(cm, start) {

View File

@ -1,4 +1,4 @@
define(["translations"], function (translations) {
define(['translations'], function (translations) {
/***
* This method behaves as a drop-in replacement for flask translation rendering.

View File

@ -1,57 +1,95 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define([], factory);
} else if(typeof module !== 'undefined' && module.exports) {
// CommonJS
module.exports = factory();
} else {
// Browser globals
factory();
}
}(function(){
define([], function() {
var pgAdmin = window.pgAdmin = window.pgAdmin || {};
// Reference:
// https://github.com/heygrady/Units/blob/master/Length.min.js
// Changed it to save the function in pgAdmin object.
(function(t,e,o) {"use strict";function r(t,e,r,p){r=r||"width";var n,l,m,c=(e.match(s)||[])[2],f="px"===c?1:d[c+"toPx"],u=/r?em/i;if(f||u.test(c)&&!p)t=f?t:"rem"===c?i:"fontSize"===r?t.parentNode||t:t,f=f||parseFloat(a(t,"fontSize")),m=parseFloat(e)*f;else{n=t.style,l=n[r];try{n[r]=e}catch(x){return 0}m=n[r]?parseFloat(a(t,r)):0,n[r]=l!==o?l:null}return m}function a(t,e){var o,n,i,l,d,c=/^top|bottom/,f=["paddingTop","paddingBottom","borderTop","borderBottom"],u=4;if(o=m?m(t)[e]:(n=t.style["pixel"+e.charAt(0).toUpperCase()+e.slice(1)])?n+"px":"fontSize"===e?r(t,"1em","left",1)+"px":t.currentStyle[e],i=(o.match(s)||[])[2],"%"===i&&p)if(c.test(e)){for(l=(d=t.parentNode||t).offsetHeight;u--;)l-=parseFloat(a(d,f[u]));o=parseFloat(o)/100*l+"px"}else o=r(t,o);else("auto"===o||i&&"px"!==i)&&m?o=0:i&&"px"!==i&&!m&&(o=r(t,o)+"px");return o}var p,n=e.createElement("test"),i=e.documentElement,l=e.defaultView,m=l&&l.getComputedStyle,s=/^(-?[\d+\.\-]+)([a-z]+|%)$/i,d={},c=[1/25.4,1/2.54,1/72,1/6],f=["mm","cm","pt","pc","in","mozmm"],u=6;for(i.appendChild(n),m&&(n.style.marginTop="1%",p="1%"===m(n).marginTop);u--;)d[f[u]+"toPx"]=c[u]?c[u]*d.inToPx:r(n,"1"+f[u]);i.removeChild(n),n=o,t.toPx=r})(pgAdmin, window.document);
(function(t, e, o) {
'use strict';
function r(t, e, r, p) {
r = r || 'width';
var n, l, m, c = (e.match(s) || [])[2],
f = 'px' === c ? 1 : d[c + 'toPx'],
u = /r?em/i;
if (f || u.test(c) && !p) t = f ? t : 'rem' === c ? i : 'fontSize' === r ? t.parentNode || t : t, f = f || parseFloat(a(t, 'fontSize')), m = parseFloat(e) * f;
else {
n = t.style, l = n[r];
try {
n[r] = e;
} catch (x) {
return 0;
}
m = n[r] ? parseFloat(a(t, r)) : 0, n[r] = l !== o ? l : null;
}
return m;
}
function a(t, e) {
var o, n, i, l, d, c = /^top|bottom/,
f = ['paddingTop', 'paddingBottom', 'borderTop', 'borderBottom'],
u = 4;
if (o = m ? m(t)[e] : (n = t.style['pixel' + e.charAt(0).toUpperCase() + e.slice(1)]) ? n + 'px' : 'fontSize' === e ? r(t, '1em', 'left', 1) + 'px' : t.currentStyle[e], i = (o.match(s) || [])[2], '%' === i && p)
if (c.test(e)) {
for (l = (d = t.parentNode || t).offsetHeight; u--;) l -= parseFloat(a(d, f[u]));
o = parseFloat(o) / 100 * l + 'px';
} else o = r(t, o);
else('auto' === o || i && 'px' !== i) && m ? o = 0 : i && 'px' !== i && !m && (o = r(t, o) + 'px');
return o;
}
var p, n = e.createElement('test'),
i = e.documentElement,
l = e.defaultView,
m = l && l.getComputedStyle,
s = /^(-?[\d+\.\-]+)([a-z]+|%)$/i,
d = {},
c = [1 / 25.4, 1 / 2.54, 1 / 72, 1 / 6],
f = ['mm', 'cm', 'pt', 'pc', 'in', 'mozmm'],
u = 6;
for (i.appendChild(n), m && (n.style.marginTop = '1%', p = '1%' === m(n).marginTop); u--;) d[f[u] + 'toPx'] = c[u] ? c[u] * d.inToPx : r(n, '1' + f[u]);
i.removeChild(n), n = o, t.toPx = r;
})(pgAdmin, window.document);
// Reference:
// https://github.com/javve/natural-sort/blob/master/index.js
// Changed it to save the function in pgAdmin object.
pgAdmin.natural_sort = function(a, b, options) {
options = options || {};
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
sre = /(^[ ]*|[ ]*$)/g,
dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
hre = /^0x[0-9a-f]+$/i,
ore = /^0/,
options = options || {},
i = function(s) { return options.insensitive && (''+s).toLowerCase() || ''+s },
// convert all to strings strip whitespace
x = i(a).replace(sre, '') || '',
y = i(b).replace(sre, '') || '',
// chunk/tokenize
xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
// numeric, hex or date detection
xD = parseInt(x.match(hre)) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),
yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
oFxNcL, oFyNcL,
mult = options.desc ? -1 : 1;
sre = /(^[ ]*|[ ]*$)/g,
dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
hre = /^0x[0-9a-f]+$/i,
ore = /^0/,
i = function(s) {
return options.insensitive && ('' + s).toLowerCase() || '' + s;
},
// convert all to strings strip whitespace
x = i(a).replace(sre, '') || '',
y = i(b).replace(sre, '') || '',
// chunk/tokenize
xN = x.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0'),
yN = y.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0'),
// numeric, hex or date detection
xD = parseInt(x.match(hre)) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),
yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
oFxNcL, oFyNcL,
mult = options.desc ? -1 : 1;
// first try and sort Hex codes or Dates
if (yD)
if ( xD < yD ) return -1 * mult;
else if ( xD > yD ) return 1 * mult;
if (xD < yD) return -1 * mult;
else if (xD > yD) return 1 * mult;
// natural sorting through split numeric strings and default strings
for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
for (var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
// handle numeric vs string comparison - number < string - (Kyle Adams)
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL) ? 1 : -1) * mult; }
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) {
return (isNaN(oFxNcL) ? 1 : -1) * mult;
}
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
else if (typeof oFxNcL !== typeof oFyNcL) {
oFxNcL += '';
@ -64,4 +102,4 @@
};
return pgAdmin;
}));
});

View File

@ -2,10 +2,10 @@ define([],
function () {
var sizePrettify = function (rawSize) {
var size = Math.abs(rawSize),
limit = 10 * 1024,
limit2 = limit - 1,
cnt = 0,
sizeUnits = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
limit = 10 * 1024,
limit2 = limit - 1,
cnt = 0,
sizeUnits = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
if (size < limit)
return size + ' ' + sizeUnits[cnt]; // return in bytes format
@ -20,5 +20,5 @@ define([],
}
};
return sizePrettify;
});
return sizePrettify;
});

View File

@ -1,4 +1,4 @@
define(["slickgrid"], function () {
define(['slickgrid'], function () {
var Slick = window.Slick;
return function () {
@ -10,9 +10,9 @@ define(["slickgrid"], function () {
slickEvent.cell,
slickEvent.row,
slickEvent.cell
)
),
]);
});
}
}
};
};
});

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
define([
'sources/selection/copy_data',
'sources/selection/range_selection_helper'
],
'sources/selection/range_selection_helper',
],
function (copyData, RangeSelectionHelper) {
return function handleQueryOutputKeyboardEvent(event, args) {
var KEY_C = 67;
@ -10,7 +10,7 @@ function (copyData, RangeSelectionHelper) {
var isModifierDown = event.ctrlKey || event.metaKey;
var self = this || window;
self.slickgrid = args.grid;
self.csvOptions
self.csvOptions;
if (isModifierDown && modifiedKey == KEY_C) {
copyData.apply(self);
@ -19,5 +19,5 @@ function (copyData, RangeSelectionHelper) {
if (isModifierDown && modifiedKey == KEY_A) {
RangeSelectionHelper.selectAll(self.slickgrid);
}
}
};
});

View File

@ -5,42 +5,40 @@
* @namespace Slick
*/
(function ($) {
(function($) {
// register namespace
$.extend(true, window, {
"Slick": {
"Formatters": {
"JsonString": JsonFormatter,
"Numbers": NumbersFormatter,
"Checkmark": CheckmarkFormatter,
"Text": TextFormatter,
"Binary": BinaryFormatter,
}
}
'Slick': {
'Formatters': {
'JsonString': JsonFormatter,
'Numbers': NumbersFormatter,
'Checkmark': CheckmarkFormatter,
'Text': TextFormatter,
'Binary': BinaryFormatter,
},
},
});
function NullAndDefaultFormatter(row, cell, value, columnDef, dataContext) {
function NullAndDefaultFormatter(row, cell, value, columnDef) {
if (_.isUndefined(value) && columnDef.has_default_val) {
return "<span class='pull-left disabled_cell'>[default]</span>";
}
else if (
return '<span class=\'pull-left disabled_cell\'>[default]</span>';
} else if (
(_.isUndefined(value) && columnDef.not_null) ||
(_.isUndefined(value) || value === null)
) {
return "<span class='pull-left disabled_cell'>[null]</span>";
return '<span class=\'pull-left disabled_cell\'>[null]</span>';
}
return null;
}
function NullAndDefaultNumberFormatter(row, cell, value, columnDef, dataContext) {
function NullAndDefaultNumberFormatter(row, cell, value, columnDef) {
if (_.isUndefined(value) && columnDef.has_default_val) {
return "<span class='pull-right disabled_cell'>[default]</span>";
}
else if (
return '<span class=\'pull-right disabled_cell\'>[default]</span>';
} else if (
(_.isUndefined(value) && columnDef.not_null) ||
(_.isUndefined(value) || value === null)
) {
return "<span class='pull-right disabled_cell'>[null]</span>";
return '<span class=\'pull-right disabled_cell\'>[null]</span>';
}
return null;
}
@ -52,18 +50,18 @@
return data;
} else {
// Stringify only if it's json object
if (typeof value === "object" && !Array.isArray(value)) {
if (typeof value === 'object' && !Array.isArray(value)) {
return _.escape(JSON.stringify(value));
} else if (Array.isArray(value)) {
var temp = [];
$.each(value, function(i, val) {
if (typeof val === "object") {
if (typeof val === 'object') {
temp.push(JSON.stringify(val));
} else {
temp.push(val)
temp.push(val);
}
});
return _.escape("[" + temp.join() + "]")
return _.escape('[' + temp.join() + ']');
} else {
return _.escape(value);
}
@ -76,7 +74,7 @@
if (data) {
return data;
} else {
return "<span style='float:right'>" + _.escape(value) + "</span>";
return '<span style=\'float:right\'>' + _.escape(value) + '</span>';
}
}
@ -90,7 +88,7 @@
if (data) {
return data;
} else {
return value ? "true" : "false";
return value ? 'true' : 'false';
}
}
@ -110,7 +108,7 @@
if (data) {
return data;
} else {
return "<span class='pull-left disabled_cell'>[" + _.escape(value) + "]</span>";
return '<span class=\'pull-left disabled_cell\'>[' + _.escape(value) + ']</span>';
}
}
})(jQuery);
})(window.jQuery);

View File

@ -77,5 +77,5 @@ module.exports = {
isKeyCtrlAlt: isKeyCtrlAlt,
isKeyAltShift: isKeyAltShift,
isKeyCtrlShift: isKeyCtrlShift,
isKeyCtrlAltShift: isKeyCtrlAltShift
isKeyCtrlAltShift: isKeyCtrlAltShift,
};

View File

@ -16,19 +16,19 @@ define(['jquery'],
*/
epicRandomString: function(length) {
var s = [];
var hexDigits = "0123456789abcdef";
var hexDigits = '0123456789abcdef';
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(
s[i] = hexDigits.substr(
Math.floor(Math.random() * 0x10), 1
);
}
// bits 12-15 of the time_hi_and_version field to 0010
s[14] = "4";
s[14] = '4';
// bits 6-7 of the clock_seq_hi_and_reserved to 01
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
s[8] = s[13] = s[18] = s[23] = "-";
s[8] = s[13] = s[18] = s[23] = '-';
var uuid = s.join("");
var uuid = s.join('');
return uuid.replace(/-/g, '').substr(0, length);
},
@ -55,7 +55,7 @@ define(['jquery'],
},
capitalizeFirstLetter: function (string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
},
};
return sqlEditorUtils;
});
});

View File

@ -1,4 +1,4 @@
define(["pgadmin.browser.endpoints"], function (endpoints) {
define(['pgadmin.browser.endpoints'], function(endpoints) {
/***
* This method behaves as a drop-in replacement for flask url_for function.
* It uses the exposed URLs file under the hood, and replace the substitions provided by the modules.
@ -16,17 +16,15 @@ define(["pgadmin.browser.endpoints"], function (endpoints) {
var rawURL = endpoints[endpoint];
// captures things of the form <path:substitutionName>
var substitutionGroupsRegExp = /([<])([^:^>]*:)?([^>]+)([>])/g;
var matchFound;
var interpolated = rawURL;
var substitutionGroupsRegExp = /([<])([^:^>]*:)?([^>]+)([>])/g,
interpolated = rawURL;
if (!rawURL)
return rawURL;
interpolated = interpolated.replace(
substitutionGroupsRegExp,
function (_origin, _1, _2, substitutionName) {
function(_origin, _1, _2, substitutionName) {
if (substitutionName in substitutions) {
return substitutions[substitutionName];
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,456 +1,554 @@
define([
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'alertify',
'sources/pgadmin', 'pgadmin.browser', 'backbone', 'backgrid', 'codemirror',
'backform', 'pgadmin.tools.debugger.ui', 'wcdocker', 'pgadmin.backform',
'pgadmin.backgrid', 'pgadmin.browser.frame'
], function(gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid, CodeMirror, Backform, get_function_arguments) {
pgAdmin = pgAdmin || window.pgAdmin || {};
var pgTools = pgAdmin.Tools = pgAdmin.Tools || {};
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'alertify', 'sources/pgadmin', 'pgadmin.browser',
'backbone', 'pgadmin.backgrid', 'codemirror', 'pgadmin.backform',
'pgadmin.tools.debugger.ui', 'wcdocker', 'pgadmin.browser.frame',
], function(
gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
CodeMirror, Backform, get_function_arguments
) {
var pgTools = pgAdmin.Tools = pgAdmin.Tools || {},
wcDocker = window.wcDocker;
/* Return back, this has been called more than once */
if (pgAdmin.Tools.Debugger)
return pgAdmin.Tools.Debugger;
pgTools.Debugger = {
init: function() {
// We do not want to initialize the module multiple times.
if (this.initialized)
return;
init: function() {
// We do not want to initialize the module multiple times.
if (this.initialized)
return;
this.initialized = true;
this.initialized = true;
// Initialize the context menu to display the debugging options when user open the context menu for functions
pgBrowser.add_menus([{
name: 'direct_debugger', node: 'function', module: this,
applies: ['object', 'context'], callback: 'get_function_information',
category: gettext('Debugging'), priority: 10, label: gettext('Debug'),
data: {object: 'function'}, icon: 'fa fa-arrow-circle-right',
enable: 'can_debug'
},{
name: 'global_debugger', node: 'function', module: this,
applies: ['object', 'context'], callback: 'check_func_debuggable',
category: gettext('Debugging'), priority: 10, label: gettext('Set breakpoint'),
data: {object: 'function', debug_type: 'indirect'},
icon: 'fa fa-arrow-circle-right', enable: 'can_debug'
},{
name: 'procedure_direct_debugger', node: 'procedure', module: this,
applies: ['object', 'context'], callback: 'get_function_information',
category: gettext('Debugging'), priority: 10, label: gettext('Debug'),
data: {object: 'procedure'}, icon: 'fa fa-arrow-circle-right',
enable: 'can_debug'
}, {
name: 'procedure_indirect_debugger', node: 'procedure', module: this,
applies: ['object', 'context'], callback: 'check_func_debuggable',
category: gettext('Debugging'), priority: 10, label: gettext('Set breakpoint'),
data: {object: 'procedure', debug_type: 'indirect'},
icon: 'fa fa-arrow-circle-right', enable: 'can_debug'
}, {
name: 'trigger_function_indirect_debugger', node: 'trigger_function', module: this,
applies: ['object', 'context'], callback: 'check_func_debuggable',
priority: 10, label: gettext('Set breakpoint'), category: gettext('Debugging'),
icon: 'fa fa-arrow-circle-right',
data: {object:'trigger_function', debug_type: 'indirect'}, enable: 'can_debug'
}, {
name: 'trigger_indirect_debugger', node: 'trigger', module: this,
applies: ['object', 'context'], callback: 'check_func_debuggable',
priority: 10, label: gettext('Set breakpoint'), category: gettext('Debugging'),
icon: 'fa fa-arrow-circle-right',
data: {object:'trigger', debug_type: 'indirect'}, enable: 'can_debug'
}, {
name: 'package_function_direct_debugger', node: 'edbfunc', module: this,
applies: ['object', 'context'], callback: 'get_function_information',
category: gettext('Debugging'), priority: 10, label: gettext('Debug'),
data: {object: 'edbfunc'}, icon: 'fa fa-arrow-circle-right',
enable: 'can_debug'
},{
name: 'package_function_global_debugger', node: 'edbfunc', module: this,
applies: ['object', 'context'], callback: 'check_func_debuggable',
category: gettext('Debugging'), priority: 10, label: gettext('Set breakpoint'),
data: {object: 'edbfunc', debug_type: 'indirect'},
icon: 'fa fa-arrow-circle-right', enable: 'can_debug'
},{
name: 'package_procedure_direct_debugger', node: 'edbproc', module: this,
applies: ['object', 'context'], callback: 'get_function_information',
category: gettext('Debugging'), priority: 10, label: gettext('Debug'),
data: {object: 'edbproc'}, icon: 'fa fa-arrow-circle-right',
enable: 'can_debug'
}, {
name: 'package_procedure_global_debugger', node: 'edbproc', module: this,
applies: ['object', 'context'], callback: 'check_func_debuggable',
category: gettext('Debugging'), priority: 10, label: gettext('Set breakpoint'),
data: {object: 'edbproc', debug_type: 'indirect'},
icon: 'fa fa-arrow-circle-right', enable: 'can_debug'
}]);
// Initialize the context menu to display the debugging options when user open the context menu for functions
pgBrowser.add_menus([{
name: 'direct_debugger',
node: 'function',
module: this,
applies: ['object', 'context'],
callback: 'get_function_information',
category: gettext('Debugging'),
priority: 10,
label: gettext('Debug'),
data: {
object: 'function',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}, {
name: 'global_debugger',
node: 'function',
module: this,
applies: ['object', 'context'],
callback: 'check_func_debuggable',
category: gettext('Debugging'),
priority: 10,
label: gettext('Set breakpoint'),
data: {
object: 'function',
debug_type: 'indirect',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}, {
name: 'procedure_direct_debugger',
node: 'procedure',
module: this,
applies: ['object', 'context'],
callback: 'get_function_information',
category: gettext('Debugging'),
priority: 10,
label: gettext('Debug'),
data: {
object: 'procedure',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}, {
name: 'procedure_indirect_debugger',
node: 'procedure',
module: this,
applies: ['object', 'context'],
callback: 'check_func_debuggable',
category: gettext('Debugging'),
priority: 10,
label: gettext('Set breakpoint'),
data: {
object: 'procedure',
debug_type: 'indirect',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}, {
name: 'trigger_function_indirect_debugger',
node: 'trigger_function',
module: this,
applies: ['object', 'context'],
callback: 'check_func_debuggable',
priority: 10,
label: gettext('Set breakpoint'),
category: gettext('Debugging'),
icon: 'fa fa-arrow-circle-right',
data: {
object: 'trigger_function',
debug_type: 'indirect',
},
enable: 'can_debug',
}, {
name: 'trigger_indirect_debugger',
node: 'trigger',
module: this,
applies: ['object', 'context'],
callback: 'check_func_debuggable',
priority: 10,
label: gettext('Set breakpoint'),
category: gettext('Debugging'),
icon: 'fa fa-arrow-circle-right',
data: {
object: 'trigger',
debug_type: 'indirect',
},
enable: 'can_debug',
}, {
name: 'package_function_direct_debugger',
node: 'edbfunc',
module: this,
applies: ['object', 'context'],
callback: 'get_function_information',
category: gettext('Debugging'),
priority: 10,
label: gettext('Debug'),
data: {
object: 'edbfunc',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}, {
name: 'package_function_global_debugger',
node: 'edbfunc',
module: this,
applies: ['object', 'context'],
callback: 'check_func_debuggable',
category: gettext('Debugging'),
priority: 10,
label: gettext('Set breakpoint'),
data: {
object: 'edbfunc',
debug_type: 'indirect',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}, {
name: 'package_procedure_direct_debugger',
node: 'edbproc',
module: this,
applies: ['object', 'context'],
callback: 'get_function_information',
category: gettext('Debugging'),
priority: 10,
label: gettext('Debug'),
data: {
object: 'edbproc',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}, {
name: 'package_procedure_global_debugger',
node: 'edbproc',
module: this,
applies: ['object', 'context'],
callback: 'check_func_debuggable',
category: gettext('Debugging'),
priority: 10,
label: gettext('Set breakpoint'),
data: {
object: 'edbproc',
debug_type: 'indirect',
},
icon: 'fa fa-arrow-circle-right',
enable: 'can_debug',
}]);
// Create and load the new frame required for debugger panel
this.frame = new pgBrowser.Frame({
name: 'frm_debugger',
title: gettext('Debugger'),
width: 500,
isCloseable: true,
isPrivate: true,
icon: 'fa fa-arrow-circle-right',
url: 'about:blank'
});
// Create and load the new frame required for debugger panel
this.frame = new pgBrowser.Frame({
name: 'frm_debugger',
title: gettext('Debugger'),
width: 500,
isCloseable: true,
isPrivate: true,
icon: 'fa fa-arrow-circle-right',
url: 'about:blank',
});
this.frame.load(pgBrowser.docker);
},
// It will check weather the function is actually debuggable or not with pre-required condition.
can_debug: function(itemData, item, data) {
var t = pgBrowser.tree, i = item, d = itemData;
// To iterate over tree to check parent node
while (i) {
if ('catalog' == d._type) {
//Check if we are not child of catalog
return false;
}
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
// Find the function is really available in database
var tree = pgBrowser.tree,
info = tree.selected(),
d_ = info && info.length == 1 ? tree.itemData(info) : undefined,
node = d_ && pgBrowser.Nodes[d_._type];
if (!d_)
this.frame.load(pgBrowser.docker);
},
// It will check weather the function is actually debuggable or not with pre-required condition.
can_debug: function(itemData, item, data) {
var t = pgBrowser.tree,
i = item,
d = itemData;
// To iterate over tree to check parent node
while (i) {
if ('catalog' == d._type) {
//Check if we are not child of catalog
return false;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [info]);
// For indirect debugging user must be super user
if(data && data.debug_type && data.debug_type == 'indirect'
&& !treeInfo.server.user.is_superuser)
return false;
// Fetch object owner
var obj_owner = treeInfo.function && treeInfo.function.funcowner ||
treeInfo.procedure && treeInfo.procedure.funcowner ||
treeInfo.edbfunc && treeInfo.edbfunc.funcowner ||
treeInfo.edbproc && treeInfo.edbproc.funcowner;
// Must be a super user or object owner to create breakpoints of any kind
if (!(treeInfo.server.user.is_superuser || obj_owner == treeInfo.server.user.name))
return false;
// For trigger node, language will be undefined - we should allow indirect debugging for trigger node
if ((d_.language == undefined && d_._type == 'trigger') ||
(d_.language == undefined && d_._type == 'edbfunc') ||
(d_.language == undefined && d_._type == 'edbproc')) {
return true;
}
i = t.hasParent(i) ? t.parent(i) : null;
d = i ? t.itemData(i) : null;
}
if (d_.language != 'plpgsql' && d_.language != 'edbspl') {
return false;
}
// Find the function is really available in database
var tree = pgBrowser.tree,
info = tree.selected(),
d_ = info && info.length == 1 ? tree.itemData(info) : undefined,
node = d_ && pgBrowser.Nodes[d_._type];
if (!d_)
return false;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [info]);
// For indirect debugging user must be super user
if (data && data.debug_type && data.debug_type == 'indirect' &&
!treeInfo.server.user.is_superuser)
return false;
// Fetch object owner
var obj_owner = treeInfo.function && treeInfo.function.funcowner ||
treeInfo.procedure && treeInfo.procedure.funcowner ||
treeInfo.edbfunc && treeInfo.edbfunc.funcowner ||
treeInfo.edbproc && treeInfo.edbproc.funcowner;
// Must be a super user or object owner to create breakpoints of any kind
if (!(treeInfo.server.user.is_superuser || obj_owner == treeInfo.server.user.name))
return false;
// For trigger node, language will be undefined - we should allow indirect debugging for trigger node
if ((d_.language == undefined && d_._type == 'trigger') ||
(d_.language == undefined && d_._type == 'edbfunc') ||
(d_.language == undefined && d_._type == 'edbproc')) {
return true;
},
/*
For the direct debugging, we need to fetch the function information to display in the dialog so "generate_url"
will dynamically generate the URL from the server_id, database_id, schema_id and function id.
*/
generate_url: function(_url, treeInfo, node) {
var url = '{BASEURL}{URL}/{OBJTYPE}{REF}',
ref = '';
}
_.each(
_.sortBy(
_.values(
_.pick(treeInfo,
function(v, k, o) {
if (d_.language != 'plpgsql' && d_.language != 'edbspl') {
return false;
}
return true;
},
/*
For the direct debugging, we need to fetch the function information to display in the dialog so "generate_url"
will dynamically generate the URL from the server_id, database_id, schema_id and function id.
*/
generate_url: function(_url, treeInfo, node) {
var url = '{BASEURL}{URL}/{OBJTYPE}{REF}',
ref = '';
_.each(
_.sortBy(
_.values(
_.pick(treeInfo,
function(v, k) {
return (k != 'server_group');
})
),
function(o) { return o.priority; }
),
function(o) {
ref = S('%s/%s').sprintf(ref, encodeURI(o._id)).value();
return o.priority;
}
),
function(o) {
ref = S('%s/%s').sprintf(ref, encodeURI(o._id)).value();
});
var args = {
'URL': _url,
'BASEURL': url_for('debugger.index'),
'REF': ref,
'OBJTYPE': encodeURI(node.type),
};
return url.replace(/{(\w+)}/g, function(match, arg) {
return args[arg];
});
},
check_func_debuggable: function(args, item) {
var t = pgBrowser.tree,
i = item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]),
_url = this.generate_url('init', treeInfo, node);
var self = this;
$.ajax({
url: _url,
cache: false,
success: function() {
self.start_global_debugger();
},
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
Alertify.alert(gettext('Debugger Error'), err.errormsg);
}
} catch (e) {
console.warn(e.stack || e);
}
},
});
},
//Callback function when user start the indirect debugging ( Listen to another session to invoke the target )
start_global_debugger: function(args, item) {
// Initialize the target and create asynchronous connection and unique transaction ID
var t = pgBrowser.tree,
i = item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]),
baseUrl;
if (d._type == 'function') {
baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.function._id,
}
);
} else if (d._type == 'procedure') {
baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.procedure._id,
}
);
} else if (d._type == 'trigger_function') {
baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.trigger_function._id,
}
);
} else if (d._type == 'trigger' && 'table' in treeInfo) {
baseUrl = url_for(
'debugger.initialize_target_for_trigger', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.table._id,
'tri_id': treeInfo.trigger._id,
}
);
} else if (d._type == 'trigger' && 'view' in treeInfo) {
baseUrl = url_for(
'debugger.initialize_target_for_trigger', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.view._id,
'tri_id': treeInfo.trigger._id,
}
);
}
$.ajax({
url: baseUrl,
method: 'GET',
success: function(res) {
var url = url_for('debugger.direct', {
'trans_id': res.data.debuggerTransId,
});
var args = {
'URL': _url,
'BASEURL': url_for('debugger.index'),
'REF': ref,
'OBJTYPE': encodeURI(node.type)
};
return url.replace(/{(\w+)}/g, function(match, arg) {
return args[arg];
});
},
check_func_debuggable: function(args, item) {
var input = args || {},
t = pgBrowser.tree,
i = item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!d)
return;
var objName = d.label,
treeInfo = node.getTreeNodeHierarchy.apply(node, [i]),
_url = this.generate_url('init', treeInfo, node);
var self = this;
$.ajax({
url: _url,
cache: false,
success: function(res) {
self.start_global_debugger();
},
error: function(xhr, status, error) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
Alertify.alert(gettext('Debugger Error'), err.errormsg);
}
} catch (e) {}
}
});
},
//Callback function when user start the indirect debugging ( Listen to another session to invoke the target )
start_global_debugger: function(args, item) {
// Initialize the target and create asynchronous connection and unique transaction ID
var t = pgBrowser.tree,
i = t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
if (d._type == "function") {
var baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.function._id
}
);
}
else if (d._type == "procedure") {
var baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.procedure._id
}
);
}
else if (d._type == "trigger_function") {
var baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.trigger_function._id
}
);
}
else if (d._type == "trigger" && "table" in treeInfo) {
var baseUrl = url_for(
'debugger.initialize_target_for_trigger', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.table._id,
'tri_id': treeInfo.trigger._id
}
);
}
else if (d._type == "trigger" && "view" in treeInfo) {
var baseUrl = url_for(
'debugger.initialize_target_for_trigger', {
'debug_type': 'indirect',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.view._id,
'tri_id': treeInfo.trigger._id
}
);
}
$.ajax({
url: baseUrl,
method: 'GET',
success: function(res) {
var url = url_for('debugger.direct', {'trans_id': res.data.debuggerTransId});
if (res.data.newBrowserTab) {
window.open(url, '_blank');
} else {
pgBrowser.Events.once(
'pgadmin-browser:frame:urlloaded:frm_debugger', function(frame) {
if (res.data.newBrowserTab) {
window.open(url, '_blank');
} else {
pgBrowser.Events.once(
'pgadmin-browser:frame:urlloaded:frm_debugger',
function(frame) {
frame.openURL(url);
});
// Create the debugger panel as per the data received from user input dialog.
var dashboardPanel = pgBrowser.docker.findPanels(
// Create the debugger panel as per the data received from user input dialog.
var dashboardPanel = pgBrowser.docker.findPanels(
'properties'
),
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
panel.focus();
panel.focus();
// Panel Closed event
panel.on(wcDocker.EVENT.CLOSED, function() {
var closeUrl = url_for('debugger.close', {'trans_id': res.data.debuggerTransId});
$.ajax({
url: closeUrl,
method: 'DELETE'
});
// Panel Closed event
panel.on(wcDocker.EVENT.CLOSED, function() {
var closeUrl = url_for('debugger.close', {
'trans_id': res.data.debuggerTransId,
});
}
},
error: function(xhr, status, error) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
Alertify.alert(gettext('Debugger Error'), err.errormsg);
}
} catch (e) {}
}
});
},
/*
Get the function information for the direct debugging to display the functions arguments and other informations
in the user input dialog
*/
get_function_information: function(args, item) {
var input = args || {},
t = pgBrowser.tree,
i = item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!d)
return;
var objName = d.label,
treeInfo = node.getTreeNodeHierarchy.apply(node, [i]),
_url = this.generate_url('init', treeInfo, node);
var self = this;
$.ajax({
url: _url,
cache: false,
success: function(res) {
// Open Alertify the dialog to take the input arguments from user if function having input arguments
if (res.data[0]['require_input']) {
get_function_arguments(res.data[0], 0);
}
else {
// Initialize the target and create asynchronous connection and unique transaction ID
// If there is no arguments to the functions then we should not ask for for function arguments and
// Directly open the panel
var t = pgBrowser.tree,
i = t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
if (d._type == "function") {
var baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'direct',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.function._id
}
);
}
else {
var baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'direct',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.procedure._id
}
);
}
$.ajax({
url: baseUrl,
method: 'GET',
success: function(res) {
url: closeUrl,
method: 'DELETE',
});
});
}
},
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
Alertify.alert(gettext('Debugger Error'), err.errormsg);
}
} catch (e) {
console.warn(e.stack || e);
}
},
});
},
var url = url_for('debugger.direct', {'trans_id': res.data.debuggerTransId});
/*
Get the function information for the direct debugging to display the functions arguments and other informations
in the user input dialog
*/
get_function_information: function(args, item) {
var t = pgBrowser.tree,
i = item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (res.data.newBrowserTab) {
window.open(url, '_blank');
} else {
pgBrowser.Events.once(
'pgadmin-browser:frame:urlloaded:frm_debugger', function(frame) {
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]),
_url = this.generate_url('init', treeInfo, node);
$.ajax({
url: _url,
cache: false,
success: function(res) {
// Open Alertify the dialog to take the input arguments from user if function having input arguments
if (res.data[0]['require_input']) {
get_function_arguments(res.data[0], 0);
} else {
// Initialize the target and create asynchronous connection and unique transaction ID
// If there is no arguments to the functions then we should not ask for for function arguments and
// Directly open the panel
var t = pgBrowser.tree,
i = t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]),
baseUrl;
if (d._type == 'function') {
baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'direct',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.function._id,
}
);
} else {
baseUrl = url_for(
'debugger.initialize_target_for_function', {
'debug_type': 'direct',
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
'scid': treeInfo.schema._id,
'func_id': treeInfo.procedure._id,
}
);
}
$.ajax({
url: baseUrl,
method: 'GET',
success: function(res) {
var url = url_for('debugger.direct', {
'trans_id': res.data.debuggerTransId,
});
if (res.data.newBrowserTab) {
window.open(url, '_blank');
} else {
pgBrowser.Events.once(
'pgadmin-browser:frame:urlloaded:frm_debugger',
function(frame) {
frame.openURL(url);
});
// Create the debugger panel as per the data received from user input dialog.
var dashboardPanel = pgBrowser.docker.findPanels(
// Create the debugger panel as per the data received from user input dialog.
var dashboardPanel = pgBrowser.docker.findPanels(
'properties'
),
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
),
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
panel.focus();
panel.focus();
// Register Panel Closed event
panel.on(wcDocker.EVENT.CLOSED, function() {
var closeUrl = url_for('debugger.close', {'trans_id': res.data.debuggerTransId});
$.ajax({
url: closeUrl,
method: 'DELETE'
});
// Register Panel Closed event
panel.on(wcDocker.EVENT.CLOSED, function() {
var closeUrl = url_for('debugger.close', {
'trans_id': res.data.debuggerTransId,
});
}
},
error: function(e) {
Alertify.alert(
gettext('Debugger Target Initialization Error'),
e.responseJSON.errormsg
);
$.ajax({
url: closeUrl,
method: 'DELETE',
});
});
}
});
}
},
error: function(xhr, status, error) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
Alertify.alert(gettext('Debugger Error'), err.errormsg);
}
} catch (e) {}
},
error: function(e) {
Alertify.alert(
gettext('Debugger Target Initialization Error'),
e.responseJSON.errormsg
);
},
});
}
});
}
};
},
error: function(xhr) {
try {
var err = $.parseJSON(xhr.responseText);
if (err.success == 0) {
Alertify.alert(gettext('Debugger Error'), err.errormsg);
}
} catch (e) {
console.warn(e.stack || e);
}
},
});
},
};
return pgAdmin.Tools.Debugger;
});
return pgAdmin.Tools.Debugger;
});

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ define([
'underscore.string', 'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.browser', 'backbone',
'backgrid', 'backform',
'pgadmin.backform', 'pgadmin.backgrid',
'pgadmin.browser.node.ui'
'pgadmin.browser.node.ui',
], function(
gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
Backform
@ -17,22 +17,22 @@ define([
if (pgAdmin.Tools.maintenance)
return pgAdmin.Tools.maintenance;
var CustomSwitchControl = Backform.CustomSwitchControl = Backform.SwitchControl.extend({
template: _.template([
'<label class="<%=Backform.controlLabelClassName%> custom_switch_label_class"><%=label%></label>',
'<div class="<%=Backform.controlsClassName%> custom_switch_control_class">',
' <div class="checkbox">',
' <label>',
' <input type="checkbox" class="<%=extraClasses.join(\' \')%>" name="<%=name%>" <%=value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> />',
' </label>',
' </div>',
'</div>',
'<% if (helpMessage && helpMessage.length) { %>',
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
'<% } %>'
].join("\n")),
className: 'pgadmin-control-group form-group col-xs-6'
});
Backform.CustomSwitchControl = Backform.SwitchControl.extend({
template: _.template([
'<label class="<%=Backform.controlLabelClassName%> custom_switch_label_class"><%=label%></label>',
'<div class="<%=Backform.controlsClassName%> custom_switch_control_class">',
' <div class="checkbox">',
' <label>',
' <input type="checkbox" class="<%=extraClasses.join(\' \')%>" name="<%=name%>" <%=value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> />',
' </label>',
' </div>',
'</div>',
'<% if (helpMessage && helpMessage.length) { %>',
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
'<% } %>',
].join('\n')),
className: 'pgadmin-control-group form-group col-xs-6',
});
// Main model for Maintenance functionality
var MaintenanceModel = Backbone.Model.extend({
@ -41,390 +41,443 @@ define([
vacuum_full: false,
vacuum_freeze: false,
vacuum_analyze: false,
verbose: true
verbose: true,
},
initialize: function() {
var node_info = arguments[1]['node_info'];
// If node is Unique or Primary key then set op to reindex
if ('primary_key' in node_info || 'unique_constraint' in node_info
|| 'index' in node_info) {
this.set('op', 'REINDEX');
this.set('verbose', false);
}
},
schema: [
{
id: 'op', label: gettext('Maintenance operation'), cell: 'string',
type: 'text', group: gettext('Options'),
options:[
{'label': "VACUUM", 'value': "VACUUM"},
{'label': "ANALYZE", 'value': "ANALYZE"},
{'label': "REINDEX", 'value': "REINDEX"},
{'label': "CLUSTER", 'value': "CLUSTER"},
],
control: Backform.RadioControl.extend({
template: _.template([
'<label class="control-label col-sm-4 col-xs-12"><%=label%></label>',
'<div class="pgadmin-controls col-xs-12 col-sm-8 btn-group pg-maintenance-op" data-toggle="buttons">',
' <% for (var i=0; i < options.length; i++) { %>',
' <% var option = options[i]; %>',
' <label class="btn btn-primary<% if (i == 0) { %> active<%}%>">',
' <input type="radio" name="op" id="op" autocomplete="off" value=<%-formatter.fromRaw(option.value)%><% if (i == 0) { %> selected<%}%> > <%-option.label%>',
' </label>',
' <% } %>',
'</div>'
].join("\n"))
}),
select2: {
allowClear: false,
width: "100%",
placeholder: gettext('Select from list...')
},
},
{
type: 'nested', control: 'fieldset', label: gettext('Vacuum'), group: gettext('Options'),
schema:[{
id: 'vacuum_full', group: gettext('Vacuum'), disabled: 'isDisabled',
control: Backform.CustomSwitchControl, label: gettext('FULL'), deps: ['op']
},{
id: 'vacuum_freeze', deps: ['op'], disabled: 'isDisabled',
control: Backform.CustomSwitchControl, label: gettext('FREEZE'), group: gettext('Vacuum')
},{
id: 'vacuum_analyze', deps: ['op'], disabled: 'isDisabled',
control: Backform.CustomSwitchControl, label: gettext('ANALYZE'), group: gettext('Vacuum')
}]
},
{
id: 'verbose', group: gettext('Options'), deps: ['op'],
control: Backform.CustomSwitchControl, label: gettext('Verbose Messages'), disabled: 'isDisabled'
var node_info = arguments[1]['node_info'];
// If node is Unique or Primary key then set op to reindex
if ('primary_key' in node_info || 'unique_constraint' in node_info ||
'index' in node_info) {
this.set('op', 'REINDEX');
this.set('verbose', false);
}
},
schema: [{
id: 'op',
label: gettext('Maintenance operation'),
cell: 'string',
type: 'text',
group: gettext('Options'),
options: [{
'label': 'VACUUM',
'value': 'VACUUM',
},
{
'label': 'ANALYZE',
'value': 'ANALYZE',
},
{
'label': 'REINDEX',
'value': 'REINDEX',
},
{
'label': 'CLUSTER',
'value': 'CLUSTER',
},
],
control: Backform.RadioControl.extend({
template: _.template([
'<label class="control-label col-sm-4 col-xs-12"><%=label%></label>',
'<div class="pgadmin-controls col-xs-12 col-sm-8 btn-group pg-maintenance-op" data-toggle="buttons">',
' <% for (var i=0; i < options.length; i++) { %>',
' <% var option = options[i]; %>',
' <label class="btn btn-primary<% if (i == 0) { %> active<%}%>">',
' <input type="radio" name="op" id="op" autocomplete="off" value=<%-formatter.fromRaw(option.value)%><% if (i == 0) { %> selected<%}%> > <%-option.label%>',
' </label>',
' <% } %>',
'</div>',
].join('\n')),
}),
select2: {
allowClear: false,
width: '100%',
placeholder: gettext('Select from list...'),
},
},
{
type: 'nested',
control: 'fieldset',
label: gettext('Vacuum'),
group: gettext('Options'),
schema: [{
id: 'vacuum_full',
group: gettext('Vacuum'),
disabled: 'isDisabled',
control: Backform.CustomSwitchControl,
label: gettext('FULL'),
deps: ['op'],
}, {
id: 'vacuum_freeze',
deps: ['op'],
disabled: 'isDisabled',
control: Backform.CustomSwitchControl,
label: gettext('FREEZE'),
group: gettext('Vacuum'),
}, {
id: 'vacuum_analyze',
deps: ['op'],
disabled: 'isDisabled',
control: Backform.CustomSwitchControl,
label: gettext('ANALYZE'),
group: gettext('Vacuum'),
}],
},
{
id: 'verbose',
group: gettext('Options'),
deps: ['op'],
control: Backform.CustomSwitchControl,
label: gettext('Verbose Messages'),
disabled: 'isDisabled',
},
],
// Enable/Disable the items based on the user maintenance operation selection
// Enable/Disable the items based on the user maintenance operation
// selection.
isDisabled: function(m) {
var name = this.name,
node_info = this.node_info;
switch(name) {
case 'vacuum_full':
case 'vacuum_freeze':
case 'vacuum_analyze':
if (m.get('op') != 'VACUUM') {
return true;
}
else {
return false;
}
break;
case 'verbose':
if ('primary_key' in node_info || 'unique_constraint' in node_info ||
'index' in node_info ) {
if (m.get('op') == 'REINDEX') {
setTimeout(function() { m.set('verbose', false); }, 10);
return true;
}
}
var node_info = this.node_info;
switch (this.name) {
case 'vacuum_full':
case 'vacuum_freeze':
case 'vacuum_analyze':
return (m.get('op') != 'VACUUM');
case 'verbose':
if ('primary_key' in node_info || 'unique_constraint' in node_info ||
'index' in node_info) {
if (m.get('op') == 'REINDEX') {
setTimeout(function() {
m.set('verbose', false);
}, 10);
return true;
}
else {
return false;
}
break;
default:
return false;
}
return m.get('op') == 'REINDEX';
default:
return false;
}
return false;
}
},
});
pgTools.maintenance = {
init: function() {
init: function() {
// We do not want to initialize the module multiple times.
if (this.initialized)
return;
// We do not want to initialize the module multiple times.
if (this.initialized)
return;
this.initialized = true;
this.initialized = true;
var maintenance_supported_nodes = [
'database', 'table', 'primary_key',
'unique_constraint', 'index', 'partition'
];
var maintenance_supported_nodes = [
'database', 'table', 'primary_key',
'unique_constraint', 'index', 'partition',
];
/**
Enable/disable Maintenance menu in tools based on node selected.
Maintenance menu will be enabled only when user select table and database node.
*/
var menu_enabled = function(itemData, item, data) {
var t = pgBrowser.tree, i = item, d = itemData;
var parent_item = t.hasParent(i) ? t.parent(i): null,
parent_data = parent_item ? t.itemData(parent_item) : null;
if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data)) {
if (_.indexOf(maintenance_supported_nodes, d._type) !== -1 &&
parent_data._type != 'catalog') {
if (d._type == 'database' && d.allowConn)
return true;
else if(d._type != 'database')
return true;
else
return false;
}
else
return false;
}
else
return false;
};
var menus = [{
name: 'maintenance', module: this,
applies: ['tools'], callback: 'callback_maintenance',
priority: 10, label: gettext('Maintenance...'),
icon: 'fa fa-wrench', enable: menu_enabled
}];
// Add supported menus into the menus list
for (var idx = 0; idx < maintenance_supported_nodes.length; idx++) {
menus.push({
name: 'maintenance_context_' + maintenance_supported_nodes[idx],
node: maintenance_supported_nodes[idx], module: this,
applies: ['context'], callback: 'callback_maintenance',
priority: 10, label: gettext('Maintenance...'),
icon: 'fa fa-wrench', enable: menu_enabled
});
}
pgBrowser.add_menus(menus);
},
/*
Open the dialog for the maintenance functionality
/**
Enable/disable Maintenance menu in tools based on node selected.
Maintenance menu will be enabled only when user select table and database node.
*/
callback_maintenance: function(args, item) {
var i = item || pgBrowser.tree.selected(),
server_data = null;
var menu_enabled = function(itemData, item) {
var t = pgBrowser.tree,
i = item,
d = itemData;
var parent_item = t.hasParent(i) ? t.parent(i) : null,
parent_data = parent_item ? t.itemData(parent_item) : null;
if (!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data)) {
if (_.indexOf(maintenance_supported_nodes, d._type) !== -1 &&
parent_data._type != 'catalog') {
if (d._type == 'database' && d.allowConn)
return true;
else if (d._type != 'database')
return true;
else
return false;
} else
return false;
} else
return false;
};
while (i) {
var node_data = pgBrowser.tree.itemData(i);
if (node_data._type == 'server') {
server_data = node_data;
break;
}
var menus = [{
name: 'maintenance',
module: this,
applies: ['tools'],
callback: 'callback_maintenance',
priority: 10,
label: gettext('Maintenance...'),
icon: 'fa fa-wrench',
enable: menu_enabled,
}];
if (pgBrowser.tree.hasParent(i)) {
i = $(pgBrowser.tree.parent(i));
} else {
Alertify.alert(gettext("Please select server or child node from tree."));
break;
}
// Add supported menus into the menus list
for (var idx = 0; idx < maintenance_supported_nodes.length; idx++) {
menus.push({
name: 'maintenance_context_' + maintenance_supported_nodes[idx],
node: maintenance_supported_nodes[idx],
module: this,
applies: ['context'],
callback: 'callback_maintenance',
priority: 10,
label: gettext('Maintenance...'),
icon: 'fa fa-wrench',
enable: menu_enabled,
});
}
pgBrowser.add_menus(menus);
},
/*
Open the dialog for the maintenance functionality
*/
callback_maintenance: function(args, item) {
var i = item || pgBrowser.tree.selected(),
server_data = null;
while (i) {
var node_data = pgBrowser.tree.itemData(i);
if (node_data._type == 'server') {
server_data = node_data;
break;
}
if (!server_data) {
return;
}
var module = 'paths',
preference_name = 'pg_bin_dir',
msg = gettext('Please configure the PostgreSQL Binary Path in the Preferences dialog.');
if ((server_data.type && server_data.type == 'ppas') ||
server_data.server_type == 'ppas') {
preference_name = 'ppas_bin_dir';
msg = gettext('Please configure the EDB Advanced Server Binary Path in the Preferences dialog.');
}
var preference = pgBrowser.get_preference(module, preference_name);
if(preference) {
if (!preference.value) {
Alertify.alert(gettext('Configuration required'), msg);
return;
}
if (pgBrowser.tree.hasParent(i)) {
i = $(pgBrowser.tree.parent(i));
} else {
Alertify.alert(S(gettext('Failed to load preference %s of module %s')).sprintf(preference_name, module).value());
Alertify.alert(gettext('Please select server or child node from tree.'));
break;
}
}
if (!server_data) {
return;
}
var module = 'paths',
preference_name = 'pg_bin_dir',
msg = gettext('Please configure the PostgreSQL Binary Path in the Preferences dialog.');
if ((server_data.type && server_data.type == 'ppas') ||
server_data.server_type == 'ppas') {
preference_name = 'ppas_bin_dir';
msg = gettext('Please configure the EDB Advanced Server Binary Path in the Preferences dialog.');
}
var preference = pgBrowser.get_preference(module, preference_name);
if (preference) {
if (!preference.value) {
Alertify.alert(gettext('Configuration required'), msg);
return;
}
} else {
Alertify.alert(S(gettext('Failed to load preference %s of module %s')).sprintf(preference_name, module).value());
return;
}
var self = this,
input = args || {},
t = pgBrowser.tree,
i = item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
var self = this,
t = pgBrowser.tree;
if (!d)
return;
i = item || t.selected();
var objName = d.label;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
var d = i && i.length == 1 ? t.itemData(i) : undefined;
if (!Alertify.MaintenanceDialog) {
Alertify.dialog('MaintenanceDialog', function factory() {
if (!d)
return;
return {
main: function(title) {
this.set('title', title);
},
setup: function() {
return {
buttons:[{
text: '', className: 'btn btn-default pull-left fa fa-lg fa-info',
attrs:{name:'object_help', type:'button', url: 'maintenance.html', label: gettext('Maintenance')}
},{
text: '', key: 112,
className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs:{
name:'dialog_help', type:'button',
label: gettext('Maintenance'),
url: url_for(
'help.static', {'filename': 'maintenance_dialog.html'}
)
}
},{
text: gettext("OK"), key: 13, className: "btn btn-primary fa fa-lg fa-save pg-alertify-button",
'data-btn-name': 'ok',
},{
text: gettext("Cancel"), key: 27, className: "btn btn-danger fa fa-lg fa-times pg-alertify-button",
'data-btn-name': 'cancel',
}],
options: { modal: 0, pinnable: false}
};
},
// Callback functions when click on the buttons of the Alertify dialogs
callback: function(e) {
var i = pgBrowser.tree.selected(),
d = i && i.length == 1 ? pgBrowser.tree.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (!Alertify.MaintenanceDialog) {
Alertify.dialog('MaintenanceDialog', function factory() {
if (e.button.element.name == "dialog_help" || e.button.element.name == "object_help") {
e.cancel = true;
pgBrowser.showHelp(e.button.element.name, e.button.element.getAttribute('url'),
node, i, e.button.element.getAttribute('label'));
return;
}
if (e.button['data-btn-name'] === "ok") {
var schema = undefined,
table = undefined,
primary_key = undefined,
unique_constraint = undefined,
index = undefined;
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
if (treeInfo.schema != undefined) {
schema = treeInfo.schema._label;
}
if (treeInfo.partition != undefined) {
table = treeInfo.partition._label;
} else if (treeInfo.table != undefined) {
table = treeInfo.table._label;
}
if (treeInfo.primary_key != undefined) {
primary_key = treeInfo.primary_key._label;
} else if (treeInfo.unique_constraint != undefined) {
unique_constraint = treeInfo.unique_constraint._label;
} else if (treeInfo.index != undefined) {
index = treeInfo.index._label;
}
this.view.model.set({'database': treeInfo.database._label,
'schema': schema,
'table': table,
'primary_key': primary_key,
'unique_constraint': unique_constraint,
'index': index})
$.ajax({
return {
main: function(title) {
this.set('title', title);
},
setup: function() {
return {
buttons: [{
text: '',
className: 'btn btn-default pull-left fa fa-lg fa-info',
attrs: {
name: 'object_help',
type: 'button',
url: 'maintenance.html',
label: gettext('Maintenance'),
},
}, {
text: '',
key: 112,
className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs: {
name: 'dialog_help',
type: 'button',
label: gettext('Maintenance'),
url: url_for(
'maintenance.create_job', {
'sid': treeInfo.server._id,
'did': treeInfo.database._id
}),
method: 'POST',
data:{'data': JSON.stringify(this.view.model.toJSON())},
success: function(res) {
if (res.data && res.data.status) {
//Do nothing as we are creating the job and exiting from the main dialog
Alertify.success(res.data.info);
pgBrowser.Events.trigger('pgadmin-bgprocess:created', self);
'help.static', {
'filename': 'maintenance_dialog.html',
}
else {
Alertify.error(res.data.errmsg);
}
},
error: function(e) {
Alertify.alert(
gettext("Maintenance job creation failed.")
);
}
});
}
},
build: function() {
Alertify.pgDialogBuild.apply(this)
},
hooks: {
onclose: function() {
if (this.view) {
this.view.remove({data: true, internal: true, silent: true});
}
}
},
prepare: function() {
// Main maintenance tool dialog container
var $container = $("<div class='maintenance_dlg'></div>");
),
},
}, {
text: gettext('OK'),
key: 13,
className: 'btn btn-primary fa fa-lg fa-save pg-alertify-button',
'data-btn-name': 'ok',
}, {
text: gettext('Cancel'),
key: 27,
className: 'btn btn-danger fa fa-lg fa-times pg-alertify-button',
'data-btn-name': 'cancel',
}],
options: {
modal: 0,
pinnable: false,
},
};
},
// Callback functions when click on the buttons of the Alertify dialogs
callback: function(e) {
var i = pgBrowser.tree.selected(),
d = i && i.length == 1 ? pgBrowser.tree.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
var t = pgBrowser.tree,
i = t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
if (e.button.element.name == 'dialog_help' || e.button.element.name == 'object_help') {
e.cancel = true;
pgBrowser.showHelp(e.button.element.name, e.button.element.getAttribute('url'),
node, i, e.button.element.getAttribute('label'));
return;
}
if (e.button['data-btn-name'] === 'ok') {
var schema = undefined,
table = undefined,
primary_key = undefined,
unique_constraint = undefined,
index = undefined;
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
var newModel = new MaintenanceModel (
{}, {node_info: treeInfo}
),
fields = Backform.generateViewSchema(
treeInfo, newModel, 'create', node, treeInfo.server, true
);
if (treeInfo.schema != undefined) {
schema = treeInfo.schema._label;
}
var view = this.view = new Backform.Dialog({
el: $container, model: newModel, schema: fields
});
if (treeInfo.partition != undefined) {
table = treeInfo.partition._label;
} else if (treeInfo.table != undefined) {
table = treeInfo.table._label;
}
$(this.elements.body.childNodes[0]).addClass('alertify_tools_dialog_properties obj_properties');
view.render();
if (treeInfo.primary_key != undefined) {
primary_key = treeInfo.primary_key._label;
} else if (treeInfo.unique_constraint != undefined) {
unique_constraint = treeInfo.unique_constraint._label;
} else if (treeInfo.index != undefined) {
index = treeInfo.index._label;
}
// If node is Index, Unique or Primary key then disable vacuum & analyze button
if (d._type == 'primary_key' || d._type == 'unique_constraint'
|| d._type == 'index') {
var vacuum_analyze_btns = $container.find(
'.pgadmin-controls label:lt(2)'
).removeClass('active').addClass('disabled');
// Find reindex button element & add active class to it
var reindex_btn = vacuum_analyze_btns[1].nextElementSibling;
$(reindex_btn).addClass('active');
}
this.view.model.set({
'database': treeInfo.database._label,
'schema': schema,
'table': table,
'primary_key': primary_key,
'unique_constraint': unique_constraint,
'index': index,
});
this.elements.content.appendChild($container.get(0));
$.ajax({
url: url_for(
'maintenance.create_job', {
'sid': treeInfo.server._id,
'did': treeInfo.database._id,
}),
method: 'POST',
data: {
'data': JSON.stringify(this.view.model.toJSON()),
},
success: function(res) {
if (res.data && res.data.status) {
//Do nothing as we are creating the job and exiting from the main dialog
Alertify.success(res.data.info);
pgBrowser.Events.trigger('pgadmin-bgprocess:created', self);
} else {
Alertify.error(res.data.errmsg);
}
},
error: function() {
Alertify.alert(
gettext('Maintenance job creation failed.')
);
},
});
}
};
});
}
},
build: function() {
Alertify.pgDialogBuild.apply(this);
},
hooks: {
onclose: function() {
if (this.view) {
this.view.remove({
data: true,
internal: true,
silent: true,
});
}
},
},
prepare: function() {
// Main maintenance tool dialog container
var $container = $('<div class=\'maintenance_dlg\'></div>');
// Open the Alertify dialog
Alertify.MaintenanceDialog('Maintenance...').set('resizable',true).resizeTo('60%','80%');
},
};
var t = pgBrowser.tree,
i = t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,
node = d && pgBrowser.Nodes[d._type];
return pgAdmin.Tools.maintenance;
});
if (!d)
return;
var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
var newModel = new MaintenanceModel({}, {
node_info: treeInfo,
}),
fields = Backform.generateViewSchema(
treeInfo, newModel, 'create', node, treeInfo.server, true
);
var view = this.view = new Backform.Dialog({
el: $container,
model: newModel,
schema: fields,
});
$(this.elements.body.childNodes[0]).addClass('alertify_tools_dialog_properties obj_properties');
view.render();
// If node is Index, Unique or Primary key then disable vacuum & analyze button
if (d._type == 'primary_key' || d._type == 'unique_constraint' ||
d._type == 'index') {
var vacuum_analyze_btns = $container.find(
'.pgadmin-controls label:lt(2)'
).removeClass('active').addClass('disabled');
// Find reindex button element & add active class to it
var reindex_btn = vacuum_analyze_btns[1].nextElementSibling;
$(reindex_btn).addClass('active');
}
this.elements.content.appendChild($container.get(0));
},
};
});
}
// Open the Alertify dialog
Alertify.MaintenanceDialog('Maintenance...').set('resizable', true).resizeTo('60%', '80%');
},
};
return pgAdmin.Tools.maintenance;
});

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More