diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md
new file mode 100644
index 000000000..bfd5e7b41
--- /dev/null
+++ b/.gitlab/issue_templates/Bug.md
@@ -0,0 +1,25 @@
+# Environment info
+
+
+* Browser, version, OS, platform:
+* Instance URL:
+* Frontend version (see settings -> about):
+* Backend version (see settings -> about):
+* Browser extensions (ublock, rikaichamp etc):
+* Known instance/user customizations (i.e. pleromafe mods/forks, instance styles etc)
+
+# Bug description & reproduction steps
+
+
+
+
+
+# Bug seriousness
+
+
+* How annoying it is:
+* How often does it happen:
+* How many people does it affect:
+* Is there a workaround for it:
+
+/label ~Bug
diff --git a/.gitlab/issue_templates/Suggestion.md b/.gitlab/issue_templates/Suggestion.md
new file mode 100644
index 000000000..7472981a7
--- /dev/null
+++ b/.gitlab/issue_templates/Suggestion.md
@@ -0,0 +1,11 @@
+# Behavior suggestion/Feature request
+
+
+/label ~suggestion
+
diff --git a/.gitlab/issue_templates/default.md b/.gitlab/issue_templates/default.md
new file mode 100644
index 000000000..4ada07020
--- /dev/null
+++ b/.gitlab/issue_templates/default.md
@@ -0,0 +1,7 @@
+
+
+/label ~needs-triage
+
diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md
new file mode 100644
index 000000000..ed9d54cb0
--- /dev/null
+++ b/.gitlab/merge_request_templates/default.md
@@ -0,0 +1,30 @@
+
+# Changes
+
+*
+*
+*
+
+
+
+
+
+
+
+/label ~needs-review
diff --git a/.node-version b/.node-version
index 431076a94..5397c87fa 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-16.16.0
+16.18.1
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b7eea7272..f6e529787 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -48,6 +48,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Enabled users to zoom and pan images in media viewer with mouse and touch
- Timelines/panels and conversations have sticky headers now
- Added frontend ui for account migration
+- Implemented remote interaction with statuses
## [2.4.2] - 2022-01-09
diff --git a/package.json b/package.json
index 251aa7edf..477c1665b 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
"lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs"
},
"dependencies": {
- "@babel/runtime": "7.18.9",
+ "@babel/runtime": "7.20.0",
"@chenfengyuan/vue-qrcode": "2.0.0",
"@fortawesome/fontawesome-svg-core": "6.2.0",
"@fortawesome/free-regular-svg-icons": "6.2.0",
@@ -43,43 +43,43 @@
"querystring-es3": "0.2.1",
"url": "0.11.0",
"utf8": "3.0.0",
- "vue": "3.2.38",
+ "vue": "3.2.41",
"vue-i18n": "9.2.2",
- "vue-router": "4.1.5",
- "vue-template-compiler": "2.7.10",
- "vuex": "4.0.2"
+ "vue-router": "4.1.6",
+ "vue-template-compiler": "2.7.13",
+ "vuex": "4.1.0"
},
"devDependencies": {
- "@babel/core": "7.18.13",
- "@babel/eslint-parser": "7.18.9",
- "@babel/plugin-transform-runtime": "7.18.10",
- "@babel/preset-env": "7.18.10",
+ "@babel/core": "7.19.6",
+ "@babel/eslint-parser": "7.19.1",
+ "@babel/plugin-transform-runtime": "7.19.6",
+ "@babel/preset-env": "7.19.4",
"@babel/register": "7.18.9",
"@intlify/vue-i18n-loader": "5.0.0",
"@ungap/event-target": "0.2.3",
"@vue/babel-helper-vue-jsx-merge-props": "1.4.0",
"@vue/babel-plugin-jsx": "1.1.1",
- "@vue/compiler-sfc": "3.2.38",
- "@vue/test-utils": "2.0.2",
+ "@vue/compiler-sfc": "3.2.41",
+ "@vue/test-utils": "2.2.1",
"autoprefixer": "10.4.12",
"babel-loader": "8.2.5",
"babel-plugin-lodash": "3.3.4",
- "chai": "4.3.6",
+ "chai": "4.3.7",
"chalk": "1.1.3",
"chromedriver": "104.0.0",
"connect-history-api-fallback": "2.0.0",
"copy-webpack-plugin": "11.0.0",
"cross-spawn": "7.0.3",
"css-loader": "6.7.1",
- "css-minimizer-webpack-plugin": "4.0.0",
+ "css-minimizer-webpack-plugin": "4.2.2",
"custom-event-polyfill": "1.0.7",
- "eslint": "8.23.0",
+ "eslint": "8.26.0",
"eslint-config-standard": "17.0.0",
"eslint-formatter-friendly": "7.0.0",
"eslint-plugin-import": "2.26.0",
- "eslint-plugin-n": "15.2.5",
- "eslint-plugin-promise": "6.0.1",
- "eslint-plugin-vue": "9.4.0",
+ "eslint-plugin-n": "15.5.0",
+ "eslint-plugin-promise": "6.1.1",
+ "eslint-plugin-vue": "9.7.0",
"eslint-webpack-plugin": "3.2.0",
"eventsource-polyfill": "0.9.6",
"express": "4.18.2",
@@ -88,7 +88,7 @@
"http-proxy-middleware": "2.0.6",
"iso-639-1": "2.1.15",
"json-loader": "0.5.7",
- "karma": "6.4.0",
+ "karma": "6.4.1",
"karma-coverage": "2.2.0",
"karma-firefox-launcher": "2.1.2",
"karma-mocha": "2.0.1",
@@ -108,16 +108,16 @@
"sass": "1.55.0",
"sass-loader": "13.0.2",
"selenium-server": "2.53.1",
- "semver": "7.3.7",
+ "semver": "7.3.8",
"serviceworker-webpack5-plugin": "2.0.0",
"shelljs": "0.8.5",
- "sinon": "14.0.0",
+ "sinon": "14.0.1",
"sinon-chai": "3.7.0",
"stylelint": "13.13.1",
"stylelint-config-standard": "20.0.0",
"stylelint-rscss": "0.4.0",
- "vue-loader": "17.0.0",
"unicode-emoji-json": "^0.3.0",
+ "vue-loader": "17.0.1",
"vue-style-loader": "4.1.3",
"webpack": "5.74.0",
"webpack-dev-middleware": "3.7.3",
diff --git a/src/App.vue b/src/App.vue
index 060fa70af..23a388a62 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -33,7 +33,7 @@
-
-
+
-
+
-
+
+ @goto="setHighlight"
+ @toggleExpanded="toggleExpanded"
+ />
+
diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue
index 63bf856e0..c9bbc18f0 100644
--- a/src/components/emoji_input/emoji_input.vue
+++ b/src/components/emoji_input/emoji_input.vue
@@ -6,9 +6,16 @@
>
-
+
{{ preText }}
- x
+ x
{{ postText }}
@@ -33,9 +40,9 @@
/>
-
+
diff --git a/src/components/moderation_tools/moderation_tools.js b/src/components/moderation_tools/moderation_tools.js
index 2469327af..a5ce86560 100644
--- a/src/components/moderation_tools/moderation_tools.js
+++ b/src/components/moderation_tools/moderation_tools.js
@@ -41,14 +41,26 @@ const ModerationTools = {
tagsSet () {
return new Set(this.user.tags)
},
- hasTagPolicy () {
- return this.$store.state.instance.tagPolicyAvailable
+ canGrantRole () {
+ return this.user.is_local && !this.user.deactivated && this.$store.state.users.currentUser.role === 'admin'
+ },
+ canChangeActivationState () {
+ return this.privileged('users_manage_activation_state')
+ },
+ canDeleteAccount () {
+ return this.privileged('users_delete')
+ },
+ canUseTagPolicy () {
+ return this.$store.state.instance.tagPolicyAvailable && this.privileged('users_manage_tags')
}
},
methods: {
hasTag (tagName) {
return this.tagsSet.has(tagName)
},
+ privileged (privilege) {
+ return this.$store.state.users.currentUser.privileges.includes(privilege)
+ },
toggleTag (tag) {
const store = this.$store
if (this.tagsSet.has(tag)) {
diff --git a/src/components/moderation_tools/moderation_tools.vue b/src/components/moderation_tools/moderation_tools.vue
index 34fe2e7c0..8535ef273 100644
--- a/src/components/moderation_tools/moderation_tools.vue
+++ b/src/components/moderation_tools/moderation_tools.vue
@@ -10,7 +10,7 @@
>
+
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index f9c90a7ed..633efca6b 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -3,7 +3,8 @@
:disabled="minimalMode || disableTeleport"
:to="teleportTarget"
>
- {{ unseenCount }}
-
-
+
diff --git a/src/components/popover/popover.js b/src/components/popover/popover.js
index 3474d3542..d44b266bb 100644
--- a/src/components/popover/popover.js
+++ b/src/components/popover/popover.js
@@ -43,7 +43,12 @@ const Popover = {
overlayCentersSelector: String,
// Lets hover popover stay when clicking inside of it
- stayOnClick: Boolean
+ stayOnClick: Boolean,
+
+ triggerAttrs: {
+ type: Object,
+ default: {}
+ }
},
inject: ['popoversZLayer'], // override popover z layer
data () {
diff --git a/src/components/popover/popover.vue b/src/components/popover/popover.vue
index 217eba7c9..2869d7360 100644
--- a/src/components/popover/popover.vue
+++ b/src/components/popover/popover.vue
@@ -7,11 +7,15 @@
ref="trigger"
class="button-unstyled popover-trigger-button"
type="button"
+ v-bind="triggerAttrs"
@click="onClick"
>
-
+
-
+
diff --git a/src/components/quick_view_settings/quick_view_settings.vue b/src/components/quick_view_settings/quick_view_settings.vue
index b0413cac1..4bd81c5bd 100644
--- a/src/components/quick_view_settings/quick_view_settings.vue
+++ b/src/components/quick_view_settings/quick_view_settings.vue
@@ -3,6 +3,7 @@
trigger="click"
class="QuickViewSettings"
:bound-to="{ x: 'container' }"
+ :trigger-attrs="{ title: $t('timeline.quick_view_settings') }"
>
-
+
diff --git a/src/components/reply_button/reply_button.js b/src/components/reply_button/reply_button.js
index d6382982d..543d25ac2 100644
--- a/src/components/reply_button/reply_button.js
+++ b/src/components/reply_button/reply_button.js
@@ -17,6 +17,9 @@ const ReplyButton = {
computed: {
loggedIn () {
return !!this.$store.state.users.currentUser
+ },
+ remoteInteractionLink () {
+ return this.$store.getters.remoteInteractionLink({ statusId: this.status.id })
}
}
}
diff --git a/src/components/reply_button/reply_button.vue b/src/components/reply_button/reply_button.vue
index ea97fbaad..dada511be 100644
--- a/src/components/reply_button/reply_button.vue
+++ b/src/components/reply_button/reply_button.vue
@@ -26,13 +26,19 @@
/>
-
+
-
+
-
+
-
+
{
this.loading = false
- this.userIds = map(data.accounts, 'id')
- this.statuses = data.statuses
- this.hashtags = data.hashtags
+
+ const oldLength = this.statuses.length
+
+ // Always append to old results. If new results are empty, this doesn't change anything
+ this.userIds = this.userIds.concat(map(data.accounts, 'id'))
+ this.statuses = uniqBy(this.statuses.concat(data.statuses), 'id')
+ this.hashtags = this.hashtags.concat(data.hashtags)
+
this.currenResultTab = this.getActiveTab()
this.loaded = true
+
+ // Offset from whatever we already have
+ this.statusesOffset = this.statuses.length
+ // Because the amount of new statuses can actually be zero, compare to old lenght instead
+ this.lastStatusFetchCount = this.statuses.length - oldLength
+ this.lastQuery = query
})
},
resultCount (tabName) {
diff --git a/src/components/search/search.vue b/src/components/search/search.vue
index b7bfc1f39..6fc6a0dea 100644
--- a/src/components/search/search.vue
+++ b/src/components/search/search.vue
@@ -22,7 +22,7 @@
-
-
{{ $t('search.no_results') }}
-
+
+
+
+
+
+
+ {{ visibleStatuses.length === 0 ? $t('search.no_results') : $t('search.no_more_results') }}
+
+
diff --git a/src/components/staff_panel/staff_panel.js b/src/components/staff_panel/staff_panel.js
index 91f5e910f..46a92ac78 100644
--- a/src/components/staff_panel/staff_panel.js
+++ b/src/components/staff_panel/staff_panel.js
@@ -14,7 +14,6 @@ const StaffPanel = {
computed: {
groupedStaffAccounts () {
const staffAccounts = map(this.staffAccounts, this.findUserByName).filter(_ => _)
- console.log(staffAccounts)
const groupedStaffAccounts = groupBy(staffAccounts, 'role')
return [
diff --git a/src/components/thread_tree/thread_tree.vue b/src/components/thread_tree/thread_tree.vue
index 4eaf597dc..c6fffc71a 100644
--- a/src/components/thread_tree/thread_tree.vue
+++ b/src/components/thread_tree/thread_tree.vue
@@ -1,5 +1,5 @@
-
-
+
diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue
index 8a036fd03..2279f21a0 100644
--- a/src/components/timeline/timeline.vue
+++ b/src/components/timeline/timeline.vue
@@ -6,8 +6,8 @@
:timeline-name="timelineName"
/>