From 54ba1fbe593a20261eb061ca262aab45b64329de Mon Sep 17 00:00:00 2001 From: Surinder Kumar Date: Sat, 4 Feb 2017 14:10:30 +0100 Subject: [PATCH] Support setting text fields to empty strings or NULL in the data editor grid. Fixes #1790 --- .../js/slickgrid/slick.pgadmin.editors.js | 107 +++++++++++++++++- .../js/slickgrid/slick.pgadmin.formatters.js | 22 +++- .../templates/sqleditor/js/sqleditor.js | 3 +- 3 files changed, 123 insertions(+), 9 deletions(-) diff --git a/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js b/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js index 61c76e0ef..23af4efd4 100644 --- a/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js +++ b/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js @@ -15,7 +15,8 @@ "ReadOnlyText": ReadOnlyTextEditor, "ReadOnlyCheckbox": ReadOnlyCheckboxEditor, "ReadOnlypgText": ReadOnlypgTextEditor, - "ReadOnlyJsonText": ReadOnlyJsonTextEditor + "ReadOnlyJsonText": ReadOnlyJsonTextEditor, + "CustomNumber": CustomNumberEditor } } }); @@ -106,13 +107,36 @@ $input.focus(); }; + // When text editor opens this.loadValue = function (item) { - $input.val(defaultValue = item[args.column.field]); - $input.select(); + if (item[args.column.field] === "") { + $input.val("''"); + } + else { + $input.val(defaultValue = item[args.column.field]); + $input.select(); + } }; this.serializeValue = function () { - return $input.val(); + var value = $input.val(); + // If empty return null + if (value === "") { + return null; + } + // single/double quotes represent an empty string + // If found return '' + else if (value === "''" || value === '""') { + return ''; + } + else { + // If found string literals - \"\", \'\', \\'\\' and \\\\'\\\\' + // then remove slashes. + value = value.replace("\\'\\'", "''"); + value = value.replace('\\"\\"', '""'); + value = value = value.replace(/\\\\/g, '\\'); + return value; + } }; this.applyValue = function (item, state) { @@ -246,6 +270,9 @@ }; this.serializeValue = function () { + if ($input.val() === "") { + return null; + } return $input.val(); }; @@ -637,4 +664,76 @@ this.init(); } + function CustomNumberEditor(args) { + var $input; + var defaultValue; + var scope = this; + + this.init = function () { + $input = $(""); + + $input.bind("keydown.nav", function (e) { + if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) { + e.stopImmediatePropagation(); + } + }); + + $input.appendTo(args.container); + $input.focus().select(); + }; + + this.destroy = function () { + $input.remove(); + }; + + this.focus = function () { + $input.focus(); + }; + + this.loadValue = function (item) { + defaultValue = item[args.column.field]; + $input.val(defaultValue); + $input[0].defaultValue = defaultValue; + $input.select(); + }; + + this.serializeValue = function () { + if ($input.val() === "") { + return null; + } + return parseInt($input.val(), 10) || 0; + }; + + this.applyValue = function (item, state) { + item[args.column.field] = state; + }; + + this.isValueChanged = function () { + return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue); + }; + + this.validate = function () { + if (isNaN($input.val())) { + return { + valid: false, + msg: "Please enter a valid integer" + }; + } + + if (args.column.validator) { + var validationResults = args.column.validator($input.val()); + if (!validationResults.valid) { + return validationResults; + } + } + + return { + valid: true, + msg: null + }; + }; + + this.init(); + } + })(jQuery); diff --git a/web/pgadmin/static/js/slickgrid/slick.pgadmin.formatters.js b/web/pgadmin/static/js/slickgrid/slick.pgadmin.formatters.js index 3b4aa3cb3..6e0888513 100644 --- a/web/pgadmin/static/js/slickgrid/slick.pgadmin.formatters.js +++ b/web/pgadmin/static/js/slickgrid/slick.pgadmin.formatters.js @@ -12,7 +12,8 @@ "Formatters": { "JsonString": JsonFormatter, "Numbers": NumbersFormatter, - "Checkmark": CheckmarkFormatter + "Checkmark": CheckmarkFormatter, + "Text": TextFormatter, } } }); @@ -41,9 +42,13 @@ } function NumbersFormatter(row, cell, value, columnDef, dataContext) { - if (value == null || value === "") { - return ""; - } else { + if (_.isUndefined(value) || value === null) { + return "[null]"; + } + else if (value === "") { + return ''; + } + else { return "" + value + ""; } } @@ -55,4 +60,13 @@ return value ? "true" : "false"; } + function TextFormatter(row, cell, value, columnDef, dataContext) { + if (_.isUndefined(value) || value === null) { + return "[null]"; + } + else { + return value; + } + } + })(jQuery); diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js index 5e400c7e0..33c913559 100644 --- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js @@ -630,7 +630,7 @@ define( : Slick.Editors.ReadOnlyJsonText; options['formatter'] = Slick.Formatters.JsonString; } else if(c.cell == 'number') { - options['editor'] = is_editable ? Slick.Editors.Text + options['editor'] = is_editable ? Slick.Editors.CustomNumber : Slick.Editors.ReadOnlyText; options['formatter'] = Slick.Formatters.Numbers; } else if(c.cell == 'boolean') { @@ -640,6 +640,7 @@ define( } else { options['editor'] = is_editable ? Slick.Editors.pgText : Slick.Editors.ReadOnlypgText; + options['formatter'] = Slick.Formatters.Text; } grid_columns.push(options)