Skip to content

Commit

Permalink
BUGFIX: makes jsonb[] viewable and editable
Browse files Browse the repository at this point in the history
  • Loading branch information
jzwood authored and Paxa committed Jun 3, 2021
1 parent b83d81a commit 3b7a7e9
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 3 deletions.
13 changes: 10 additions & 3 deletions app/view_helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ declare global {
timeFormat: (date: string) => string
execTime: (time: number) => string
formatJson: (value: any) => string
formatJsonArray: (value: any) => string
formatArray: (value: any, format: string) => string
getIndexType: (indexSql: string) => string
escapeHTML: (unsafe: string) => string
Expand Down Expand Up @@ -125,6 +126,8 @@ var helpers = global.ViewHelpers = {

if (dataType == 'ARRAY' && Array.isArray(value)) {
formated = this.formatArray(value, format);
} else if (dataType === 'jsonb[]' && Array.isArray(value)) {
formated = this.formatJsonArray(value);
}

return formated;
Expand Down Expand Up @@ -276,15 +279,19 @@ var helpers = global.ViewHelpers = {
},

formatArray: function (value, format) {
var fomrmatted = value.map((element) => {
var formatted = value.map((element) => {
if (Array.isArray(element)) {
return this.formatArray(element, format);
} else {
return this.formatCell(element, format);
}
});

return '{' + fomrmatted.join(',') + '}';
return '{' + formatted.join(',') + '}';
},

formatJsonArray: function (value) {
return '[' + value.map(this.formatJson.bind(this)).join(',') + ']';
},

getIndexType: function (indexSql) {
Expand Down Expand Up @@ -365,4 +372,4 @@ var helpers = global.ViewHelpers = {
}
};

module.exports = helpers;
module.exports = helpers;
90 changes: 90 additions & 0 deletions views/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,96 @@ pug_html = pug_html + "Cancel\u003C\u002Fbutton\u003E\n \u003C\u002Fp\u003E\n\u
typeof selected !== 'undefined' ? selected : undefined));
;} catch (err) {pug.rethrow(err, pug_debug_filename, pug_debug_line, pug_debug_sources[pug_debug_filename]);};return pug_html;};
exports["dialogs/column_form"].content = "- data = data || {}\n\nform\n p\n label Name\n input(name=\"name\", value = data.column_name type=\"text\")\n\n p\n label Type\n select(name=\"type\")\n option\n each types, group in groupedTypes\n optgroup(label = group)\n each type in types\n if type\n - selected = data.udt_name && data.udt_name == type.udt_name\n option(value = type.udt_name || type.name, title = type.description, selected = selected)= type.name\n p\n a(href=\"https://www.postgresql.org/docs/current/datatype.html\", class=\"external docs-link\") Postgres Data Types\n\n p\n label Default value\n input(name=\"default_value\", value = data.column_default type=\"text\")\n\n p\n label Max length\n input(name=\"max_length\", value = data.character_maximum_length type=\"text\")\n\n p\n label\n input(type=\"hidden\", name=\"allow_null\" value=\"0\")\n input(type=\"checkbox\" name=\"allow_null\" value=\"1\", checked = (data.is_nullable == 'YES'))\n = \"Allow null\"\n\n input.pseudo-hidden(type=\"submit\")\n p.buttons\n if action == \"edit\"\n button.ok Update Column\n else\n button.ok Add Column\n button.cancel Cancel\n";
exports["dialogs/edit_value"] = function template(pug, locals) {var pug_html = "", pug_mixins = {}, pug_interp;var pug_debug_filename, pug_debug_line;try {var pug_debug_sources = {"views\u002Fdialogs\u002Fedit_value.jade":"form\n - valueIsNull = fieldType.is_nullable && value === null\n\n p\n - numericTypes = ['bigint', 'integer', 'real', 'smallint', 'double precision', 'numeric', 'decimal']\n if fieldType.data_type == \"integer\" || numericTypes.includes(fieldType.udt_name) || numericTypes.includes(fieldType.data_type)\n input.number-value(name=\"value\" type=\"number\" value=value disabled=valueIsNull)\n else if fieldType.udt_name == \"timestamp\" || fieldType.udt_name == \"timestamptz\" || fieldType.udt_name == \"date\" || fieldType.udt_name == \"timetz\"\n input.date-value(name=\"value\" type=\"text\" value=editDateFormat(value, fieldType.udt_name) disabled=valueIsNull)\n else if fieldType.udt_name == \"bool\"\n select(name=\"value\" disabled=valueIsNull)\n option(value=\"true\" selected=value) true\n option(value=\"false\" selected=(value === false) ) false\n else\n if fieldType.udt_name == \"json\" || fieldType.udt_name == \"jsonb\"\n - value = JSON.stringify(value, null, 2)\n else if (fieldType.data_type == \"jsonb[]\" && Array.isArray(value))\n - value = \"{\" + value.map(val =\u003E \"\\\"\" + JSON.stringify(val).replace(\u002F\"\u002Fg, '\\\\\"') + \"\\\"\").toString() + \"}\"\n textarea(name=\"value\" placeholder=fieldType.column_default disabled=valueIsNull)= value\n\n if fieldType.is_nullable\n label\n = \"Null\"\n input.value-is-null(type=\"checkbox\" name=\"value_is_null\" value=\"true\" checked=valueIsNull )\n\n p.buttons\n button.ok Update\n button.cancel Cancel\n"};
;
var locals_for_with = (locals || {});

(function (Array, JSON, editDateFormat, fieldType, numericTypes, value, valueIsNull) {
var pug_indent = [];
;pug_debug_line = 1;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n\u003Cform\u003E";
;pug_debug_line = 2;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
valueIsNull = fieldType.is_nullable && value === null
;pug_debug_line = 4;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cp\u003E";
;pug_debug_line = 5;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
numericTypes = ['bigint', 'integer', 'real', 'smallint', 'double precision', 'numeric', 'decimal']
;pug_debug_line = 6;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
if (fieldType.data_type == "integer" || numericTypes.includes(fieldType.udt_name) || numericTypes.includes(fieldType.data_type)) {
;pug_debug_line = 7;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cinput" + (" class=\"number-value\""+" name=\"value\" type=\"number\""+pug.attr("value", value, true, false)+pug.attr("disabled", valueIsNull, true, false)) + "\u002F\u003E";
}
else
if (fieldType.udt_name == "timestamp" || fieldType.udt_name == "timestamptz" || fieldType.udt_name == "date" || fieldType.udt_name == "timetz") {
;pug_debug_line = 9;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cinput" + (" class=\"date-value\""+" name=\"value\" type=\"text\""+pug.attr("value", editDateFormat(value, fieldType.udt_name), true, false)+pug.attr("disabled", valueIsNull, true, false)) + "\u002F\u003E";
}
else
if (fieldType.udt_name == "bool") {
;pug_debug_line = 11;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cselect" + (" name=\"value\""+pug.attr("disabled", valueIsNull, true, false)) + "\u003E";
;pug_debug_line = 12;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Coption" + (" value=\"true\""+pug.attr("selected", value, true, false)) + "\u003E";
;pug_debug_line = 12;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "true\u003C\u002Foption\u003E";
;pug_debug_line = 13;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Coption" + (" value=\"false\""+pug.attr("selected", (value === false), true, false)) + "\u003E";
;pug_debug_line = 13;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "false\u003C\u002Foption\u003E\n \u003C\u002Fselect\u003E";
}
else {
;pug_debug_line = 15;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
if (fieldType.udt_name == "json" || fieldType.udt_name == "jsonb") {
;pug_debug_line = 16;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
value = JSON.stringify(value, null, 2)
}
else
if ((fieldType.data_type == "jsonb[]" && Array.isArray(value))) {
;pug_debug_line = 18;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
value = "{" + value.map(val => "\"" + JSON.stringify(val).replace(/"/g, '\\"') + "\"").toString() + "}"
}
;pug_debug_line = 19;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Ctextarea" + (" name=\"value\""+pug.attr("placeholder", fieldType.column_default, true, false)+pug.attr("disabled", valueIsNull, true, false)) + "\u003E";
;pug_debug_line = 19;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + (pug.escape(null == (pug_interp = value) ? "" : pug_interp)) + "\u003C\u002Ftextarea\u003E";
}
pug_html = pug_html + "\n \u003C\u002Fp\u003E";
;pug_debug_line = 21;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
if (fieldType.is_nullable) {
;pug_debug_line = 22;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Clabel\u003E";
;pug_debug_line = 23;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + (pug.escape(null == (pug_interp = "Null") ? "" : pug_interp));
;pug_debug_line = 24;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cinput" + (" class=\"value-is-null\""+" type=\"checkbox\" name=\"value_is_null\" value=\"true\""+pug.attr("checked", valueIsNull, true, false)) + "\u002F\u003E\n \u003C\u002Flabel\u003E";
}
;pug_debug_line = 26;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cp class=\"buttons\"\u003E";
;pug_debug_line = 27;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cbutton class=\"ok\"\u003E";
;pug_debug_line = 27;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "Update\u003C\u002Fbutton\u003E";
;pug_debug_line = 28;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "\n \u003Cbutton class=\"cancel\"\u003E";
;pug_debug_line = 28;pug_debug_filename = "views\u002Fdialogs\u002Fedit_value.jade";
pug_html = pug_html + "Cancel\u003C\u002Fbutton\u003E\n \u003C\u002Fp\u003E\n\u003C\u002Fform\u003E";
}.call(this, "Array" in locals_for_with ?
locals_for_with.Array :
typeof Array !== 'undefined' ? Array : undefined, "JSON" in locals_for_with ?
locals_for_with.JSON :
typeof JSON !== 'undefined' ? JSON : undefined, "editDateFormat" in locals_for_with ?
locals_for_with.editDateFormat :
typeof editDateFormat !== 'undefined' ? editDateFormat : undefined, "fieldType" in locals_for_with ?
locals_for_with.fieldType :
typeof fieldType !== 'undefined' ? fieldType : undefined, "numericTypes" in locals_for_with ?
locals_for_with.numericTypes :
typeof numericTypes !== 'undefined' ? numericTypes : undefined, "value" in locals_for_with ?
locals_for_with.value :
typeof value !== 'undefined' ? value : undefined, "valueIsNull" in locals_for_with ?
locals_for_with.valueIsNull :
typeof valueIsNull !== 'undefined' ? valueIsNull : undefined));
;} catch (err) {pug.rethrow(err, pug_debug_filename, pug_debug_line, pug_debug_sources[pug_debug_filename]);};return pug_html;};
exports["dialogs/edit_value"].content = "form\n - valueIsNull = fieldType.is_nullable && value === null\n\n p\n - numericTypes = ['bigint', 'integer', 'real', 'smallint', 'double precision', 'numeric', 'decimal']\n if fieldType.data_type == \"integer\" || numericTypes.includes(fieldType.udt_name) || numericTypes.includes(fieldType.data_type)\n input.number-value(name=\"value\" type=\"number\" value=value disabled=valueIsNull)\n else if fieldType.udt_name == \"timestamp\" || fieldType.udt_name == \"timestamptz\" || fieldType.udt_name == \"date\" || fieldType.udt_name == \"timetz\"\n input.date-value(name=\"value\" type=\"text\" value=editDateFormat(value, fieldType.udt_name) disabled=valueIsNull)\n else if fieldType.udt_name == \"bool\"\n select(name=\"value\" disabled=valueIsNull)\n option(value=\"true\" selected=value) true\n option(value=\"false\" selected=(value === false) ) false\n else\n if fieldType.udt_name == \"json\" || fieldType.udt_name == \"jsonb\"\n - value = JSON.stringify(value, null, 2)\n else if (fieldType.data_type == \"jsonb[]\" && Array.isArray(value))\n - value = \"{\" + value.map(val => \"\\\"\" + JSON.stringify(val).replace(/\"/g, '\\\\\"') + \"\\\"\").toString() + \"}\"\n textarea(name=\"value\" placeholder=fieldType.column_default disabled=valueIsNull)= value\n\n if fieldType.is_nullable\n label\n = \"Null\"\n input.value-is-null(type=\"checkbox\" name=\"value_is_null\" value=\"true\" checked=valueIsNull )\n\n p.buttons\n button.ok Update\n button.cancel Cancel\n";
exports["dialogs/export_file"] = function template(pug, locals) {var pug_html = "", pug_mixins = {}, pug_interp;var pug_debug_filename, pug_debug_line;try {var pug_debug_sources = {"views\u002Fdialogs\u002Fexport_file.jade":"header\n = \"Exporting database '\"\n b= database\n = \"'\"\n\nform\n p.save-to-file\n = \"Save to file:\"\n input(type=\"text\" name=\"export_to_file\" readonly placeholder=\"click to select file...\")\n p\n label\n = \"Export structure\"\n input(type=\"checkbox\" name=\"export_structure\" checked)\n p\n label\n = \"Export data\"\n input(type=\"checkbox\" name=\"export_data\" checked)\n\n p\n label\n = \"Objects ownership\"\n input(type=\"checkbox\" name=\"objects_ownership\")\n\n code.result\n\n p.buttons\n button.ok Start\n button.cancel Cancel\n p.buttons.close-btn.is-hidden\n button.cancel Close"};
;
var locals_for_with = (locals || {});
Expand Down
2 changes: 2 additions & 0 deletions views/dialogs/edit_value.jade
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ form
else
if fieldType.udt_name == "json" || fieldType.udt_name == "jsonb"
- value = JSON.stringify(value, null, 2)
else if (fieldType.data_type == "jsonb[]" && Array.isArray(value))
- value = "{" + value.map(val => "\"" + JSON.stringify(val).replace(/"/g, '\\"') + "\"").toString() + "}"
textarea(name="value" placeholder=fieldType.column_default disabled=valueIsNull)= value

if fieldType.is_nullable
Expand Down

0 comments on commit 3b7a7e9

Please sign in to comment.