From 1101305ffb72bacd68698bfbe6e961953a9043de Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Sat, 20 Aug 2022 13:02:27 -0400 Subject: [PATCH 1/5] Add ui for note editing --- src/components/user_card/user_card.js | 4 +- src/components/user_card/user_card.scss | 4 ++ src/components/user_card/user_card.vue | 6 ++ src/components/user_note/user_note.js | 31 +++++++++ src/components/user_note/user_note.vue | 88 +++++++++++++++++++++++++ src/i18n/en.json | 7 +- 6 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/components/user_note/user_note.js create mode 100644 src/components/user_note/user_note.vue diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js index 8b64a07e..56e978bf 100644 --- a/src/components/user_card/user_card.js +++ b/src/components/user_card/user_card.js @@ -4,6 +4,7 @@ import ProgressButton from '../progress_button/progress_button.vue' import FollowButton from '../follow_button/follow_button.vue' import ModerationTools from '../moderation_tools/moderation_tools.vue' import AccountActions from '../account_actions/account_actions.vue' +import UserNote from '../user_note/user_note.vue' import Select from '../select/select.vue' import UserLink from '../user_link/user_link.vue' import RichContent from 'src/components/rich_content/rich_content.jsx' @@ -140,7 +141,8 @@ export default { FollowButton, Select, RichContent, - UserLink + UserLink, + UserNote }, methods: { muteUser () { diff --git a/src/components/user_card/user_card.scss b/src/components/user_card/user_card.scss index a0bbc6a6..cdb8cb57 100644 --- a/src/components/user_card/user_card.scss +++ b/src/components/user_card/user_card.scss @@ -315,6 +315,10 @@ margin: 0; } } + + .user-note { + margin: 0 .75em .6em 0; + } } .sidebar .edit-profile-button { diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index 897d89f9..83dfed4e 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -268,6 +268,12 @@ > +
+
+
+ {{ $t('user_card.note') }} +
+ + + +
+
+ + + {{ relationship.note || $t('user_card.note_blank') }} + +
+ + + + + diff --git a/src/i18n/en.json b/src/i18n/en.json index 5793c3c8..187d4dcd 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -957,7 +957,12 @@ "solid": "Solid bg", "striped": "Striped bg", "side": "Side stripe" - } + }, + "note": "Note", + "note_blank": "(None)", + "edit_note": "Edit note", + "edit_note_apply": "Apply", + "edit_note_cancel": "Cancel" }, "user_profile": { "timeline_title": "User timeline", From 9f51517ecdee7de0e9288eb94e6ecf70fd161eb3 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Sat, 20 Aug 2022 13:18:57 -0400 Subject: [PATCH 2/5] Make API requests to edit note --- src/components/user_note/user_note.js | 17 +++++++++++++++-- src/components/user_note/user_note.vue | 5 +++-- src/modules/users.js | 8 ++++++++ src/services/api/api.service.js | 13 +++++++++++++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/components/user_note/user_note.js b/src/components/user_note/user_note.js index 6a479800..dc5b8e71 100644 --- a/src/components/user_note/user_note.js +++ b/src/components/user_note/user_note.js @@ -6,7 +6,8 @@ const UserNote = { data () { return { localNote: '', - editing: false + editing: false, + frozen: false } }, computed: { @@ -23,7 +24,19 @@ const UserNote = { this.editing = false }, finalizeEditing () { - this.editing = false + this.frozen = true + + this.$store.dispatch('editUserNote', { + id: this.user.id, + comment: this.localNote + }) + .then(() => { + this.frozen = false + this.editing = false + }) + .catch(() => { + this.frozen = false + }) } } } diff --git a/src/components/user_note/user_note.vue b/src/components/user_note/user_note.vue index 46db1ca7..a8f3fb10 100644 --- a/src/components/user_note/user_note.vue +++ b/src/components/user_note/user_note.vue @@ -15,6 +15,7 @@
{ .then((relationship) => store.commit('updateUserRelationship', [relationship])) } +const editUserNote = (store, { id, comment }) => { + return store.rootState.api.backendInteractor.editUserNote({ id, comment }) + .then((relationship) => store.commit('updateUserRelationship', [relationship])) +} + const muteUser = (store, id) => { const predictedRelationship = store.state.relationships[id] || { id } predictedRelationship.muting = true @@ -335,6 +340,9 @@ const users = { unblockUsers (store, ids = []) { return Promise.all(ids.map(id => unblockUser(store, id))) }, + editUserNote (store, args) { + return editUserNote(store, args) + }, fetchMutes (store) { return store.rootState.api.backendInteractor.fetchMutes() .then((mutes) => { diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index df652ae1..7174cc5d 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -70,6 +70,7 @@ const MASTODON_UNMUTE_USER_URL = id => `/api/v1/accounts/${id}/unmute` const MASTODON_REMOVE_USER_FROM_FOLLOWERS = id => `/api/v1/accounts/${id}/remove_from_followers` const MASTODON_SUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/subscribe` const MASTODON_UNSUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/unsubscribe` +const MASTODON_USER_NOTE_URL = id => `/api/v1/accounts/${id}/note` const MASTODON_BOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/bookmark` const MASTODON_UNBOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/unbookmark` const MASTODON_POST_STATUS_URL = '/api/v1/statuses' @@ -321,6 +322,17 @@ const removeUserFromFollowers = ({ id, credentials }) => { }).then((data) => data.json()) } +const editUserNote = ({ id, credentials, comment }) => { + return promisedRequest({ + url: MASTODON_USER_NOTE_URL(id), + credentials, + payload: { + comment + }, + method: 'POST' + }) +} + const approveUser = ({ id, credentials }) => { const url = MASTODON_APPROVE_USER_URL(id) return fetch(url, { @@ -1667,6 +1679,7 @@ const apiService = { blockUser, unblockUser, removeUserFromFollowers, + editUserNote, fetchUser, fetchUserByName, fetchUserRelationship, From 9ab3f27f72c74a61763534eb53b92a3172bb5f5d Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Sat, 20 Aug 2022 13:20:59 -0400 Subject: [PATCH 3/5] Test if server supports note --- src/components/user_card/user_card.js | 3 +++ src/components/user_card/user_card.vue | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js index 56e978bf..65140d4e 100644 --- a/src/components/user_card/user_card.js +++ b/src/components/user_card/user_card.js @@ -130,6 +130,9 @@ export default { const privileges = this.loggedIn.privileges return this.loggedIn.role === 'admin' || privileges.includes('users_manage_activation_state') || privileges.includes('users_delete') || privileges.includes('users_manage_tags') }, + supportsNote () { + return 'note' in this.relationship + }, ...mapGetters(['mergedConfig']) }, components: { diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index 83dfed4e..88434c59 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -269,7 +269,7 @@ Date: Wed, 7 Sep 2022 18:36:27 -0400 Subject: [PATCH 4/5] Use textarea for note input --- src/components/user_note/user_note.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/user_note/user_note.vue b/src/components/user_note/user_note.vue index a8f3fb10..328e2350 100644 --- a/src/components/user_note/user_note.vue +++ b/src/components/user_note/user_note.vue @@ -30,11 +30,11 @@ - + /> Date: Wed, 7 Sep 2022 18:46:18 -0400 Subject: [PATCH 5/5] Make notes editable only on user profile --- src/components/user_card/user_card.js | 6 +++++- src/components/user_card/user_card.vue | 4 ++-- src/components/user_note/user_note.js | 3 ++- src/components/user_note/user_note.vue | 3 +-- src/components/user_profile/user_profile.vue | 1 + 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js index 65140d4e..67879307 100644 --- a/src/components/user_card/user_card.js +++ b/src/components/user_card/user_card.js @@ -40,7 +40,8 @@ export default { 'rounded', 'bordered', 'avatarAction', // default - open profile, 'zoom' - zoom, function - call function - 'onClose' + 'onClose', + 'hasNoteEditor' ], data () { return { @@ -130,6 +131,9 @@ export default { const privileges = this.loggedIn.privileges return this.loggedIn.role === 'admin' || privileges.includes('users_manage_activation_state') || privileges.includes('users_delete') || privileges.includes('users_manage_tags') }, + hasNote () { + return this.relationship.note + }, supportsNote () { return 'note' in this.relationship }, diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index 88434c59..349c7cb1 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -269,10 +269,10 @@ diff --git a/src/components/user_note/user_note.js b/src/components/user_note/user_note.js index dc5b8e71..830b2e59 100644 --- a/src/components/user_note/user_note.js +++ b/src/components/user_note/user_note.js @@ -1,7 +1,8 @@ const UserNote = { props: { user: Object, - relationship: Object + relationship: Object, + editable: Boolean }, data () { return { diff --git a/src/components/user_note/user_note.vue b/src/components/user_note/user_note.vue index 328e2350..4286e017 100644 --- a/src/components/user_note/user_note.vue +++ b/src/components/user_note/user_note.vue @@ -6,7 +6,7 @@ {{ $t('user_card.note') }}