Browse Source

Merge remote-tracking branch 'origin/develop' into expert-settings-and-serverside

* origin/develop:
  Update dependency v-click-outside to v2.1.5
  Update dependency shelljs to v0.8.5
  Update dependency portal-vue to v2.1.7
  Update dependency lodash to v4.17.21
  Update dependency karma-spec-reporter to v0.0.33
  Update dependency karma-webpack to v4.0.2
  Update dependency karma-sourcemap-loader to v0.3.8
  Update dependency eslint-plugin-vue to v5.2.3
  Update dependency chromedriver to v87.0.7
  Update dependency @chenfengyuan/vue-qrcode to v1.0.2
  Pin dependencies
  Pin dependencies
  Do not mute bot posts in notifications
  Lint
  Add renovate.json
  Add bot indication to user icon on statuses
  Mute bot posts
  fix placeholder attachments opening new tab
Henry Jameson 2 years ago
parent
commit
f16f35a4d4

+ 97 - 97
package.json

@@ -16,107 +16,107 @@
     "lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs"
   },
   "dependencies": {
-    "@babel/runtime": "^7.7.6",
-    "@chenfengyuan/vue-qrcode": "^1.0.0",
-    "@fortawesome/fontawesome-svg-core": "^1.2.32",
-    "@fortawesome/free-regular-svg-icons": "^5.15.1",
-    "@fortawesome/free-solid-svg-icons": "^5.15.1",
-    "@fortawesome/vue-fontawesome": "^2.0.0",
-    "body-scroll-lock": "^2.6.4",
-    "chromatism": "^3.0.0",
-    "cropperjs": "^1.4.3",
-    "diff": "^3.0.1",
-    "escape-html": "^1.0.3",
-    "localforage": "^1.5.0",
-    "parse-link-header": "^1.0.1",
-    "phoenix": "^1.3.0",
-    "portal-vue": "^2.1.4",
-    "punycode.js": "^2.1.0",
-    "ruffle-mirror": "^2021.4.10",
-    "v-click-outside": "^2.1.1",
-    "vue": "^2.6.11",
-    "vue-i18n": "^7.3.2",
-    "vue-router": "^3.0.1",
-    "vue-template-compiler": "^2.6.11",
-    "vuelidate": "^0.7.4",
-    "vuex": "^3.0.1"
+    "@babel/runtime": "7.7.6",
+    "@chenfengyuan/vue-qrcode": "1.0.2",
+    "@fortawesome/fontawesome-svg-core": "1.2.32",
+    "@fortawesome/free-regular-svg-icons": "5.15.1",
+    "@fortawesome/free-solid-svg-icons": "5.15.1",
+    "@fortawesome/vue-fontawesome": "2.0.0",
+    "body-scroll-lock": "2.6.4",
+    "chromatism": "3.0.0",
+    "cropperjs": "1.4.3",
+    "diff": "3.5.0",
+    "escape-html": "1.0.3",
+    "localforage": "1.7.3",
+    "parse-link-header": "1.0.1",
+    "phoenix": "1.4.0",
+    "portal-vue": "2.1.7",
+    "punycode.js": "2.1.0",
+    "ruffle-mirror": "2021.4.11",
+    "v-click-outside": "2.1.5",
+    "vue": "2.6.11",
+    "vue-i18n": "7.8.1",
+    "vue-router": "3.0.2",
+    "vue-template-compiler": "2.6.11",
+    "vuelidate": "0.7.4",
+    "vuex": "3.0.1"
   },
   "devDependencies": {
-    "@babel/core": "^7.7.5",
-    "@babel/plugin-transform-runtime": "^7.7.6",
-    "@babel/preset-env": "^7.7.6",
-    "@babel/register": "^7.7.4",
-    "@ungap/event-target": "^0.1.0",
-    "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
-    "@vue/babel-preset-jsx": "^1.2.4",
-    "@vue/test-utils": "^1.0.0-beta.26",
-    "autoprefixer": "^6.4.0",
-    "babel-eslint": "^7.0.0",
-    "babel-loader": "^8.0.6",
-    "babel-plugin-lodash": "^3.3.4",
-    "chai": "^3.5.0",
-    "chalk": "^1.1.3",
-    "chromedriver": "^87.0.1",
-    "connect-history-api-fallback": "^1.1.0",
-    "copy-webpack-plugin": "^6.4.1",
-    "cross-spawn": "^4.0.2",
-    "css-loader": "^0.28.0",
-    "custom-event-polyfill": "^1.0.7",
-    "eslint": "^5.16.0",
-    "eslint-config-standard": "^12.0.0",
-    "eslint-friendly-formatter": "^2.0.5",
-    "eslint-loader": "^2.1.0",
-    "eslint-plugin-import": "^2.13.0",
-    "eslint-plugin-node": "^7.0.0",
-    "eslint-plugin-promise": "^4.0.0",
-    "eslint-plugin-standard": "^4.0.0",
-    "eslint-plugin-vue": "^5.2.2",
-    "eventsource-polyfill": "^0.9.6",
-    "express": "^4.13.3",
-    "file-loader": "^3.0.1",
-    "function-bind": "^1.0.2",
-    "html-webpack-plugin": "^3.0.0",
-    "http-proxy-middleware": "^0.17.2",
-    "inject-loader": "^2.0.1",
-    "iso-639-1": "^2.0.3",
-    "isparta-loader": "^2.0.0",
-    "json-loader": "^0.5.4",
-    "karma": "^3.0.0",
-    "karma-coverage": "^1.1.1",
-    "karma-firefox-launcher": "^1.1.0",
-    "karma-mocha": "^1.2.0",
-    "karma-mocha-reporter": "^2.2.1",
-    "karma-sinon-chai": "^2.0.2",
-    "karma-sourcemap-loader": "^0.3.7",
-    "karma-spec-reporter": "0.0.26",
-    "karma-webpack": "^4.0.0-rc.3",
-    "lodash": "^4.16.4",
-    "lolex": "^1.4.0",
-    "mini-css-extract-plugin": "^0.5.0",
-    "mocha": "^3.1.0",
-    "nightwatch": "^0.9.8",
-    "opn": "^4.0.2",
-    "ora": "^0.3.0",
-    "postcss-loader": "^3.0.0",
-    "raw-loader": "^0.5.1",
-    "sass": "^1.17.3",
+    "@babel/core": "7.7.5",
+    "@babel/plugin-transform-runtime": "7.7.6",
+    "@babel/preset-env": "7.7.6",
+    "@babel/register": "7.7.4",
+    "@ungap/event-target": "0.1.0",
+    "@vue/babel-helper-vue-jsx-merge-props": "1.2.1",
+    "@vue/babel-preset-jsx": "1.2.4",
+    "@vue/test-utils": "1.0.0-beta.28",
+    "autoprefixer": "6.7.7",
+    "babel-eslint": "7.2.3",
+    "babel-loader": "8.0.6",
+    "babel-plugin-lodash": "3.3.4",
+    "chai": "3.5.0",
+    "chalk": "1.1.3",
+    "chromedriver": "87.0.7",
+    "connect-history-api-fallback": "1.6.0",
+    "copy-webpack-plugin": "6.4.1",
+    "cross-spawn": "4.0.2",
+    "css-loader": "0.28.11",
+    "custom-event-polyfill": "1.0.7",
+    "eslint": "5.16.0",
+    "eslint-config-standard": "12.0.0",
+    "eslint-friendly-formatter": "2.0.7",
+    "eslint-loader": "2.1.2",
+    "eslint-plugin-import": "2.17.2",
+    "eslint-plugin-node": "7.0.1",
+    "eslint-plugin-promise": "4.1.1",
+    "eslint-plugin-standard": "4.0.0",
+    "eslint-plugin-vue": "5.2.3",
+    "eventsource-polyfill": "0.9.6",
+    "express": "4.16.4",
+    "file-loader": "3.0.1",
+    "function-bind": "1.1.1",
+    "html-webpack-plugin": "3.2.0",
+    "http-proxy-middleware": "0.17.4",
+    "inject-loader": "2.0.1",
+    "iso-639-1": "2.0.3",
+    "isparta-loader": "2.0.0",
+    "json-loader": "0.5.7",
+    "karma": "3.1.4",
+    "karma-coverage": "1.1.2",
+    "karma-firefox-launcher": "1.1.0",
+    "karma-mocha": "1.3.0",
+    "karma-mocha-reporter": "2.2.5",
+    "karma-sinon-chai": "2.0.2",
+    "karma-sourcemap-loader": "0.3.8",
+    "karma-spec-reporter": "0.0.33",
+    "karma-webpack": "4.0.2",
+    "lodash": "4.17.21",
+    "lolex": "1.6.0",
+    "mini-css-extract-plugin": "0.5.0",
+    "mocha": "3.5.3",
+    "nightwatch": "0.9.21",
+    "opn": "4.0.2",
+    "ora": "0.3.0",
+    "postcss-loader": "3.0.0",
+    "raw-loader": "0.5.1",
+    "sass": "1.20.1",
     "sass-loader": "git://github.com/webpack-contrib/sass-loader",
     "selenium-server": "2.53.1",
-    "semver": "^5.3.0",
-    "serviceworker-webpack-plugin": "^1.0.0",
-    "shelljs": "^0.8.4",
-    "sinon": "^2.1.0",
-    "sinon-chai": "^2.8.0",
-    "stylelint": "^13.6.1",
-    "stylelint-config-standard": "^20.0.0",
-    "stylelint-rscss": "^0.4.0",
-    "url-loader": "^1.1.2",
-    "vue-loader": "^14.0.0",
-    "vue-style-loader": "^4.0.0",
-    "webpack": "^4.44.0",
-    "webpack-dev-middleware": "^3.6.0",
-    "webpack-hot-middleware": "^2.12.2",
-    "webpack-merge": "^0.14.1"
+    "semver": "5.6.0",
+    "serviceworker-webpack-plugin": "1.0.1",
+    "shelljs": "0.8.5",
+    "sinon": "2.4.1",
+    "sinon-chai": "2.14.0",
+    "stylelint": "13.6.1",
+    "stylelint-config-standard": "20.0.0",
+    "stylelint-rscss": "0.4.0",
+    "url-loader": "1.1.2",
+    "vue-loader": "14.2.4",
+    "vue-style-loader": "4.1.2",
+    "webpack": "4.46.0",
+    "webpack-dev-middleware": "3.7.0",
+    "webpack-hot-middleware": "2.24.3",
+    "webpack-merge": "0.14.1"
   },
   "engines": {
     "node": ">= 4.0.0",

+ 6 - 0
renovate.json

@@ -0,0 +1,6 @@
+{
+  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+  "extends": [
+    "config:base"
+  ]
+}

+ 1 - 0
src/boot/after_store.js

@@ -115,6 +115,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
   copyInstanceOption('nsfwCensorImage')
   copyInstanceOption('background')
   copyInstanceOption('hidePostStats')
+  copyInstanceOption('hideBotIndication')
   copyInstanceOption('hideUserStats')
   copyInstanceOption('hideFilteredStatuses')
   copyInstanceOption('logo')

+ 1 - 0
src/components/attachment/attachment.vue

@@ -12,6 +12,7 @@
       :href="attachment.url"
       :alt="attachment.description"
       :title="attachment.description"
+      @click.prevent
     >
       <FAIcon :icon="placeholderIconClass" />
       <b>{{ nsfw ? "NSFW / " : "" }}</b>{{ edit ? '' : placeholderName }}

+ 13 - 0
src/components/settings_modal/tabs/filtering_tab.vue

@@ -44,9 +44,22 @@
             path="hidePostStats"
             expert="1"
           >
+        </li>
+        <li>
+          <BooleanSetting path="muteBotStatuses">
+            {{ $t('settings.mute_bot_posts') }}
+          </BooleanSetting>
+        </li>
+        <li>
+          <BooleanSetting path="hidePostStats">
             {{ $t('settings.hide_post_stats') }}
           </BooleanSetting>
         </li>
+        <li>
+          <BooleanSetting path="hideBotIndication">
+            {{ $t('settings.hide_bot_indication') }}
+          </BooleanSetting>
+        </li>
         <ChoiceSetting
           v-if="user"
           id="replyVisibility"

+ 15 - 1
src/components/status/status.js

@@ -166,6 +166,12 @@ const Status = {
     muteWordHits () {
       return muteWordHits(this.status, this.muteWords)
     },
+    botStatus () {
+      return this.status.user.bot
+    },
+    botIndicator () {
+      return this.botStatus && !this.hideBotIndication
+    },
     mentionsLine () {
       if (!this.headTailLinks) return []
       const writtenSet = new Set(this.headTailLinks.writtenMentions.map(_ => _.url))
@@ -191,7 +197,9 @@ const Status = {
         // Thread is muted
         status.thread_muted ||
         // Wordfiltered
-        this.muteWordHits.length > 0
+        this.muteWordHits.length > 0 ||
+        // bot status
+        (this.muteBotStatuses && this.botStatus && !this.compact)
       return !this.unmuted && !this.shouldNotMute && reasonsToMute
     },
     userIsMuted () {
@@ -293,6 +301,12 @@ const Status = {
     hidePostStats () {
       return this.mergedConfig.hidePostStats
     },
+    muteBotStatuses () {
+      return this.mergedConfig.muteBotStatuses
+    },
+    hideBotIndication () {
+      return this.mergedConfig.hideBotIndication
+    },
     currentUser () {
       return this.$store.state.users.currentUser
     },

+ 6 - 1
src/components/status/status.vue

@@ -77,6 +77,7 @@
         <UserAvatar
           v-if="retweet"
           class="left-side repeater-avatar"
+          :bot="botIndicator"
           :better-shadow="betterShadow"
           :user="statusoid.user"
         />
@@ -124,6 +125,7 @@
             @click.stop.prevent.capture.native="toggleUserExpanded"
           >
             <UserAvatar
+              :bot="botIndicator"
               :compact="compact"
               :better-shadow="betterShadow"
               :user="status.user"
@@ -407,7 +409,10 @@
         class="gravestone"
       >
         <div class="left-side">
-          <UserAvatar :compact="compact" />
+          <UserAvatar
+            :compact="compact"
+            :bot="botIndicator"
+          />
         </div>
         <div class="right-side">
           <div class="deleted-text">

+ 1 - 0
src/components/still-image/still-image.vue

@@ -19,6 +19,7 @@
       @load="onLoad"
       @error="onError"
     >
+    <slot/>
   </div>
 </template>
 

+ 7 - 0
src/components/timeline/timeline_quick_settings.js

@@ -53,6 +53,13 @@ const TimelineQuickSettings = {
         const value = !this.hideMutedPosts
         this.$store.dispatch('setOption', { name: 'hideFilteredStatuses', value })
       }
+    },
+    muteBotStatuses: {
+      get () { return this.mergedConfig.muteBotStatuses },
+      set () {
+        const value = !this.muteBotStatuses
+        this.$store.dispatch('setOption', { name: 'muteBotStatuses', value })
+      }
     }
   }
 }

+ 9 - 0
src/components/timeline/timeline_quick_settings.vue

@@ -39,6 +39,15 @@
             class="dropdown-divider"
           />
         </div>
+        <button
+          class="button-default dropdown-item"
+          @click="muteBotStatuses = !muteBotStatuses"
+        >
+          <span
+            class="menu-checkbox"
+            :class="{ 'menu-checkbox-checked': muteBotStatuses }"
+          />{{ $t('settings.mute_bot_posts') }}
+        </button>
         <button
           class="button-default dropdown-item"
           @click="hideMedia = !hideMedia"

+ 12 - 1
src/components/user_avatar/user_avatar.js

@@ -1,10 +1,21 @@
 import StillImage from '../still-image/still-image.vue'
 
+import { library } from '@fortawesome/fontawesome-svg-core'
+
+import {
+  faRobot
+} from '@fortawesome/free-solid-svg-icons'
+
+library.add(
+  faRobot
+)
+
 const UserAvatar = {
   props: [
     'user',
     'betterShadow',
-    'compact'
+    'compact',
+    'bot'
   ],
   data () {
     return {

+ 9 - 1
src/components/user_avatar/user_avatar.vue

@@ -7,7 +7,9 @@
     :src="imgSrc(user.profile_image_url_original)"
     :class="{ 'avatar-compact': compact, 'better-shadow': betterShadow }"
     :image-load-error="imageLoadError"
-  />
+  >
+    <FAIcon v-if="bot" icon="robot" class="bot-indicator" />
+  </StillImage>
   <div
     v-else
     class="Avatar -placeholder"
@@ -36,6 +38,12 @@
     height: 100%;
   }
 
+  & > .bot-indicator {
+    position: absolute;
+    bottom: 0;
+    right: 0;
+  }
+
   &.better-shadow {
     box-shadow: var(--_avatarShadowInset);
     filter: var(--_avatarShadowFilter);

+ 2 - 0
src/i18n/en.json

@@ -354,6 +354,8 @@
     "hide_attachments_in_tl": "Hide attachments in timeline",
     "hide_media_previews": "Hide media previews",
     "hide_muted_posts": "Hide posts of muted users",
+    "mute_bot_posts": "Mute bot posts",
+    "hide_bot_indication": "Hide bot indication in posts",
     "hide_all_muted_posts": "Hide muted posts",
     "max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)",
     "hide_isp": "Hide instance-specific panel",

+ 2 - 0
src/modules/config.js

@@ -28,6 +28,7 @@ export const defaultState = {
   hideMutedPosts: undefined, // instance default
   hideMutedThreads: undefined, // instance default
   hideWordFilteredPosts: undefined, // instance default
+  muteBotStatuses: undefined, // instance default
   collapseMessageWithSubject: undefined, // instance default
   padEmoji: true,
   hideAttachments: false,
@@ -80,6 +81,7 @@ export const defaultState = {
   mentionLinkShowYous: undefined, // instance default
   mentionLinkBoldenYou: undefined, // instance default
   hidePostStats: undefined, // instance default
+  hideBotIndication: undefined, // instance default
   hideUserStats: undefined, // instance default
   virtualScrolling: undefined, // instance default
   sensitiveByDefault: undefined // instance default

+ 2 - 0
src/modules/instance.js

@@ -33,8 +33,10 @@ const defaultState = {
   hideMutedThreads: true,
   hideWordFilteredPosts: false,
   hidePostStats: false,
+  hideBotIndication: false,
   hideSitename: false,
   hideUserStats: false,
+  muteBotStatuses: false,
   loginMethod: 'password',
   logo: '/static/logo.svg',
   logoMargin: '.2em',

File diff suppressed because it is too large
+ 201 - 188
yarn.lock


Some files were not shown because too many files changed in this diff