mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Allow to create the foreign table with inherits options. Fixes #1260
This commit is contained in:
parent
01252a13cf
commit
ec3b9bb15b
@ -668,7 +668,8 @@ AND relkind != 'c'))"""
|
||||
if not status:
|
||||
return internal_server_error(errormsg=res)
|
||||
|
||||
foid, scid = res['rows'][0]
|
||||
foid = res['rows'][0]['oid']
|
||||
scid = res['rows'][0]['scid']
|
||||
|
||||
return jsonify(
|
||||
node=self.blueprint.generate_browser_node(
|
||||
@ -718,7 +719,8 @@ AND relkind != 'c'))"""
|
||||
)
|
||||
)
|
||||
|
||||
name, basensp = res['rows'][0]
|
||||
name = res['rows'][0]['name']
|
||||
basensp = res['rows'][0]['basensp']
|
||||
|
||||
SQL = render_template("/".join([self.template_path,
|
||||
'delete.sql']),
|
||||
@ -1103,13 +1105,6 @@ AND relkind != 'c'))"""
|
||||
if cols and 'rows' in cols:
|
||||
data['columns'] = cols['rows']
|
||||
|
||||
data['strcolumn'] = ''
|
||||
str_cols = []
|
||||
if 'columns' in data:
|
||||
for c in data['columns']:
|
||||
str_cols.append(c['strcolumn'])
|
||||
data['strcolumn'] = ', '.join(str_cols)
|
||||
|
||||
# Get Inherited table names from their OID
|
||||
if inherits:
|
||||
if 'inherits' in data and data['inherits']:
|
||||
|
@ -241,22 +241,6 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
|
||||
toJSON: Backbone.Model.prototype.toJSON
|
||||
});
|
||||
|
||||
var formatNode = function(opt) {
|
||||
if (!opt.id) {
|
||||
return opt.text;
|
||||
}
|
||||
|
||||
var optimage = $(opt.element).data('image');
|
||||
|
||||
if(!optimage){
|
||||
return opt.text;
|
||||
} else {
|
||||
return $(
|
||||
'<span><span class="wcTabIcon ' + optimage + '"/>' + opt.text + '</span>'
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* NodeAjaxOptionsMultipleControl is for multiple selection of Combobox.
|
||||
* This control is used to select Multiple Parent Tables to be inherited.
|
||||
@ -264,83 +248,7 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
|
||||
* To populates the column, it calls the server and fetch the columns data
|
||||
* for the selected table.
|
||||
*/
|
||||
|
||||
var NodeAjaxOptionsMultipleControl = Backform.NodeAjaxOptionsMultipleControl = Backform.NodeAjaxOptionsControl.extend({
|
||||
template: _.template([
|
||||
'<label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
|
||||
'<div class="<%=Backform.controlsClassName%> <%=extraClasses.join(\' \')%>">',
|
||||
' <select class="pgadmin-node-select form-control" name="<%=name%>" style="width:100%;" value=<%-value%> <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> >',
|
||||
' </select>',
|
||||
'</div>'].join("\n")),
|
||||
defaults: _.extend(
|
||||
{}, Backform.NodeAjaxOptionsControl.prototype.defaults,
|
||||
{
|
||||
select2: {
|
||||
allowClear: true,
|
||||
placeholder: 'Select from the list',
|
||||
width: 'style',
|
||||
templateResult: formatNode,
|
||||
templateSelection: formatNode
|
||||
}
|
||||
}),
|
||||
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);
|
||||
};
|
||||
|
||||
// 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)
|
||||
});
|
||||
|
||||
if (field.node_info.server.version < field.min_version) {
|
||||
field.version_compatible = false
|
||||
return this;
|
||||
}
|
||||
else {
|
||||
// Evaluation the options
|
||||
if (_.isFunction(data.options)) {
|
||||
try {
|
||||
data.options = data.options.apply(this)
|
||||
} catch(e) {
|
||||
// Do nothing
|
||||
data.options = []
|
||||
this.model.trigger('pgadmin-view:transform:error', self.model, self.field, e);
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up first
|
||||
this.$el.removeClass(Backform.hiddenClassname);
|
||||
this.$el.html(this.template(data)).addClass(field.name);
|
||||
|
||||
if (!data.visible) {
|
||||
this.$el.addClass(Backform.hiddenClassname);
|
||||
} else {
|
||||
var opts = _.extend(
|
||||
{}, this.defaults.select2, data.select2,
|
||||
{
|
||||
'data': data.options
|
||||
});
|
||||
this.$el.find("select").select2(opts).val(data.rawValue).trigger("change");
|
||||
this.updateInvalid();
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
var NodeAjaxOptionsMultipleControl = Backform.NodeAjaxOptionsControl.extend({
|
||||
onChange: function(e) {
|
||||
var model = this.model,
|
||||
$el = $(e.target),
|
||||
@ -370,7 +278,7 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
|
||||
|
||||
// Remove Columns if inherit option is deselected from the combobox
|
||||
if(_.size(value) < _.size(inherits)) {
|
||||
var dif = _.difference(inherits, JSON.parse(value));
|
||||
var dif = _.difference(inherits, value);
|
||||
var rmv_columns = columns.where({inheritedid: parseInt(dif[0])});
|
||||
columns.remove(rmv_columns);
|
||||
}
|
||||
@ -600,7 +508,6 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
|
||||
basensp: undefined,
|
||||
description: undefined,
|
||||
ftsrvname: undefined,
|
||||
strcolumn: undefined,
|
||||
strftoptions: undefined,
|
||||
inherits: [],
|
||||
columns: [],
|
||||
@ -632,7 +539,7 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
|
||||
type: 'text', group: 'Definition', url: 'get_foreign_servers', disabled: function(m) { return !m.isNew(); }
|
||||
},{
|
||||
id: 'inherits', label:'{{ _('Inherits') }}', group: 'Definition',
|
||||
type: 'array', min_version: 90500, control: 'node-ajax-options-multiple',
|
||||
type: 'array', min_version: 90500, control: NodeAjaxOptionsMultipleControl,
|
||||
url: 'get_tables', select2: {multiple: true},
|
||||
'cache_level': 'database',
|
||||
transform: function(d, self){
|
||||
@ -645,9 +552,6 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
|
||||
}
|
||||
return d;
|
||||
}
|
||||
},{
|
||||
id: 'strcolumn', label:'{{ _('Columns') }}', cell: 'string', group: 'Definition',
|
||||
type: 'text', min_version: 90500, mode: ['properties']
|
||||
},{
|
||||
id: 'columns', label:'{{ _('Columns') }}', cell: 'string',
|
||||
type: 'collection', group: 'Columns', visible: false, mode: ['edit', 'create'],
|
||||
|
@ -1,13 +1,7 @@
|
||||
SELECT
|
||||
attname, attndims, atttypmod, format_type(t.oid,NULL) AS datatype,
|
||||
format_type(t.oid, att.atttypmod) AS fulltype, attnotnull, attnum,
|
||||
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup,
|
||||
(
|
||||
attname || ' ' || format_type(t.oid, att.atttypmod) || ' ' ||
|
||||
(CASE WHEN attnotnull='true'
|
||||
THEN 'NOT NULL' ELSE 'NULL'
|
||||
END)
|
||||
) as strcolumn
|
||||
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup
|
||||
FROM
|
||||
pg_attribute att
|
||||
JOIN
|
||||
|
@ -4,25 +4,7 @@ SELECT
|
||||
CASE WHEN length(cn.nspname) > 0 AND length(cl.collname) > 0 THEN
|
||||
concat(cn.nspname, '."', cl.collname,'"') ELSE '' END AS collname,
|
||||
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup,
|
||||
pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS typdefault,
|
||||
(
|
||||
attname || ' ' || format_type(t.oid, att.atttypmod) || ' ' ||
|
||||
(
|
||||
CASE WHEN array_length(attfdwoptions, 1)>0
|
||||
THEN concat('OPTIONS (', array_to_string(attfdwoptions, ', '), ')') ELSE ''
|
||||
END
|
||||
) || ' ' ||
|
||||
(
|
||||
CASE WHEN attnotnull='true'
|
||||
THEN 'NOT NULL' ELSE 'NULL'
|
||||
END
|
||||
) || ' ' ||
|
||||
(
|
||||
CASE WHEN pg_catalog.pg_get_expr(def.adbin, def.adrelid)<>''
|
||||
THEN 'DEFAULT ' || pg_catalog.pg_get_expr(def.adbin, def.adrelid)
|
||||
ELSE '' END
|
||||
)
|
||||
) as strcolumn
|
||||
pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS typdefault
|
||||
FROM
|
||||
pg_attribute att
|
||||
JOIN
|
||||
|
@ -20,25 +20,6 @@ SELECT INH.inheritedfrom, INH.inheritedid, att.attoptions, attfdwoptions,
|
||||
concat(cn.nspname, '."', cl.collname,'"')
|
||||
ELSE '' END AS collname,
|
||||
pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS typdefault,
|
||||
(
|
||||
att.attname || ' ' || format_type(t.oid, att.atttypmod) || ' ' ||
|
||||
(
|
||||
CASE WHEN array_length(attfdwoptions, 1)>0
|
||||
THEN concat('OPTIONS (', array_to_string(attfdwoptions, ', '), ')') ELSE ''
|
||||
END
|
||||
) || ' ' ||
|
||||
(
|
||||
CASE WHEN attnotnull='true'
|
||||
THEN 'NOT NULL' ELSE 'NULL'
|
||||
END
|
||||
) || ' ' ||
|
||||
(
|
||||
CASE WHEN pg_catalog.pg_get_expr(def.adbin, def.adrelid)<>''
|
||||
THEN 'DEFAULT ' || pg_catalog.pg_get_expr(def.adbin, def.adrelid)
|
||||
ELSE '' END
|
||||
)
|
||||
) as strcolumn,
|
||||
|
||||
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup
|
||||
FROM
|
||||
pg_attribute att
|
||||
|
@ -9,7 +9,7 @@ WHERE
|
||||
|
||||
{% else %}
|
||||
SELECT
|
||||
c.oid AS id, quote_ident(n.nspname) || '.' || quote_ident(c.relname) as text
|
||||
c.oid AS value, quote_ident(n.nspname) || '.' || quote_ident(c.relname) as label
|
||||
FROM
|
||||
pg_class c, pg_namespace n
|
||||
WHERE
|
||||
|
@ -21,6 +21,7 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
|
||||
headerSelectControlTemplate = _.template([
|
||||
'<div class="<%=Backform.controlsClassName%> <%=extraClasses.join(\' \')%>">',
|
||||
' <select class="pgadmin-node-select form-control" name="<%=name%>" style="width:100%;" value="<%-value%>" <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> >',
|
||||
' <%=select2.first_empty ? " <option></option>" : ""%>',
|
||||
' <% for (var i=0; i < options.length; i++) { %>',
|
||||
' <% var option = options[i]; %>',
|
||||
' <option <% if (option.image) { %> data-image=<%= option.image %> <% } %> value=<%= formatter.fromRaw(option.value) %> <%=option.value === rawValue ? "selected=\'selected\'" : "" %>><%-option.label%></option>',
|
||||
@ -134,8 +135,9 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
|
||||
}),
|
||||
select2: {
|
||||
allowClear: false, width: 'style',
|
||||
placeholder: 'Select column'
|
||||
}, first_empty: !_.isUndefined(self.model.get('oid')),
|
||||
placeholder: '{{ _('Select column') }}',
|
||||
first_empty: !_.isUndefined(self.model.get('oid'))
|
||||
},
|
||||
version_compatible: self.field.get('version_compatible'),
|
||||
disabled: function(m) {
|
||||
return !_.isUndefined(self.model.get('oid'));
|
||||
@ -234,10 +236,11 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
|
||||
Backform.Select2Control.prototype.render.apply(this, arguments);
|
||||
return this;
|
||||
}
|
||||
}), url: 'get_columns', first_empty: true,
|
||||
}), url: 'get_columns',
|
||||
select2: {
|
||||
allowClear: false,
|
||||
width: "style",
|
||||
placeholder: 'Select column',
|
||||
placeholder: '{{ _('Select column') }}',
|
||||
templateResult: formatNode,
|
||||
templateSelection: formatNode
|
||||
},
|
||||
|
@ -124,7 +124,7 @@ function(_, pgAdmin, $, Backbone) {
|
||||
var self = this;
|
||||
self._previous_key_values = {};
|
||||
|
||||
if ('on_server' in options && options.on_server) {
|
||||
if (!_.isUndefined(options) && 'on_server' in options && options.on_server) {
|
||||
self.on_server = true;
|
||||
}
|
||||
|
||||
|
@ -1804,7 +1804,11 @@
|
||||
if (_.isArray(formattedData)) {
|
||||
return _.map(formattedData, decodeURIComponent);
|
||||
} else {
|
||||
return decodeURIComponent(formattedData);
|
||||
if(!_.isNull(formattedData) && !_.isUndefined(formattedData)) {
|
||||
return decodeURIComponent(formattedData);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -1915,9 +1919,15 @@
|
||||
return this;
|
||||
},
|
||||
getValueFromDOM: function() {
|
||||
return Backform.SelectControl.prototype.getValueFromDOM.apply(
|
||||
this, arguments
|
||||
);
|
||||
var val = Backform.SelectControl.prototype.getValueFromDOM.apply(
|
||||
this, arguments
|
||||
),
|
||||
select2Opts = _.extend({}, this.field.get("select2") || this.defaults.select2);
|
||||
|
||||
if (select2Opts.multiple && val == null) {
|
||||
return [];
|
||||
}
|
||||
return val;
|
||||
}
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user