From d7d4bf475bc5b131d9a76376ebfc87e004d92333 Mon Sep 17 00:00:00 2001 From: Surinder Kumar Date: Mon, 15 May 2017 15:04:16 +0100 Subject: [PATCH] Various improvements to the NULL/DEFAULT handling in the data editor. Fixes #2399 --- web/pgadmin/tools/sqleditor/command.py | 7 +- .../templates/sqleditor/js/sqleditor.js | 108 ++++++++++++++---- 2 files changed, 94 insertions(+), 21 deletions(-) diff --git a/web/pgadmin/tools/sqleditor/command.py b/web/pgadmin/tools/sqleditor/command.py index 960146762..2bb90c2b4 100644 --- a/web/pgadmin/tools/sqleditor/command.py +++ b/web/pgadmin/tools/sqleditor/command.py @@ -483,6 +483,8 @@ class TableCommand(GridCommand): data_type=column_type, pk_names=pk_names) list_of_sql.append(sql) + # Reset column data + column_data = {} # For updated rows elif of_type == 'updated': @@ -554,7 +556,10 @@ class TableCommand(GridCommand): query_res[val]['result'] = 'Transaction ROLLBACK' # If list is empty set rowid to 1 - _rowid = list_of_rowid[i] if list_of_rowid else 1 + try: + _rowid = list_of_rowid[i] if list_of_rowid else 1 + except Exception: + _rowid = 0 return status, res, query_res, _rowid diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js index 57caa76b9..f3ca7b09b 100644 --- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js @@ -540,6 +540,9 @@ define( // To store primary keys before they gets changed self.handler.primary_keys_data = {}; + // Add getItemMetadata into handler for later use + self.handler.data_view = collection; + // Remove any existing grid first if (self.handler.slickgrid) { self.handler.slickgrid.destroy(); @@ -613,16 +616,20 @@ define( // Add-on function which allow us to identify the faulty row after insert/update // and apply css accordingly collection.getItemMetadata = function(i) { - var res = {}, cssClass = ''; + var res = {}, + cssClass = '', + data_store = self.handler.data_store; + if (_.has(self.handler, 'data_store')) { - if (i in self.handler.data_store.added_index) { + if (i in data_store.added_index && + data_store.added_index[i] in data_store.added) { cssClass = 'new_row'; - if (self.handler.data_store.added[self.handler.data_store.added_index[i]].err) { + if (data_store.added[data_store.added_index[i]].err) { cssClass += ' error'; } - } else if (i in self.handler.data_store.updated_index) { + } else if (i in data_store.updated_index && i in data_store.updated) { cssClass = 'updated_row'; - if (self.handler.data_store.updated[self.handler.data_store.updated_index[i]].err) { + if (data_store.updated[data_store.updated_index[i]].err) { cssClass += ' error'; } } @@ -676,28 +683,53 @@ define( }); // Now assign mapped temp PK to PK primary_key_list = _tmp_keys; + + // Check if selected is new row ? + // Allow to delete if yes + var cell_el = this.grid.getCellNode(selected_rows_list[0], 0), + parent_el = $(cell_el).parent(), + is_new_row = $(parent_el).hasClass('new_row'); + + // Clear selection model if row primary keys is set to default + var row_data = collection[selected_rows_list[0]]; + if (primary_key_list.length && + !_.has(row_data, primary_key_list) && !is_new_row) { + this.selection.setSelectedRows([]); + selected_rows_list = []; + } } + // Clear the object as no rows to delete + // and disable delete/copy rows button + var clear_staged_rows = function() { + rows_for_stage = {}; + $("#btn-delete-row").prop('disabled', true); + $("#btn-copy-row").prop('disabled', true); + } + // If any row(s) selected ? if(selected_rows_list.length) { if(this.editor.handler.can_edit) - // Enable delete rows button + // Enable delete rows and copy rows button $("#btn-delete-row").prop('disabled', false); + $("#btn-copy-row").prop('disabled', false); + // Collect primary key data from collection as needed for stage row + _.each(selected_rows_list, function(row_index) { + var row_data = collection[row_index], + pkey_data = _.pick(row_data, primary_key_list); - // Enable copy rows button - $("#btn-copy-row").prop('disabled', false); - // Collect primary key data from collection as needed for stage row - _.each(selected_rows_list, function(row_index) { - var row_data = collection[row_index]; - // Store Primary key data for selected rows - rows_for_stage[row_data.__temp_PK] = _.pick(row_data, primary_key_list); - }); + // Store Primary key data for selected rows + if (!_.isUndefined(row_data) && !_.isUndefined(pkey_data)) { + // check for invalid row + rows_for_stage[row_data.__temp_PK] = _.pick(row_data, primary_key_list); + } + }); } else { - // Clear the object as no rows to delete - rows_for_stage = {}; - // Disable delete/copy rows button - $("#btn-delete-row").prop('disabled', true); - $("#btn-copy-row").prop('disabled', true); + //clear staged rows + clear_staged_rows(); + } + if (!Object.keys(rows_for_stage).length) { + clear_staged_rows(); } // Update main data store @@ -2213,6 +2245,30 @@ define( return (self.get('can_edit')); }, + rows_to_delete: function(data) { + var self = this; + var tmp_keys = []; + _.each(self.primary_keys, function(p, idx) { + // For each columns search primary key position + _.each(self.columns, function(c) { + if(c.name == idx) { + tmp_keys.push(c.pos); + } + }); + }); + + // re-calculate rows with no primary keys + self.temp_new_rows = []; + data.forEach(function(d, idx) { + var p_keys_idx = _.pick(d, tmp_keys); + if (Object.keys(p_keys_idx).length == 0) { + self.temp_new_rows.push(idx); + } + }); + data.getItemMetadata = self.data_view.getItemMetadata; + self.rows_to_disable = _.clone(self.temp_new_rows); + }, + // This function will delete selected row. _delete: function() { var self = this, deleted_keys = [], @@ -2242,6 +2298,7 @@ define( return (d && _.indexOf(deleted_keys, d.__temp_PK) > -1) }); } + self.rows_to_delete.apply(self, [data]); grid.resetActiveCell(); grid.setData(data, true); grid.setSelectedRows([]); @@ -2362,6 +2419,7 @@ define( data.splice(idx, 1); }); } + self.rows_to_delete.apply(self, [data]); grid.setData(data, true); grid.setSelectedRows([]); } @@ -3025,7 +3083,17 @@ define( var _pk = epicRandomString(8); row.__temp_PK = _pk; }); - data = data.concat(copied_rows); + + var temp_func = self.data_view.getItemMetadata, + count = Object.keys(data).length-1; + + _.each(copied_rows, function(row, idx) { + data[count] = row; + count++; + }); + + //update data_view + data.getItemMetadata = temp_func; grid.setData(data, true); grid.updateRowCount(); grid.setSelectedRows([]);