From ca041bb658f54ef8e199f9f0d80525a996eebeb9 Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 19 Oct 2023 08:58:04 +0200 Subject: [PATCH 1/6] fix expanded status when moving note trees --- src/public/app/widgets/note_tree.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/public/app/widgets/note_tree.js b/src/public/app/widgets/note_tree.js index a586dfbde..20d064a80 100644 --- a/src/public/app/widgets/note_tree.js +++ b/src/public/app/widgets/note_tree.js @@ -1147,6 +1147,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { let parentsOfAddedNodes = []; const allBranchRows = loadResults.getBranchRows(); + // TODO: this flag is suspicious - why does it matter that all branches in a particular update are deleted? const allBranchesDeleted = allBranchRows.every(branchRow => !!branchRow.isDeleted); for (const branchRow of allBranchRows) { @@ -1159,8 +1160,8 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { noteIdsToUpdate.add(branchRow.noteId); } - for (const node of this.getNodesByBranch(branchRow)) { - if (branchRow.isDeleted) { + if (branchRow.isDeleted) { + for (const node of this.getNodesByBranch(branchRow)) { if (node.isActive()) { if (allBranchesDeleted) { const newActiveNode = node.getNextSibling() @@ -1181,9 +1182,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { noteIdsToUpdate.add(branchRow.parentNoteId); } - } - - if (!branchRow.isDeleted) { + } else { for (const parentNode of this.getNodesByNoteId(branchRow.parentNoteId)) { parentsOfAddedNodes.push(parentNode) @@ -1194,12 +1193,16 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { const found = (parentNode.getChildren() || []).find(child => child.data.noteId === branchRow.noteId); if (!found) { // make sure it's loaded - await froca.getNote(branchRow.noteId); + const note = await froca.getNote(branchRow.noteId); const frocaBranch = froca.getBranch(branchRow.branchId); // we're forcing lazy since it's not clear if the whole required subtree is in froca parentNode.addChildren([this.prepareNode(frocaBranch, true)]); + if (frocaBranch.isExpanded && note.hasChildren()) { + noteIdsToReload.add(frocaBranch.noteId); + } + this.sortChildren(parentNode); // this might be a first child which would force an icon change From b1d4a258a147977cd6bb5f28b81a9f5828139911 Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 19 Oct 2023 09:03:49 +0200 Subject: [PATCH 2/6] move FAB down in canvas --- src/public/app/widgets/floating_buttons/floating_buttons.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/public/app/widgets/floating_buttons/floating_buttons.js b/src/public/app/widgets/floating_buttons/floating_buttons.js index 1ba2d57cd..75c30ca75 100644 --- a/src/public/app/widgets/floating_buttons/floating_buttons.js +++ b/src/public/app/widgets/floating_buttons/floating_buttons.js @@ -16,6 +16,10 @@ const TPL = ` z-index: 100; } + .type-canvas .floating-buttons-children { + top: 70px; + } + .floating-buttons-children > *:not(.hidden-int):not(.no-content-hidden) { margin-left: 10px; } From b01fe5ead9268784fb133a8cfa53670927ba0e3b Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 19 Oct 2023 09:20:23 +0200 Subject: [PATCH 3/6] add canvas properties with a button to copy reference to clipboard which allows inserting canvas as an image into text notes --- src/public/app/layouts/desktop_layout.js | 2 + src/public/app/services/utils.js | 11 +++- .../ribbon_widgets/canvas_properties.js | 56 +++++++++++++++++++ .../ribbon_widgets/image_properties.js | 6 +- src/public/app/widgets/type_widgets/image.js | 2 +- 5 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 src/public/app/widgets/ribbon_widgets/canvas_properties.js diff --git a/src/public/app/layouts/desktop_layout.js b/src/public/app/layouts/desktop_layout.js index 76a05b7e2..05b4a386e 100644 --- a/src/public/app/layouts/desktop_layout.js +++ b/src/public/app/layouts/desktop_layout.js @@ -78,6 +78,7 @@ import HideFloatingButtonsButton from "../widgets/floating_buttons/hide_floating import ScriptExecutorWidget from "../widgets/ribbon_widgets/script_executor.js"; import MovePaneButton from "../widgets/buttons/move_pane_button.js"; import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js"; +import CanvasPropertiesWidget from "../widgets/ribbon_widgets/canvas_properties.js"; export default class DesktopLayout { constructor(customWidgets) { @@ -144,6 +145,7 @@ export default class DesktopLayout { .ribbon(new NotePropertiesWidget()) .ribbon(new FilePropertiesWidget()) .ribbon(new ImagePropertiesWidget()) + .ribbon(new CanvasPropertiesWidget()) .ribbon(new BasicPropertiesWidget()) .ribbon(new OwnedAttributeListWidget()) .ribbon(new InheritedAttributesWidget()) diff --git a/src/public/app/services/utils.js b/src/public/app/services/utils.js index e17606c1e..8be7c3056 100644 --- a/src/public/app/services/utils.js +++ b/src/public/app/services/utils.js @@ -495,6 +495,14 @@ function copyHtmlToClipboard(content) { navigator.clipboard.write([clipboardItem]); } +/** + * @param {FNote} note + * @return {string} + */ +function createImageSrcUrl(note) { + return `api/images/${note.noteId}/${encodeURIComponent(note.title)}?timestamp=${Date.now()}`; +} + export default { reloadFrontendApp, parseDate, @@ -533,5 +541,6 @@ export default { sleep, escapeRegExp, areObjectsEqual, - copyHtmlToClipboard + copyHtmlToClipboard, + createImageSrcUrl }; diff --git a/src/public/app/widgets/ribbon_widgets/canvas_properties.js b/src/public/app/widgets/ribbon_widgets/canvas_properties.js new file mode 100644 index 000000000..d36bdecf0 --- /dev/null +++ b/src/public/app/widgets/ribbon_widgets/canvas_properties.js @@ -0,0 +1,56 @@ +import NoteContextAwareWidget from "../note_context_aware_widget.js"; +import utils from "../../services/utils.js"; +import imageService from "../../services/image.js"; + +const TPL = ` +
+
+ +
+ +
+
`; + +export default class CanvasPropertiesWidget extends NoteContextAwareWidget { + get name() { + return "canvasProperties"; + } + + get toggleCommand() { + return "toggleRibbonTabCanvasProperties"; + } + + isEnabled() { + return this.note && this.note.type === 'canvas'; + } + + getTitle() { + return { + show: this.isEnabled(), + activate: false, + title: 'Canvas', + icon: 'bx bx-pen' + }; + } + + doRender() { + this.$widget = $(TPL); + this.contentSized(); + + this.$hiddenCanvasCopy = this.$widget.find('.hidden-canvas-copy'); + + this.$copyReferenceToClipboardButton = this.$widget.find(".canvas-copy-reference-to-clipboard"); + this.$copyReferenceToClipboardButton.on('click', () => { + this.$hiddenCanvasCopy.empty().append( + $("") + .attr("src", utils.createImageSrcUrl(this.note)) + ); + + imageService.copyImageReferenceToClipboard(this.$hiddenCanvasCopy); + + this.$hiddenCanvasCopy.empty(); + }); + } +} diff --git a/src/public/app/widgets/ribbon_widgets/image_properties.js b/src/public/app/widgets/ribbon_widgets/image_properties.js index 064139bb0..18bfdd651 100644 --- a/src/public/app/widgets/ribbon_widgets/image_properties.js +++ b/src/public/app/widgets/ribbon_widgets/image_properties.js @@ -61,9 +61,13 @@ export default class ImagePropertiesWidget extends NoteContextAwareWidget { doRender() { this.$widget = $(TPL); this.contentSized(); + this.$copyReferenceToClipboardButton = this.$widget.find(".image-copy-reference-to-clipboard"); + this.$copyReferenceToClipboardButton.on('click', () => this.triggerEvent(`copyImageReferenceToClipboard`, {ntxId: this.noteContext.ntxId})); + this.$uploadNewRevisionButton = this.$widget.find(".image-upload-new-revision"); this.$uploadNewRevisionInput = this.$widget.find(".image-upload-new-revision-input"); + this.$fileName = this.$widget.find(".image-filename"); this.$fileType = this.$widget.find(".image-filetype"); this.$fileSize = this.$widget.find(".image-filesize"); @@ -74,8 +78,6 @@ export default class ImagePropertiesWidget extends NoteContextAwareWidget { this.$imageDownloadButton = this.$widget.find(".image-download"); this.$imageDownloadButton.on('click', () => openService.downloadFileNote(this.noteId)); - this.$copyReferenceToClipboardButton.on('click', () => this.triggerEvent(`copyImageReferenceToClipboard`, {ntxId: this.noteContext.ntxId})); - this.$uploadNewRevisionButton.on("click", () => { this.$uploadNewRevisionInput.trigger("click"); }); diff --git a/src/public/app/widgets/type_widgets/image.js b/src/public/app/widgets/type_widgets/image.js index 6bfac7f77..89bff4f69 100644 --- a/src/public/app/widgets/type_widgets/image.js +++ b/src/public/app/widgets/type_widgets/image.js @@ -90,7 +90,7 @@ class ImageTypeWidget extends TypeWidget { } async doRefresh(note) { - this.$imageView.prop("src", `api/images/${note.noteId}/${encodeURIComponent(note.title)}?timestamp=${Date.now()}`); + this.$imageView.prop("src", utils.createImageSrcUrl(note)); } copyImageReferenceToClipboardEvent({ntxId}) { From 5115b33446b8a865e6543d1f2a77bc17ad83892a Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 19 Oct 2023 09:33:51 +0200 Subject: [PATCH 4/6] release 0.61.10-beta --- package.json | 2 +- src/services/build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ff3526a0b..e564e24b0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "trilium", "productName": "Trilium Notes", "description": "Trilium Notes", - "version": "0.61.9-beta", + "version": "0.61.10-beta", "license": "AGPL-3.0-only", "main": "electron.js", "bin": { diff --git a/src/services/build.js b/src/services/build.js index c461b9c7c..2e3c9d89e 100644 --- a/src/services/build.js +++ b/src/services/build.js @@ -1 +1 @@ -module.exports = { buildDate:"2023-10-07T23:02:47+03:00", buildRevision: "3d15aeae58224ac8716dd58938458e89af9bf7a0" }; +module.exports = { buildDate:"2023-10-19T09:33:51+02:00", buildRevision: "b01fe5ead9268784fb133a8cfa53670927ba0e3b" }; From 5163e50e7d223121e5b167ddc9515508f22a2d3c Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 19 Oct 2023 23:02:37 +0200 Subject: [PATCH 5/6] use mtime instead of ctime for backups #4321 --- src/public/app/widgets/type_widgets/options/backup.js | 6 +++--- src/services/backup.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/public/app/widgets/type_widgets/options/backup.js b/src/public/app/widgets/type_widgets/options/backup.js index c8a07b858..42b5e15ed 100644 --- a/src/public/app/widgets/type_widgets/options/backup.js +++ b/src/public/app/widgets/type_widgets/options/backup.js @@ -84,11 +84,11 @@ export default class BackupOptions extends OptionsWidget { this.$existingBackupList.empty(); if (!backupFiles.length) { - backupFiles = [{filePath: "no backup yet", ctime: ''}]; + backupFiles = [{filePath: "no backup yet", mtime: ''}]; } - for (const {filePath, ctime} of backupFiles) { - this.$existingBackupList.append($("
  • ").text(`${filePath} ${ctime ? ` - ${ctime}` : ''}`)); + for (const {filePath, mtime} of backupFiles) { + this.$existingBackupList.append($("
  • ").text(`${filePath} ${mtime ? ` - ${mtime}` : ''}`)); } }); } diff --git a/src/services/backup.js b/src/services/backup.js index 29fbbd0a4..7fa41eb5e 100644 --- a/src/services/backup.js +++ b/src/services/backup.js @@ -21,7 +21,7 @@ function getExistingBackups() { const filePath = path.resolve(dataDir.BACKUP_DIR, fileName); const stat = fs.statSync(filePath) - return {fileName, filePath, ctime: stat.ctime}; + return {fileName, filePath, mtime: stat.mtime}; }); } From 38db7f9db7a89b496e7277ec5424d2bd97b1edc2 Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 19 Oct 2023 23:54:36 +0200 Subject: [PATCH 6/6] style tweaks #4338 --- src/public/app/widgets/buttons/global_menu.js | 2 +- src/public/app/widgets/containers/ribbon_container.js | 2 +- src/public/app/widgets/ribbon_widgets/basic_properties.js | 3 ++- .../app/widgets/ribbon_widgets/inherited_attribute_list.js | 2 +- .../app/widgets/ribbon_widgets/owned_attribute_list.js | 3 ++- src/public/app/widgets/tab_row.js | 5 +++-- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/public/app/widgets/buttons/global_menu.js b/src/public/app/widgets/buttons/global_menu.js index dc17cfbc5..792375abd 100644 --- a/src/public/app/widgets/buttons/global_menu.js +++ b/src/public/app/widgets/buttons/global_menu.js @@ -18,7 +18,7 @@ const TPL = ` .global-menu-button { background-image: url("${window.glob.assetPath}/images/icon-black.svg"); background-repeat: no-repeat; - background-position: 50% 80%; + background-position: 40% 50%; background-size: 45px; width: 100%; height: 100%; diff --git a/src/public/app/widgets/containers/ribbon_container.js b/src/public/app/widgets/containers/ribbon_container.js index a132a0aaf..c75776a99 100644 --- a/src/public/app/widgets/containers/ribbon_container.js +++ b/src/public/app/widgets/containers/ribbon_container.js @@ -88,7 +88,7 @@ const TPL = ` display: none; border-bottom: 1px solid var(--main-border-color); margin-left: 10px; - margin-right: 10px; + margin-right: 5px; /* needs to have this value so that the bottom border is the same width as the top one */ } .ribbon-body.active { diff --git a/src/public/app/widgets/ribbon_widgets/basic_properties.js b/src/public/app/widgets/ribbon_widgets/basic_properties.js index 00dec1015..39e34d111 100644 --- a/src/public/app/widgets/ribbon_widgets/basic_properties.js +++ b/src/public/app/widgets/ribbon_widgets/basic_properties.js @@ -17,7 +17,8 @@ const TPL = ` .basic-properties-widget > * { margin-right: 30px; - margin-top: 12px; + margin-top: 9px; + margin-bottom: 2px; } .note-type-container, .editability-select-container { diff --git a/src/public/app/widgets/ribbon_widgets/inherited_attribute_list.js b/src/public/app/widgets/ribbon_widgets/inherited_attribute_list.js index 9445d088a..1af39a972 100644 --- a/src/public/app/widgets/ribbon_widgets/inherited_attribute_list.js +++ b/src/public/app/widgets/ribbon_widgets/inherited_attribute_list.js @@ -14,7 +14,7 @@ const TPL = ` color: var(--muted-text-color); max-height: 200px; overflow: auto; - padding: 12px 12px 11px 12px; + padding: 14px 12px 13px 12px; } diff --git a/src/public/app/widgets/ribbon_widgets/owned_attribute_list.js b/src/public/app/widgets/ribbon_widgets/owned_attribute_list.js index a68371f35..2e37fe8f3 100644 --- a/src/public/app/widgets/ribbon_widgets/owned_attribute_list.js +++ b/src/public/app/widgets/ribbon_widgets/owned_attribute_list.js @@ -8,7 +8,8 @@ const TPL = ` .attribute-list { margin-left: 7px; margin-right: 7px; - margin-top: 3px; + margin-top: 5px; + margin-bottom: 2px; position: relative; } diff --git a/src/public/app/widgets/tab_row.js b/src/public/app/widgets/tab_row.js index 85ab7e3c5..e47a1ee33 100644 --- a/src/public/app/widgets/tab_row.js +++ b/src/public/app/widgets/tab_row.js @@ -22,6 +22,7 @@ const Draggabilly = window.Draggabilly; const TAB_CONTAINER_MIN_WIDTH = 24; const TAB_CONTAINER_MAX_WIDTH = 240; +const TAB_CONTAINER_LEFT_PADDING = 5; const NEW_TAB_WIDTH = 32; const MIN_FILLER_WIDTH = 50; const MARGIN_WIDTH = 5; @@ -330,7 +331,7 @@ export default class TabRowWidget extends BasicWidget { getTabPositions() { const tabPositions = []; - let position = 0; + let position = TAB_CONTAINER_LEFT_PADDING; this.tabWidths.forEach(width => { tabPositions.push(position); position += width + MARGIN_WIDTH; @@ -617,7 +618,7 @@ export default class TabRowWidget extends BasicWidget { // update tab id for the new main context this.getTabById(oldMainNtxId).attr("data-ntx-id", newMainNtxId); - this.updateTabById(newMainNtxId); + this.updateTabById(newMainNtxId); } contextsReopenedEvent({mainNtxId, tabPosition}) {