From ea006993f66bfd854ff2db86263dfb5989e37da1 Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 20 Dec 2022 23:46:44 +0100 Subject: [PATCH] added a "script executor" ribbon widget --- src/public/app/layouts/desktop_layout.js | 2 + src/public/app/services/keyboard_actions.js | 7 +- .../widgets/ribbon_widgets/script_executor.js | 65 +++++++++++++++++++ src/services/builtin_attributes.js | 2 + 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/public/app/widgets/ribbon_widgets/script_executor.js diff --git a/src/public/app/layouts/desktop_layout.js b/src/public/app/layouts/desktop_layout.js index 99b50150c..a893ca3d4 100644 --- a/src/public/app/layouts/desktop_layout.js +++ b/src/public/app/layouts/desktop_layout.js @@ -76,6 +76,7 @@ import NoteRevisionsButton from "../widgets/buttons/note_revisions_button.js"; import CodeButtonsWidget from "../widgets/floating_buttons/code_buttons.js"; import ApiLogWidget from "../widgets/api_log.js"; import HideFloatingButtonsButton from "../widgets/floating_buttons/hide_floating_buttons_button.js"; +import ScriptExecutorWidget from "../widgets/ribbon_widgets/script_executor.js"; export default class DesktopLayout { constructor(customWidgets) { @@ -129,6 +130,7 @@ export default class DesktopLayout { ) .child( new RibbonContainer() + .ribbon(new ScriptExecutorWidget()) .ribbon(new SearchDefinitionWidget()) .ribbon(new EditedNotesWidget()) .ribbon(new BookPropertiesWidget()) diff --git a/src/public/app/services/keyboard_actions.js b/src/public/app/services/keyboard_actions.js index 585cd934a..4a733c069 100644 --- a/src/public/app/services/keyboard_actions.js +++ b/src/public/app/services/keyboard_actions.js @@ -82,7 +82,12 @@ function updateDisplayedShortcuts($container) { if (action) { const title = $(el).attr('title'); const shortcuts = action.effectiveShortcuts.join(', '); - const newTitle = !title || !title.trim() ? shortcuts : `${title} (${shortcuts})`; + + if (title?.includes(shortcuts)) { + return; + } + + const newTitle = !title?.trim() ? shortcuts : `${title} (${shortcuts})`; $(el).attr('title', newTitle); } diff --git a/src/public/app/widgets/ribbon_widgets/script_executor.js b/src/public/app/widgets/ribbon_widgets/script_executor.js new file mode 100644 index 000000000..d4c49ee3c --- /dev/null +++ b/src/public/app/widgets/ribbon_widgets/script_executor.js @@ -0,0 +1,65 @@ +import NoteContextAwareWidget from "../note_context_aware_widget.js"; +import keyboardActionService from "../../services/keyboard_actions.js"; + +const TPL = ` +
+ + +
+ +
+ +
+
`; + +export default class ScriptExecutorWidget extends NoteContextAwareWidget { + isEnabled() { + return super.isEnabled() + && this.note + && (this.note.mime.startsWith('application/javascript') || this.isTriliumSqlite()) + && (this.note.hasLabel('executeDescription') || this.note.hasLabel('executeButton')); + } + + isTriliumSqlite() { + return this.note.mime === 'text/x-sqlite;schema=trilium'; + } + + getTitle() { + return { + show: this.isEnabled(), + activate: true, + title: this.isTriliumSqlite() ? 'Query' : 'Script', + icon: 'bx bx-run' + }; + } + + doRender() { + this.$widget = $(TPL); + this.contentSized(); + + this.$executeButton = this.$widget.find('.execute-button'); + this.$executeDescription = this.$widget.find('.execute-description'); + } + + async refreshWithNote(note) { + const executeTitle = note.getLabelValue('executeButton') + || (this.isTriliumSqlite() ? 'Execute Query' : 'Execute Script'); + + this.$executeButton.text(executeTitle); + this.$executeButton.attr('title', executeTitle); + keyboardActionService.updateDisplayedShortcuts(this.$widget);console.trace("ZZZ"); + + const executeDescription = note.getLabelValue('executeDescription'); + + if (executeDescription) { + this.$executeDescription.show().html(executeDescription); + } else { + this.$executeDescription.empty().hide(); + } + } +} diff --git a/src/services/builtin_attributes.js b/src/services/builtin_attributes.js index 43f67cea2..d39fff8f0 100644 --- a/src/services/builtin_attributes.js +++ b/src/services/builtin_attributes.js @@ -61,6 +61,8 @@ module.exports = [ { type: 'label', name: 'toc' }, { type: 'label', name: 'color' }, { type: 'label', name: 'keepCurrentHoisting'}, + { type: 'label', name: 'executeButton'}, + { type: 'label', name: 'executeDescription'}, // relation names { type: 'relation', name: 'internalLink' },