diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.ui.js index b117690aa..a6feea08c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.ui.js @@ -75,6 +75,10 @@ export default class PrimaryKeySchema extends BaseUISchema { }, depChange: (state, source, topState, actionObj)=>{ /* If in table, sync up value with columns in table */ + if(obj.inTable && !state) { + /* the FK is removed by some other dep, this can be a no-op */ + return; + } let currColumns = state.columns || []; if(obj.inTable && source[0] == 'columns') { if(actionObj.type == SCHEMA_STATE_ACTIONS.DELETE_ROW) { diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.ui.js index 22b72f278..055679108 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.ui.js @@ -76,6 +76,10 @@ export default class UniqueConstraintSchema extends BaseUISchema { }, depChange: (state, source, topState, actionObj)=>{ /* If in table, sync up value with columns in table */ + if(obj.inTable && !state) { + /* the FK is removed by some other dep, this can be a no-op */ + return; + } let currColumns = state.columns || []; if(obj.inTable && source[0] == 'columns') { if(actionObj.type == SCHEMA_STATE_ACTIONS.DELETE_ROW) { diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js index 1e55400f7..4afedec8e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js @@ -108,10 +108,19 @@ export class ConstraintsSchema extends BaseUISchema { canAddRow: function(state) { return ((state.primary_key||[]).length < 1 && obj.anyColumnAdded(state)); }, - depChange: (state)=>{ + depChange: (state, source, topState, actionObj)=>{ if (state.is_partitioned && obj.top.getServerVersion() < 110000 || state.columns?.length <= 0) { return {primary_key: []}; } + /* If columns changed */ + if(actionObj.type == SCHEMA_STATE_ACTIONS.SET_VALUE && actionObj.path[actionObj.path.length-1] == 'columns') { + /* Sync up the pk flag */ + let columns = state.primary_key[0].columns.map((c)=>c.column); + state.columns = state.columns.map((c)=>({ + ...c, is_primary_key: columns.indexOf(c.name) > -1, + })); + return {columns: state.columns}; + } } },{ id: 'foreign_key', label: '', @@ -142,7 +151,7 @@ export class ConstraintsSchema extends BaseUISchema { columns : ['name', 'consrc'], },{ id: 'unique_constraint', label: '', - schema: this.primaryKeyObj, + schema: this.uniqueConsObj, editable: false, type: 'collection', group: gettext('Unique'), mode: ['edit', 'create'], canEdit: true, canDelete: true, deps:['is_partitioned', 'typname'], @@ -560,9 +569,40 @@ export default class TableSchema extends BaseUISchema { return false; }, deps: ['typname', 'is_partitioned'], - depChange: (state, source)=>{ + depChange: (state, source, topState, actionObj)=>{ if(source[0] === 'columns') { obj.changeColumnOptions(state.columns); + /* If primary key switch changes, primary key collection need to change */ + if(actionObj.path.indexOf('is_primary_key') > -1) { + let tabColPath = _.slice(actionObj.path, 0, -1); + let columnData = _.get(state, tabColPath); + if(state.primary_key?.length > 0) { + /* Add/Remove columns if PK exists */ + let currPk = state.primary_key[0]; + /* If col is not PK, remove it */ + if(!columnData.is_primary_key) { + currPk.columns = _.filter(currPk.columns, (c)=>c.column !== columnData.name); + } else { + currPk.columns = _.filter(currPk.columns, (c)=>c.column !== columnData.name); + currPk.columns.push({ + column: columnData.name, + }); + } + /* Remove the PK if all columns not PK */ + if(currPk.columns.length <= 0) { + return {primary_key: []}; + } else { + return {primary_key: [currPk]}; + } + } else { + /* Create PK if none */ + return {primary_key: [ + obj.constraintsObj.primaryKeyObj.getNewData({ + columns: [{column: columnData.name}], + }) + ]}; + } + } } }, canAdd: this.canAddRowColumns,