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
This commit is contained in:
Henry Jameson 2022-03-13 16:34:05 +02:00
commit f16f35a4d4
16 changed files with 510 additions and 402 deletions

View File

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

6
renovate.json Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -53,6 +53,13 @@ const TimelineQuickSettings = {
const value = !this.hideMutedPosts const value = !this.hideMutedPosts
this.$store.dispatch('setOption', { name: 'hideFilteredStatuses', value }) 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 })
}
} }
} }
} }

View File

@ -39,6 +39,15 @@
class="dropdown-divider" class="dropdown-divider"
/> />
</div> </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 <button
class="button-default dropdown-item" class="button-default dropdown-item"
@click="hideMedia = !hideMedia" @click="hideMedia = !hideMedia"

View File

@ -1,10 +1,21 @@
import StillImage from '../still-image/still-image.vue' 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 = { const UserAvatar = {
props: [ props: [
'user', 'user',
'betterShadow', 'betterShadow',
'compact' 'compact',
'bot'
], ],
data () { data () {
return { return {

View File

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

View File

@ -354,6 +354,8 @@
"hide_attachments_in_tl": "Hide attachments in timeline", "hide_attachments_in_tl": "Hide attachments in timeline",
"hide_media_previews": "Hide media previews", "hide_media_previews": "Hide media previews",
"hide_muted_posts": "Hide posts of muted users", "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", "hide_all_muted_posts": "Hide muted posts",
"max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)", "max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)",
"hide_isp": "Hide instance-specific panel", "hide_isp": "Hide instance-specific panel",

View File

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

View File

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

628
yarn.lock

File diff suppressed because it is too large Load Diff