From 9e45228823cd0fa7eb9388b0eb7780b9609edf66 Mon Sep 17 00:00:00 2001 From: marcin mikołajczak Date: Mon, 23 Sep 2024 23:10:32 +0200 Subject: Bookmark folders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- src/modules/bookmark_folders.js | 66 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/modules/bookmark_folders.js (limited to 'src/modules/bookmark_folders.js') diff --git a/src/modules/bookmark_folders.js b/src/modules/bookmark_folders.js new file mode 100644 index 00000000..e5f25791 --- /dev/null +++ b/src/modules/bookmark_folders.js @@ -0,0 +1,66 @@ +import { remove, find } from 'lodash' + +export const defaultState = { + allFolders: [] +} + +export const mutations = { + setBookmarkFolders (state, value) { + state.allFolders = value + }, + setBookmarkFolder (state, { folderId, name, emoji, emojiUrl }) { + const entry = find(state.allFolders, { id: name }) + if (!entry) { + state.allFolders.push({ id: folderId, name, emoji, emojiUrl }) + } else { + entry.name = name + entry.emoji = emoji + entry.emojiUrl = emojiUrl + } + }, + deleteBookmarkFolder (state, { folderId }) { + remove(state.allFolders, folder => folder.id === folderId) + } +} + +const actions = { + setBookmarkFolders ({ commit }, value) { + commit('setBookmarkFolders', value) + }, + createBookmarkFolder ({ rootState, commit }, { name, emoji }) { + return rootState.api.backendInteractor.createBookmarkFolder({ name, emoji }) + .then((folder) => { + commit('setBookmarkFolder', folder) + return folder + }) + }, + setBookmarkFolder ({ rootState, commit }, { folderId, name, emoji }) { + return rootState.api.backendInteractor.updateBookmarkFolder({ folderId, name, emoji }) + .then((folder) => { + commit('setBookmarkFolder', folder) + return folder + }) + }, + deleteBookmarkFolder ({ rootState, commit }, { folderId }) { + rootState.api.backendInteractor.deleteBookmarkFolder({ folderId }) + commit('deleteBookmarkFolder', { folderId }) + } +} + +export const getters = { + findBookmarkFolderName: state => id => { + const folder = state.allFolders.find(folder => folder.id === id) + + if (!folder) return + return folder.name + } +} + +const bookmarkFolders = { + state: defaultState, + mutations, + actions, + getters +} + +export default bookmarkFolders -- cgit v1.2.3-70-g09d2 From 2b6de423d5a02413924f18910b1ce3538a5a1625 Mon Sep 17 00:00:00 2001 From: marcin mikołajczak Date: Tue, 24 Sep 2024 18:15:49 +0200 Subject: Bookmark folder editing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- src/boot/routes.js | 5 +- .../bookmark_folder_card/bookmark_folder_card.js | 7 +- .../bookmark_folder_card/bookmark_folder_card.vue | 51 ++++++++- .../bookmark_folder_edit/bookmark_folder_edit.js | 65 +++++++++++ .../bookmark_folder_edit/bookmark_folder_edit.vue | 125 +++++++++++++++++++++ .../bookmark_folders/bookmark_folders.vue | 2 +- src/components/navigation/navigation_entry.vue | 5 + src/i18n/en.json | 10 +- src/modules/bookmark_folders.js | 6 +- src/services/api/api.service.js | 4 +- 10 files changed, 269 insertions(+), 11 deletions(-) create mode 100644 src/components/bookmark_folder_edit/bookmark_folder_edit.js create mode 100644 src/components/bookmark_folder_edit/bookmark_folder_edit.vue (limited to 'src/modules/bookmark_folders.js') diff --git a/src/boot/routes.js b/src/boot/routes.js index ff93bb51..f87b2ec8 100644 --- a/src/boot/routes.js +++ b/src/boot/routes.js @@ -27,6 +27,7 @@ import NavPanel from 'src/components/nav_panel/nav_panel.vue' import AnnouncementsPage from 'components/announcements_page/announcements_page.vue' import QuotesTimeline from '../components/quotes_timeline/quotes_timeline.vue' import BookmarkFolders from '../components/bookmark_folders/bookmark_folders.vue' +import BookmarkFolderEdit from '../components/bookmark_folder_edit/bookmark_folder_edit.vue' export default (store) => { const validateAuthenticatedRoute = (to, from, next) => { @@ -89,7 +90,9 @@ export default (store) => { { name: 'lists-new', path: '/lists/new', component: ListsEdit }, { name: 'edit-navigation', path: '/nav-edit', component: NavPanel, props: () => ({ forceExpand: true, forceEditMode: true }), beforeEnter: validateAuthenticatedRoute }, { name: 'bookmark-folders', path: '/bookmark_folders', component: BookmarkFolders }, - { name: 'bookmark-folder', path: '/bookmarks/:id', component: BookmarkTimeline } + { name: 'bookmark-folder-new', path: '/bookmarks/new-folder', component: BookmarkFolderEdit }, + { name: 'bookmark-folder', path: '/bookmarks/:id', component: BookmarkTimeline }, + { name: 'bookmark-folder-edit', path: '/bookmarks/:id/edit', component: BookmarkFolderEdit } ] if (store.state.instance.pleromaChatMessagesAvailable) { diff --git a/src/components/bookmark_folder_card/bookmark_folder_card.js b/src/components/bookmark_folder_card/bookmark_folder_card.js index 9df28e19..7a7206aa 100644 --- a/src/components/bookmark_folder_card/bookmark_folder_card.js +++ b/src/components/bookmark_folder_card/bookmark_folder_card.js @@ -10,7 +10,12 @@ library.add( const BookmarkFolderCard = { props: [ 'folder' - ] + ], + computed: { + firstLetter () { + return this.folder.name[0] + } + } } export default BookmarkFolderCard diff --git a/src/components/bookmark_folder_card/bookmark_folder_card.vue b/src/components/bookmark_folder_card/bookmark_folder_card.vue index 10875e78..b773c9fb 100644 --- a/src/components/bookmark_folder_card/bookmark_folder_card.vue +++ b/src/components/bookmark_folder_card/bookmark_folder_card.vue @@ -4,10 +4,28 @@ :to="{ name: 'bookmark-folder', params: { id: folder.id } }" class="bookmark-folder-name" > - {{ folder.name }} + + + + {{ folder.emoji }} + + + {{ firstLetter }}{{ folder.name }} span { + font-size: 1.5rem; + line-height: 2.5rem; + } + } + + img.iconEmoji { + padding: 0.25em; + box-sizing: border-box; + } } .bookmark-folder-name, diff --git a/src/components/bookmark_folder_edit/bookmark_folder_edit.js b/src/components/bookmark_folder_edit/bookmark_folder_edit.js new file mode 100644 index 00000000..8c5d3cfd --- /dev/null +++ b/src/components/bookmark_folder_edit/bookmark_folder_edit.js @@ -0,0 +1,65 @@ +import apiService from '../../services/api/api.service' + +const BookmarkFolderEdit = { + data () { + return { + name: '', + nameDraft: '', + emoji: '', + emojiUrl: null, + emojiDraft: '', + emojiUrlDraft: null, + reallyDelete: false + } + }, + created () { + if (!this.id) return + const credentials = this.$store.state.users.currentUser.credentials + apiService.fetchBookmarkFolders({ credentials }) + .then((folders) => { + const folder = folders.find(folder => folder.id === this.id) + if (!folder) return + + this.nameDraft = this.name = folder.name + this.emojiDraft = this.emoji = folder.emoji + this.emojiUrlDraft = this.emojiUrl = folder.emoji_url + }) + }, + computed: { + id () { + return this.$route.params.id + } + }, + methods: { + updateFolder () { + this.$store.dispatch('setBookmarkFolder', { folderId: this.id, name: this.nameDraft, emoji: this.emojiDraft }) + .then((folder) => { + this.nameDraft = this.name = folder.name + this.emojiDraft = this.emoji = folder.emoji + this.emojiUrlDraft = this.emojiUrl = folder.emoji_url + }) + }, + createFolder () { + this.$store.dispatch('createBookmarkFolder', { name: this.nameDraft, emoji: this.emojiDraft }) + .then((folder) => { + return folder.id + }) + .then((folderId) => { + this.$router.push({ name: 'bookmark-folders' }) + }) + .catch((e) => { + this.$store.dispatch('pushGlobalNotice', { + messageKey: 'bookmark_folders.error', + messageArgs: [e.message], + level: 'error' + }) + }) + }, + deleteFolder () { + this.$store.dispatch('deleteBookmarkFolder', { folderId: this.id }) + this.$router.push({ name: 'bookmark-folders' }) + } + } +} + +export default BookmarkFolderEdit diff --git a/src/components/bookmark_folder_edit/bookmark_folder_edit.vue b/src/components/bookmark_folder_edit/bookmark_folder_edit.vue new file mode 100644 index 00000000..30bbde09 --- /dev/null +++ b/src/components/bookmark_folder_edit/bookmark_folder_edit.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/src/components/bookmark_folders/bookmark_folders.vue b/src/components/bookmark_folders/bookmark_folders.vue index 733e4cab..65b1a11b 100644 --- a/src/components/bookmark_folders/bookmark_folders.vue +++ b/src/components/bookmark_folders/bookmark_folders.vue @@ -5,7 +5,7 @@ {{ $t('nav.bookmark_folders') }} {{ $t("bookmark_folders.new") }} diff --git a/src/components/navigation/navigation_entry.vue b/src/components/navigation/navigation_entry.vue index 728de1be..024ee314 100644 --- a/src/components/navigation/navigation_entry.vue +++ b/src/components/navigation/navigation_entry.vue @@ -137,5 +137,10 @@ font-size: 1.5rem; } } + + img.iconEmoji { + padding: 0.25rem; + box-sizing: border-box; + } } diff --git a/src/i18n/en.json b/src/i18n/en.json index 9d10b560..5a9bee32 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1409,7 +1409,15 @@ "tooltip": "This domain contains non-ascii characters." }, "bookmark_folders": { + "create": "Create folder", + "creating_folder": "Creating bookmark folder", + "delete": "Delete folder", + "editing_folder": "Editing folder {folderName}", + "error": "Error manipulating bookmark folders: {0}", + "name": "Folder name", "new": "New Folder", - "select_folder": "Select bookmark folder" + "really_delete": "Do you really want to delete the folder?", + "select_folder": "Select bookmark folder", + "update_folder": "Save changes" } } diff --git a/src/modules/bookmark_folders.js b/src/modules/bookmark_folders.js index e5f25791..5dde58a7 100644 --- a/src/modules/bookmark_folders.js +++ b/src/modules/bookmark_folders.js @@ -8,10 +8,10 @@ export const mutations = { setBookmarkFolders (state, value) { state.allFolders = value }, - setBookmarkFolder (state, { folderId, name, emoji, emojiUrl }) { - const entry = find(state.allFolders, { id: name }) + setBookmarkFolder (state, { id, name, emoji, emojiUrl }) { + const entry = find(state.allFolders, { id }) if (!entry) { - state.allFolders.push({ id: folderId, name, emoji, emojiUrl }) + state.allFolders.push({ id, name, emoji, emojiUrl }) } else { entry.name = name entry.emoji = emoji diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 43896ae7..94c12360 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -1927,9 +1927,9 @@ const updateBookmarkFolder = ({ folderId, name, emoji, credentials }) => { return fetch(url, { headers, - method: 'PUT', + method: 'PATCH', body: JSON.stringify({ name, emoji }) - }) + }).then((data) => data.json()) } const deleteBookmarkFolder = ({ folderId, credentials }) => { -- cgit v1.2.3-70-g09d2 From 9f0fc431dc6f6b1405b5e4e9d78bd366f5f4c806 Mon Sep 17 00:00:00 2001 From: marcin mikołajczak Date: Thu, 26 Sep 2024 01:58:52 +0200 Subject: Allow to change bookmark folder emoji MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- .../bookmark_folder_edit/bookmark_folder_edit.js | 31 ++++++-- .../bookmark_folder_edit/bookmark_folder_edit.vue | 91 +++++++++++++++++++--- src/components/emoji_picker/emoji_picker.js | 2 +- src/i18n/en.json | 11 +-- src/modules/bookmark_folders.js | 6 +- 5 files changed, 115 insertions(+), 26 deletions(-) (limited to 'src/modules/bookmark_folders.js') diff --git a/src/components/bookmark_folder_edit/bookmark_folder_edit.js b/src/components/bookmark_folder_edit/bookmark_folder_edit.js index 8c5d3cfd..95c01576 100644 --- a/src/components/bookmark_folder_edit/bookmark_folder_edit.js +++ b/src/components/bookmark_folder_edit/bookmark_folder_edit.js @@ -1,3 +1,4 @@ +import EmojiPicker from '../emoji_picker/emoji_picker.vue' import apiService from '../../services/api/api.service' const BookmarkFolderEdit = { @@ -9,9 +10,13 @@ const BookmarkFolderEdit = { emojiUrl: null, emojiDraft: '', emojiUrlDraft: null, + emojiPickerExpanded: false, reallyDelete: false } }, + components: { + EmojiPicker + }, created () { if (!this.id) return const credentials = this.$store.state.users.currentUser.credentials @@ -31,20 +36,30 @@ const BookmarkFolderEdit = { } }, methods: { + selectEmoji (event) { + this.emojiDraft = event.insertion + this.emojiUrlDraft = event.insertionUrl + }, + showEmojiPicker () { + if (!this.emojiPickerExpanded) { + this.$refs.picker.showPicker() + } + }, + onShowPicker () { + this.emojiPickerExpanded = true + }, + onClosePicker () { + this.emojiPickerExpanded = false + }, updateFolder () { this.$store.dispatch('setBookmarkFolder', { folderId: this.id, name: this.nameDraft, emoji: this.emojiDraft }) - .then((folder) => { - this.nameDraft = this.name = folder.name - this.emojiDraft = this.emoji = folder.emoji - this.emojiUrlDraft = this.emojiUrl = folder.emoji_url + .then(() => { + this.$router.push({ name: 'bookmark-folders' }) }) }, createFolder () { this.$store.dispatch('createBookmarkFolder', { name: this.nameDraft, emoji: this.emojiDraft }) - .then((folder) => { - return folder.id - }) - .then((folderId) => { + .then(() => { this.$router.push({ name: 'bookmark-folders' }) }) .catch((e) => { diff --git a/src/components/bookmark_folder_edit/bookmark_folder_edit.vue b/src/components/bookmark_folder_edit/bookmark_folder_edit.vue index 30bbde09..b6a768d4 100644 --- a/src/components/bookmark_folder_edit/bookmark_folder_edit.vue +++ b/src/components/bookmark_folder_edit/bookmark_folder_edit.vue @@ -29,22 +29,45 @@
+
+ + + +
- {{ ' ' }} -
@@ -97,9 +130,49 @@ } .panel-body { + display: flex; + gap: 0.5em; + } + + .emoji-picker-panel { + position: absolute; + z-index: 20; + margin-top: 2px; + + &.hide { + display: none; + } + } + + .input-emoji { + height: 2.5em; + width: 2.5em; + padding: 0; + + .iconEmoji { + display: inline-block; + text-align: center; + object-fit: contain; + vertical-align: middle; + height: 2.5em; + width: 2.5em; + + > span { + font-size: 1.5rem; + line-height: 2.5rem; + } + } + + img.iconEmoji { + padding: 0.25em; + box-sizing: border-box; + } + } + + .input-wrap { display: flex; flex-direction: column; - overflow: hidden; + gap: 0.5em; } .go-back-button { diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 9ea5c877..d3d6563a 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -180,7 +180,7 @@ const EmojiPicker = { if (!this.keepOpen) { this.$refs.popover.hidePopover() } - this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen }) + this.$emit('emoji', { insertion: value, insertionUrl: emoji.imageUrl, keepOpen: this.keepOpen }) }, onScroll (startIndex, endIndex, visibleStartIndex, visibleEndIndex) { const target = this.$refs['emoji-groups'].$el diff --git a/src/i18n/en.json b/src/i18n/en.json index 5a9bee32..cc55a6d0 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1409,15 +1409,16 @@ "tooltip": "This domain contains non-ascii characters." }, "bookmark_folders": { - "create": "Create folder", + "select_folder": "Select bookmark folder", "creating_folder": "Creating bookmark folder", - "delete": "Delete folder", "editing_folder": "Editing folder {folderName}", - "error": "Error manipulating bookmark folders: {0}", + "emoji": "Emoji", "name": "Folder name", "new": "New Folder", + "create": "Create folder", + "delete": "Delete folder", + "update_folder": "Save changes", "really_delete": "Do you really want to delete the folder?", - "select_folder": "Select bookmark folder", - "update_folder": "Save changes" + "error": "Error manipulating bookmark folders: {0}" } } diff --git a/src/modules/bookmark_folders.js b/src/modules/bookmark_folders.js index 5dde58a7..c276adf4 100644 --- a/src/modules/bookmark_folders.js +++ b/src/modules/bookmark_folders.js @@ -8,14 +8,14 @@ export const mutations = { setBookmarkFolders (state, value) { state.allFolders = value }, - setBookmarkFolder (state, { id, name, emoji, emojiUrl }) { + setBookmarkFolder (state, { id, name, emoji, emoji_url: emojiUrl }) { const entry = find(state.allFolders, { id }) if (!entry) { - state.allFolders.push({ id, name, emoji, emojiUrl }) + state.allFolders.push({ id, name, emoji, emoji_url: emojiUrl }) } else { entry.name = name entry.emoji = emoji - entry.emojiUrl = emojiUrl + entry.emoji_url = emojiUrl } }, deleteBookmarkFolder (state, { folderId }) { -- cgit v1.2.3-70-g09d2