Skip to content

Commit c8672a6

Browse files
committed
#65 add: bookmark editing
Signed-off-by: Patrizio Bekerle <patrizio@bekerle.com>
1 parent 499d1f9 commit c8672a6

File tree

4 files changed

+144
-3
lines changed

4 files changed

+144
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# QOwnNotes Web Companion Changelog
22

33
## 2024.8.0
4+
- bookmarks can now be edited in the bookmarks list (for [#65](https://github.com/qownnotes/web-companion/issues/65))
45
- update dependencies
56

67
## 2024.4.0

src-bex/_locales/en/messages.json

+15
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@
4848
"DeleteBookmarkConfirmMessage": {
4949
"message": "Would you like to delete this text from all notes tagged as bookmark?"
5050
},
51+
"EditBookmark": {
52+
"message": "Edit bookmark"
53+
},
54+
"BookmarkText": {
55+
"message": "Bookmark text"
56+
},
57+
"EditBookmarkConfirmTitle": {
58+
"message": "Edit bookmark"
59+
},
60+
"EditBookmarkConfirmMessage": {
61+
"message": "Would you like to replace this text from all notes tagged as bookmark:"
62+
},
63+
"EditBookmarkConfirmMessage2": {
64+
"message": "With this text:"
65+
},
5166
"BookmarkAllTabs": {
5267
"message": "Bookmark all tabs"
5368
},

src/components/EditBookmarkDialog.vue

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<template>
2+
<q-dialog v-model="dialog">
3+
<q-card>
4+
<q-card-section>
5+
<div class="text-h6">{{ getLocale('EditBookmark') }}</div>
6+
</q-card-section>
7+
8+
<q-card-section class="q-pt-none">
9+
<div class="row">
10+
<div class="col q-pa-md q-gutter-sm">
11+
<q-input
12+
tabindex="1"
13+
@keyup.enter="storeBookmark"
14+
v-model="newMarkdown"
15+
autofocus
16+
autogrow
17+
input-style="min-width: 460px;"
18+
:label="getLocale('BookmarkText')"
19+
></q-input>
20+
</div>
21+
</div>
22+
</q-card-section>
23+
24+
<q-card-actions align="right">
25+
<q-btn flat :label="getLocale('Cancel')" tabindex="3" v-close-popup @click="$emit('cancel')" />
26+
<q-btn flat :label="getLocale('Ok')" color="primary" tabindex="2" @click="storeBookmark" />
27+
</q-card-actions>
28+
</q-card>
29+
</q-dialog>
30+
</template>
31+
32+
<script>
33+
import {getLocale} from "src/helpers/utils";
34+
import {computed, defineComponent, ref} from "vue";
35+
import {QWebSocket} from "src/services/qwebsocket";
36+
import {useQuasar} from "quasar";
37+
38+
export default defineComponent({
39+
name: "EditBookmarkDialog",
40+
methods: {getLocale},
41+
props: {
42+
model: {
43+
type: Boolean,
44+
default: false
45+
},
46+
markdown: {
47+
type: String,
48+
default: '',
49+
required: true
50+
},
51+
webSocket: {
52+
type: QWebSocket,
53+
required: true
54+
}
55+
},
56+
setup(props, { emit }) {
57+
const $q = useQuasar();
58+
const dialog = ref(props.model);
59+
let markdownToStore = '';
60+
61+
const newMarkdown = computed({
62+
get: () => props.markdown,
63+
set: (value) => {markdownToStore = value}
64+
});
65+
66+
const storeBookmark = () => {
67+
const data = {type: "editBookmark", data: {markdown: props.markdown, newMarkdown: markdownToStore}};
68+
69+
$q.dialog({
70+
title: getLocale('EditBookmarkConfirmTitle'),
71+
message: `
72+
${getLocale('EditBookmarkConfirmMessage')}<br><br>
73+
<code style="display: block; overflow-x: auto">${data.data.markdown}</code><br>
74+
${getLocale('EditBookmarkConfirmMessage2')}<br><br>
75+
<code style="display: block; overflow-x: auto">${data.data.newMarkdown}</code>`,
76+
html: true,
77+
cancel: true,
78+
persistent: true
79+
}).onOk(() => {
80+
props.webSocket.send(data, () => {
81+
console.log("Edited bookmark:" + data);
82+
emit('bookmarkEdited');
83+
});
84+
});
85+
};
86+
87+
return {
88+
dialog,
89+
newMarkdown,
90+
storeBookmark
91+
};
92+
},
93+
emits: ['cancel', 'bookmarkEdited']
94+
})
95+
</script>
96+
97+
<style scoped>
98+
99+
</style>

src/pages/PopupPage.vue

+29-3
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,13 @@
154154
<q-badge v-for="tag in props.row.tags" :key="tag" :label="tag" />
155155
</div>
156156
</q-td>
157-
<q-td key="toolbar" :props="props">
157+
<q-td key="toolbar" :props="props" class="row-buttons">
158158
<q-btn v-if="props.row.markdown" size="xs" round color="secondary" icon="delete" @click="deleteBookmark(props.row.markdown)">
159159
<q-tooltip class="bg-accent">{{ getLocale('DeleteBookmark') }}</q-tooltip>
160160
</q-btn>
161+
<q-btn v-if="props.row.markdown" size="xs" round color="secondary" icon="edit" @click="editBookmark(props.row.markdown)">
162+
<q-tooltip class="bg-accent">{{ getLocale('EditBookmark') }}</q-tooltip>
163+
</q-btn>
161164
</q-td>
162165
</q-tr>
163166
</template>
@@ -166,6 +169,7 @@
166169
</q-page>
167170
<InputTokenDialog v-if="inputTokenDialog" @token-stored="closeWindow" @cancel="closeWindow" />
168171
<AddBookmarkDialog v-model="addBookmarkDialog" :bookmark="editedBookmark" :webSocket="webSocket" @bookmark-stored="onBookmarkStored" />
172+
<EditBookmarkDialog v-model="editBookmarkDialog" :markdown="editBookmarkMarkdown" :webSocket="webSocket" @bookmark-edited="onBookmarkEdited" />
169173
<BookmarkAllTabsDialog v-model="bookmarkAllTabsDialog" :webSocket="webSocket" @bookmarksStored="onBookmarksStored" />
170174
<ImportBrowserBookmarksDialog v-model="importBrowserBookmarksDialog" :webSocket="webSocket" @bookmarksImported="onBookmarksImported" />
171175
</q-page-container>
@@ -178,6 +182,7 @@ import { getLocale, openPrivateUrl, truncateText } from '../helpers/utils'
178182
import { QWebSocket } from '../services/qwebsocket'
179183
import InputTokenDialog from '../components/InputTokenDialog.vue'
180184
import AddBookmarkDialog from "components/AddBookmarkDialog.vue";
185+
import EditBookmarkDialog from "components/EditBookmarkDialog.vue";
181186
import {Notify, useQuasar} from "quasar";
182187
import BookmarkAllTabsDialog from "components/BookmarkAllTabsDialog.vue";
183188
import ImportBrowserBookmarksDialog from "components/ImportBrowserBookmarksDialog.vue";
@@ -203,8 +208,9 @@ export default defineComponent({
203208
let selectedNoteFolderId = ref(null);
204209
let selectedNoteFolderIdWatchEnabled = true;
205210
let addBookmarkDialog = ref(false);
211+
let editBookmarkDialog = ref(false);
206212
let bookmarkAllTabsDialog = ref(false);
207-
const bookmarkEditDialog = ref(false);
213+
let editBookmarkMarkdown = ref('');
208214
const pagination = ref({
209215
sortBy: 'name',
210216
descending: false,
@@ -321,6 +327,11 @@ export default defineComponent({
321327
loadBookmarks();
322328
};
323329
330+
const onBookmarkEdited = () => {
331+
editBookmarkDialog.value = false;
332+
loadBookmarks();
333+
};
334+
324335
const onBookmarksStored = () => {
325336
bookmarkAllTabsDialog.value = false;
326337
loadBookmarks();
@@ -347,6 +358,12 @@ export default defineComponent({
347358
});
348359
}
349360
361+
const editBookmark = (markdown) => {
362+
console.log('markdown', markdown)
363+
editBookmarkMarkdown.value = markdown;
364+
editBookmarkDialog.value = true;
365+
}
366+
350367
const openUrl = (url, event) => {
351368
if (event) {
352369
event.stopPropagation();
@@ -506,13 +523,15 @@ export default defineComponent({
506523
noteFolderName,
507524
noteFolders,
508525
selectedNoteFolderId,
509-
bookmarkEditDialog,
510526
addBookmarkDialog,
527+
editBookmarkDialog,
511528
bookmarkAllTabsDialog,
512529
onBookmarkStored,
530+
onBookmarkEdited,
513531
onBookmarksStored,
514532
onBookmarksImported,
515533
editedBookmark,
534+
editBookmarkMarkdown,
516535
defaultBookmark,
517536
pagination,
518537
selectedTags,
@@ -523,6 +542,7 @@ export default defineComponent({
523542
filteredBookmarks,
524543
openUrl,
525544
deleteBookmark,
545+
editBookmark,
526546
loadBookmarks,
527547
closeWindow,
528548
tagFilterFn,
@@ -533,6 +553,7 @@ export default defineComponent({
533553
components: {
534554
PopupDrawer,
535555
AddBookmarkDialog,
556+
EditBookmarkDialog,
536557
BookmarkAllTabsDialog,
537558
ImportBrowserBookmarksDialog,
538559
InputTokenDialog
@@ -601,4 +622,9 @@ code.scroll {
601622
white-space: pre;
602623
word-wrap: break-word;
603624
}
625+
626+
.row-buttons {
627+
display: flex;
628+
gap: 5px;
629+
}
604630
</style>

0 commit comments

Comments
 (0)