diff --git a/changelog.d/emoji-copying-post.add b/changelog.d/emoji-copying-post.add new file mode 100644 index 000000000..f25ce9792 --- /dev/null +++ b/changelog.d/emoji-copying-post.add @@ -0,0 +1 @@ +Allow copying an emoji from a remote post into a local pack diff --git a/changelog.d/emoji-copying.add b/changelog.d/emoji-copying.add new file mode 100644 index 000000000..875e04401 --- /dev/null +++ b/changelog.d/emoji-copying.add @@ -0,0 +1 @@ +Allow copying one emoji from a remote pack into a local pack diff --git a/changelog.d/emoji-popover.add b/changelog.d/emoji-popover.add new file mode 100644 index 000000000..f55ad10a3 --- /dev/null +++ b/changelog.d/emoji-popover.add @@ -0,0 +1 @@ +When an emoji is clicked in a post, show a popover with its name and a bigger image. Admins can also copy it to a local pack diff --git a/package.json b/package.json index 4424bde3e..f689eab2e 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,12 @@ "lint-fix": "eslint --fix src test/unit/specs test/e2e/specs" }, "dependencies": { - "@babel/runtime": "7.28.2", + "@babel/runtime": "7.28.3", "@chenfengyuan/vue-qrcode": "2.0.0", "@fortawesome/fontawesome-svg-core": "6.7.2", "@fortawesome/free-regular-svg-icons": "6.7.2", "@fortawesome/free-solid-svg-icons": "6.7.2", - "@fortawesome/vue-fontawesome": "3.0.8", + "@fortawesome/vue-fontawesome": "3.1.1", "@kazvmoe-infra/pinch-zoom-element": "1.3.0", "@kazvmoe-infra/unicode-emoji-json": "0.4.0", "@ruffle-rs/ruffle": "0.1.0-nightly.2025.1.13", @@ -54,24 +54,24 @@ "vuex": "4.1.0" }, "devDependencies": { - "@babel/core": "7.28.0", + "@babel/core": "7.28.3", "@babel/eslint-parser": "7.28.0", - "@babel/plugin-transform-runtime": "7.28.0", - "@babel/preset-env": "7.28.0", - "@babel/register": "7.27.1", + "@babel/plugin-transform-runtime": "7.28.3", + "@babel/preset-env": "7.28.3", + "@babel/register": "7.28.3", "@ungap/event-target": "0.2.4", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", "@vitest/browser": "^3.0.7", "@vitest/ui": "^3.0.7", "@vue/babel-helper-vue-jsx-merge-props": "1.4.0", - "@vue/babel-plugin-jsx": "1.4.0", + "@vue/babel-plugin-jsx": "1.5.0", "@vue/compiler-sfc": "3.5.18", "@vue/test-utils": "2.4.6", "autoprefixer": "10.4.21", "babel-plugin-lodash": "3.3.4", "chai": "5.2.1", - "chalk": "5.4.1", + "chalk": "5.6.0", "chromedriver": "135.0.4", "connect-history-api-fallback": "2.0.0", "cross-spawn": "7.0.6", @@ -81,16 +81,16 @@ "eslint-config-standard": "17.1.0", "eslint-formatter-friendly": "7.0.0", "eslint-plugin-import": "2.31.0", - "eslint-plugin-n": "17.18.0", + "eslint-plugin-n": "17.21.3", "eslint-plugin-promise": "7.2.1", - "eslint-plugin-vue": "10.1.0", + "eslint-plugin-vue": "10.4.0", "eventsource-polyfill": "0.9.6", "express": "5.1.0", "function-bind": "1.1.2", "http-proxy-middleware": "3.0.5", "iso-639-1": "3.1.5", "lodash": "4.17.21", - "msw": "2.10.4", + "msw": "2.10.5", "nightwatch": "3.12.2", "playwright": "1.52.0", "postcss": "8.5.6", diff --git a/src/components/chat_title/chat_title.vue b/src/components/chat_title/chat_title.vue index 72660cca0..00521260f 100644 --- a/src/components/chat_title/chat_title.vue +++ b/src/components/chat_title/chat_title.vue @@ -19,6 +19,7 @@ :title="'@'+(user && user.screen_name_ui)" :html="htmlTitle" :emoji="user.emoji || []" + :is-local="user.is_local" /> diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue index b639b9c88..118c1ba0e 100644 --- a/src/components/notification/notification.vue +++ b/src/components/notification/notification.vue @@ -71,6 +71,7 @@ :title="'@'+notification.from_profile.screen_name_ui" :html="notification.from_profile.name_html" :emoji="notification.from_profile.emoji" + :is-local="notification.from_profile.is_local" /> diff --git a/src/components/rich_content/rich_content.jsx b/src/components/rich_content/rich_content.jsx index 599985c3b..5adc2443a 100644 --- a/src/components/rich_content/rich_content.jsx +++ b/src/components/rich_content/rich_content.jsx @@ -2,7 +2,7 @@ import { unescape, flattenDeep } from 'lodash' import { getTagName, processTextForEmoji, getAttrs } from 'src/services/html_converter/utility.service.js' import { convertHtmlToTree } from 'src/services/html_converter/html_tree_converter.service.js' import { convertHtmlToLines } from 'src/services/html_converter/html_line_converter.service.js' -import StillImage from 'src/components/still-image/still-image.vue' +import StillImageEmojiPopover from 'src/components/still-image/still-image-emoji-popover.vue' import MentionsLine from 'src/components/mentions_line/mentions_line.vue' import { MENTIONS_LIMIT } from 'src/components/mentions_line/mentions_line.js' import HashtagLink from 'src/components/hashtag_link/hashtag_link.vue' @@ -92,6 +92,18 @@ export default { required: false, type: Boolean, default: false + }, + /* Content comes from current instance + * + * This is used for emoji stealing popover. + * By default we assume it is, so that steal + * emoji button isn't shown where it probably + * should not be. + */ + isLocal: { + required: false, + type: Boolean, + default: true } }, // NEVER EVER TOUCH DATA INSIDE RENDER @@ -168,11 +180,14 @@ export default { item, this.emoji, ({ shortcode, url }) => { - return } )] diff --git a/src/components/settings_modal/admin_tabs/emoji_tab.js b/src/components/settings_modal/admin_tabs/emoji_tab.js index a315756e8..d8f769e0b 100644 --- a/src/components/settings_modal/admin_tabs/emoji_tab.js +++ b/src/components/settings_modal/admin_tabs/emoji_tab.js @@ -145,9 +145,9 @@ const EmojiTab = { }) }, - updatePackFiles (newFiles) { - this.pack.files = newFiles - this.sortPackFiles(this.packName) + updatePackFiles (newFiles, packName) { + this.knownPacks[packName].files = newFiles + this.sortPackFiles(packName) }, loadPacksPaginated (listFunction) { diff --git a/src/components/settings_modal/admin_tabs/emoji_tab.vue b/src/components/settings_modal/admin_tabs/emoji_tab.vue index 333ff8b0e..9095192fe 100644 --- a/src/components/settings_modal/admin_tabs/emoji_tab.vue +++ b/src/components/settings_modal/admin_tabs/emoji_tab.vue @@ -387,11 +387,12 @@ ref="emojiPopovers" :key="shortcode" placement="top" - :title="$t('admin_dash.emoji.editing', [shortcode])" - :disabled="pack.remote !== undefined" + :title="$t(`admin_dash.emoji.${pack.remote === undefined ? 'editing' : 'copying'}`, [shortcode])" :shortcode="shortcode" :file="file" :pack-name="packName" + :remote="pack.remote" + :known-local-packs="knownLocalPacks" @update-pack-files="updatePackFiles" @display-error="displayError" > diff --git a/src/components/settings_modal/helpers/emoji_editing_popover.vue b/src/components/settings_modal/helpers/emoji_editing_popover.vue index 33c52da4d..e466822b3 100644 --- a/src/components/settings_modal/helpers/emoji_editing_popover.vue +++ b/src/components/settings_modal/helpers/emoji_editing_popover.vue @@ -7,7 +7,6 @@ popover-class="emoji-tab-edit-popover popover-default" :bound-to="{ x: 'container' }" :offset="{ y: 5 }" - :disabled="disabled" :class="{'emoji-unsaved': isEdited}" >