From 02d9752abf256d6dd26333a3b3945c92c280bf4b Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 29 Dec 2020 22:27:31 +0100 Subject: [PATCH] refactoring of sql console into separate widgets --- package-lock.json | 32 ++-- package.json | 4 +- .../layouts/desktop_extra_window_layout.js | 2 - .../app/layouts/desktop_main_window_layout.js | 6 +- src/public/app/services/entrypoints.js | 8 +- src/public/app/widgets/note_list.js | 14 +- src/public/app/widgets/run_script_buttons.js | 33 ---- src/public/app/widgets/sql_result.js | 64 +++++++ src/public/app/widgets/sql_table_schemas.js | 83 +++++++++ .../app/widgets/type_widgets/editable_code.js | 162 ++---------------- src/routes/api/sql.js | 9 +- src/routes/routes.js | 2 +- 12 files changed, 201 insertions(+), 218 deletions(-) delete mode 100644 src/public/app/widgets/run_script_buttons.js create mode 100644 src/public/app/widgets/sql_result.js create mode 100644 src/public/app/widgets/sql_table_schemas.js diff --git a/package-lock.json b/package-lock.json index 9ccdc6b52..eddc86023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1792,9 +1792,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001168", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001168.tgz", - "integrity": "sha512-P2zmX7swIXKu+GMMR01TWa4csIKELTNnZKc+f1CjebmZJQtTAEXmpQSoKVJVVcvPGAA0TEYTOUp3VehavZSFPQ==", + "version": "1.0.30001170", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz", + "integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==", "dev": true }, "caseless": { @@ -3209,9 +3209,9 @@ } }, "electron-to-chromium": { - "version": "1.3.629", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.629.tgz", - "integrity": "sha512-iSPPJtPvHrMAvYOt+9cdbDmTasPqwnwz4lkP8Dn200gDNUBQOLQ96xUsWXBwXslAo5XxdoXAoQQ3RAy4uao9IQ==", + "version": "1.3.633", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.633.tgz", + "integrity": "sha512-bsVCsONiVX1abkWdH7KtpuDAhsQ3N3bjPYhROSAXE78roJKet0Y5wznA14JE9pzbwSZmSMAW6KiKYf1RvbTJkA==", "dev": true }, "electron-window-state": { @@ -3250,13 +3250,13 @@ } }, "enhanced-resolve": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz", - "integrity": "sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz", + "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.0.0" + "tapable": "^2.2.0" }, "dependencies": { "graceful-fs": { @@ -4142,9 +4142,9 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "helmet": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.2.0.tgz", - "integrity": "sha512-aoiSxXMd0ks1ojYpSCFoCRzgv4rY/uB9jKStaw8PkXwsdLYa/Gq+Nc5l0soH0cwBIsLAlujPnx4HLQs+LaXCrQ==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.3.1.tgz", + "integrity": "sha512-WsafDyKsIexB0+pUNkq3rL1rB5GVAghR68TP8ssM9DPEMzfBiluEQlVzJ/FEj6Vq2Ag3CNuxf7aYMjXrN0X49Q==" }, "hosted-git-info": { "version": "2.8.5", @@ -7597,9 +7597,9 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.0.tgz", - "integrity": "sha512-ubWv7iP54RqAC/VjixgpnLLogCFbAfSOREcSWnnOlZEU8GICC5eKmJSu6YEnph2N2amKqY9rvxSwgyHxVqpaRw==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.1.tgz", + "integrity": "sha512-tNUIdAmYJv+nupRs/U/gqmADm6fgrf5xE+rSlSsf2PgsGO7j2WG7ccU6AWNlOJlHFl+HnmXlBmHIkiLf+XA9mQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", diff --git a/package.json b/package.json index dc0ba5e65..ceb0f4cf9 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "express": "4.17.1", "express-session": "1.17.1", "fs-extra": "9.0.1", - "helmet": "4.2.0", + "helmet": "4.3.1", "html": "1.0.0", "html2plaintext": "2.1.2", "http-proxy-agent": "4.0.1", @@ -86,7 +86,7 @@ "jsdoc": "3.6.6", "lorem-ipsum": "2.0.3", "rcedit": "3.0.0", - "webpack": "5.11.0", + "webpack": "5.11.1", "webpack-cli": "4.3.0" }, "optionalDependencies": { diff --git a/src/public/app/layouts/desktop_extra_window_layout.js b/src/public/app/layouts/desktop_extra_window_layout.js index c3394512c..535441cff 100644 --- a/src/public/app/layouts/desktop_extra_window_layout.js +++ b/src/public/app/layouts/desktop_extra_window_layout.js @@ -5,7 +5,6 @@ import TitleBarButtonsWidget from "../widgets/title_bar_buttons.js"; import NoteTreeWidget from "../widgets/note_tree.js"; import TabCachingWidget from "../widgets/tab_caching_widget.js"; import NoteTitleWidget from "../widgets/note_title.js"; -import RunScriptButtonsWidget from "../widgets/run_script_buttons.js"; import NoteTypeWidget from "../widgets/note_type.js"; import NoteActionsWidget from "../widgets/note_actions.js"; import NoteDetailWidget from "../widgets/note_detail.js"; @@ -35,7 +34,6 @@ export default class DesktopExtraWindowLayout { .overflowing() .cssBlock('.title-row > * { margin: 5px 5px 0 5px; }') .child(new NoteTitleWidget()) - .child(new RunScriptButtonsWidget().hideInZenMode()) .child(new NoteTypeWidget().hideInZenMode()) .child(new NoteActionsWidget().hideInZenMode()) ) diff --git a/src/public/app/layouts/desktop_main_window_layout.js b/src/public/app/layouts/desktop_main_window_layout.js index 5f7fde1cd..4428e9d5e 100644 --- a/src/public/app/layouts/desktop_main_window_layout.js +++ b/src/public/app/layouts/desktop_main_window_layout.js @@ -9,7 +9,6 @@ import TabCachingWidget from "../widgets/tab_caching_widget.js"; import NotePathsWidget from "../widgets/note_paths.js"; import NoteTitleWidget from "../widgets/note_title.js"; import OwnedAttributeListWidget from "../widgets/attribute_widgets/owned_attribute_list.js"; -import RunScriptButtonsWidget from "../widgets/run_script_buttons.js"; import NoteTypeWidget from "../widgets/note_type.js"; import NoteActionsWidget from "../widgets/note_actions.js"; import NoteDetailWidget from "../widgets/note_detail.js"; @@ -27,6 +26,8 @@ import InheritedAttributesWidget from "../widgets/inherited_attribute_list.js"; import NoteListWidget from "../widgets/note_list.js"; import SearchDefinitionWidget from "../widgets/search_definition.js"; import Container from "../widgets/container.js"; +import SqlResultWidget from "../widgets/sql_result.js"; +import SqlTableSchemasWidget from "../widgets/sql_table_schemas.js"; const RIGHT_PANE_CSS = ` + +
+`; + +export default class SqlResultWidget extends TabAwareWidget { + isEnabled() { + return this.note + && this.note.mime === 'text/x-sqlite;schema=trilium' + && super.isEnabled(); + } + + doRender() { + this.$widget = $(TPL); + this.overflowing(); + + this.$sqlConsoleResultContainer = this.$widget.find('.sql-console-result-container'); + } + + async sqlQueryResultsEvent({results}) { + this.$sqlConsoleResultContainer.empty(); + + for (const rows of results) { + if (rows.length === 0) { + continue; + } + + const $table = $(''); + this.$sqlConsoleResultContainer.append($table); + + const result = rows[0]; + const $row = $(""); + + for (const key in result) { + $row.append($(""); + + for (const key in result) { + $row.append($("
").html(key)); + } + + $table.append($row); + + for (const result of rows) { + const $row = $("
").html(result[key])); + } + + $table.append($row); + } + } + } +} diff --git a/src/public/app/widgets/sql_table_schemas.js b/src/public/app/widgets/sql_table_schemas.js new file mode 100644 index 000000000..039eaf01e --- /dev/null +++ b/src/public/app/widgets/sql_table_schemas.js @@ -0,0 +1,83 @@ +import TabAwareWidget from "./tab_aware_widget.js"; +import treeService from "../services/tree.js"; +import linkService from "../services/link.js"; +import hoistedNoteService from "../services/hoisted_note.js"; +import server from "../services/server.js"; +import toastService from "../services/toast.js"; + +const TPL = ` +
+ + + Tables: + +
`; + +export default class SqlTableSchemasWidget extends TabAwareWidget { + isEnabled() { + return this.note + && this.note.mime === 'text/x-sqlite;schema=trilium' + && super.isEnabled(); + } + + doRender() { + this.$widget = $(TPL); + this.overflowing(); + + this.$sqlConsoleTableSchemas = this.$widget.find('.sql-table-schemas'); + } + + async refreshWithNote(note) { + if (this.tableSchemasShown) { + return; + } + + this.tableSchemasShown = true; + + const tableSchema = await server.get('sql/schema'); + + for (const table of tableSchema) { + const $tableLink = $('