diff --git a/web/package.json b/web/package.json index 9a1a1420..f43dd12b 100644 --- a/web/package.json +++ b/web/package.json @@ -59,6 +59,7 @@ "bignumber.js": "^6.0.0", "bootstrap": "^4.1.3", "bootstrap-datepicker": "^1.7.0", + "bootstrap4-toggle": "3.4.0", "bowser": "1.6.1", "browserify": "~14.1.0", "codemirror": "^5.43.0", @@ -75,6 +76,7 @@ "jquery": "3.3.1", "jquery-contextmenu": "^2.6.4", "jquery-ui": "^1.12.1", + "json-bignumber": "^1.0.1", "leaflet": "^1.3.3", "moment": "^2.20.1", "moment-timezone": "^0.5.21", @@ -97,8 +99,7 @@ "underscore.string": "^3.3.4", "watchify": "~3.9.0", "webcabin-docker": "git+https://github.com/EnterpriseDB/wcDocker/#9cf81f03bb350b76b77a264f1db5d55391d5e424", - "wkx": "^0.4.5", - "bootstrap4-toggle": "3.4.0" + "wkx": "^0.4.5" }, "scripts": { "linter": "yarn eslint --no-eslintrc -c .eslintrc.js --ext .js --ext .jsx .", diff --git a/web/pgadmin/static/js/slickgrid/editors.js b/web/pgadmin/static/js/slickgrid/editors.js index 0fae86ca..731d122e 100644 --- a/web/pgadmin/static/js/slickgrid/editors.js +++ b/web/pgadmin/static/js/slickgrid/editors.js @@ -13,7 +13,9 @@ * @namespace Slick */ -(function($) { +import JSONBigNumber from 'json-bignumber'; + +(function($, JSONBigNumber) { // register namespace $.extend(true, window, { 'Slick': { @@ -108,7 +110,7 @@ } } else { if(column_type === 'jsonb') { - item[args.column.field] = JSON.parse(state); + item[args.column.field] = JSONBigNumber.stringify(JSONBigNumber.parse(state)); } else { item[args.column.field] = state; } @@ -369,13 +371,13 @@ this.loadValue = function(item) { var data = defaultValue = item[args.column.field]; /* If jsonb or array */ - if (data && typeof data === 'object' && !Array.isArray(data)) { - data = JSON.stringify(data, null, 4); + if(args.column.column_type_internal === 'jsonb' && !Array.isArray(data)) { + data = JSONBigNumber.stringify(JSONBigNumber.parse(data), null, 4); } else if (Array.isArray(data)) { var temp = []; $.each(data, function(i, val) { if (typeof val === 'object') { - temp.push(JSON.stringify(val, null, 4)); + temp.push(JSONBigNumber.stringify(val, null, 4)); } else { temp.push(val); } @@ -411,7 +413,8 @@ }; this.validate = function() { - if(args.column.column_type_internal === 'jsonb') { + if(args.column.column_type_internal === 'jsonb' || + args.column.column_type_internal === 'json') { try { JSON.parse($input.val()); } catch(e) { @@ -597,13 +600,13 @@ this.loadValue = function(item) { var data = defaultValue = item[args.column.field]; - if (typeof data === 'object' && !Array.isArray(data)) { - data = JSON.stringify(data, null, 4); + if(args.column.column_type_internal === 'jsonb' && !Array.isArray(data)) { + data = JSONBigNumber.stringify(JSONBigNumber.parse(data), null, 4); } else if (Array.isArray(data)) { var temp = []; $.each(data, function(i, val) { if (typeof val === 'object') { - temp.push(JSON.stringify(val, null, 4)); + temp.push(JSONBigNumber.stringify(val, null, 4)); } else { temp.push(val); } @@ -988,4 +991,4 @@ this.init(); } -})(window.jQuery); +})(window.jQuery, JSONBigNumber); diff --git a/web/pgadmin/utils/driver/psycopg2/typecast.py b/web/pgadmin/utils/driver/psycopg2/typecast.py index 1f462f08..fe0edccd 100644 --- a/web/pgadmin/utils/driver/psycopg2/typecast.py +++ b/web/pgadmin/utils/driver/psycopg2/typecast.py @@ -170,6 +170,7 @@ def register_global_typecasters(): # Treat JSON data as text because converting it to dict alters the data # which should not happen as per postgres docs psycopg2.extras.register_default_json(loads=lambda x: x) + psycopg2.extras.register_default_jsonb(loads=lambda x: x) # pysycopg2 adapt does not support dict by default. Need to register # Used http://initd.org/psycopg/docs/extras.html#json-adaptation diff --git a/web/webpack.shim.js b/web/webpack.shim.js index 2244072f..2a59c23d 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -156,6 +156,7 @@ var webpackShimConfig = { 'jquery.contextmenu': path.join(__dirname, './node_modules/jquery-contextmenu/dist/jquery.contextMenu'), 'dropzone': path.join(__dirname, './node_modules/dropzone/dist/dropzone'), 'bignumber': path.join(__dirname, './node_modules/bignumber.js/bignumber'), + 'json-bignumber': path.join(__dirname, './node_modules/json-bignumber/dist/JSONBigNumber.min'), 'snap.svg': path.join(__dirname, './node_modules/snapsvg/dist/snap.svg'), 'spectrum': path.join(__dirname, './node_modules/spectrum-colorpicker/spectrum'), 'mousetrap': path.join(__dirname, './node_modules/mousetrap'),