Merge branch 'optimize' into shigusegubu-themes3
This commit is contained in:
commit
3ed79de625
39 changed files with 93 additions and 96 deletions
|
|
@ -6,6 +6,10 @@ import { createRouter, createWebHistory } from 'vue-router'
|
||||||
import VueVirtualScroller from 'vue-virtual-scroller'
|
import VueVirtualScroller from 'vue-virtual-scroller'
|
||||||
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
|
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
|
||||||
|
|
||||||
|
import Status from 'src/components/status/status.vue'
|
||||||
|
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
||||||
|
import StillImage from 'src/components/still-image/still-image.vue'
|
||||||
|
|
||||||
import { config } from '@fortawesome/fontawesome-svg-core'
|
import { config } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
import {
|
||||||
FontAwesomeIcon,
|
FontAwesomeIcon,
|
||||||
|
|
@ -611,6 +615,9 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => {
|
||||||
|
|
||||||
app.component('FAIcon', FontAwesomeIcon)
|
app.component('FAIcon', FontAwesomeIcon)
|
||||||
app.component('FALayers', FontAwesomeLayers)
|
app.component('FALayers', FontAwesomeLayers)
|
||||||
|
app.component('Status', Status)
|
||||||
|
app.component('RichContent', RichContent)
|
||||||
|
app.component('StillImage', StillImage)
|
||||||
|
|
||||||
// remove after vue 3.3
|
// remove after vue 3.3
|
||||||
app.config.unwrapInjectedRef = true
|
app.config.unwrapInjectedRef = true
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,14 @@ import { mapState } from 'vuex'
|
||||||
|
|
||||||
import localeService from '../../services/locale/locale.service.js'
|
import localeService from '../../services/locale/locale.service.js'
|
||||||
import AnnouncementEditor from '../announcement_editor/announcement_editor.vue'
|
import AnnouncementEditor from '../announcement_editor/announcement_editor.vue'
|
||||||
import RichContent from '../rich_content/rich_content.jsx'
|
|
||||||
|
|
||||||
import { useAnnouncementsStore } from 'src/stores/announcements.js'
|
import { useAnnouncementsStore } from 'src/stores/announcements.js'
|
||||||
|
|
||||||
const Announcement = {
|
const Announcement = {
|
||||||
components: {
|
components: {
|
||||||
AnnouncementEditor,
|
AnnouncementEditor,
|
||||||
RichContent,
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import nsfwImage from '../../assets/nsfw.png'
|
import nsfwImage from '../../assets/nsfw.png'
|
||||||
import Popover from '../popover/popover.vue'
|
import Popover from '../popover/popover.vue'
|
||||||
import StillImage from '../still-image/still-image.vue'
|
|
||||||
import VideoAttachment from '../video_attachment/video_attachment.vue'
|
import VideoAttachment from '../video_attachment/video_attachment.vue'
|
||||||
|
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
|
|
@ -69,10 +69,12 @@ const Attachment = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Flash: defineAsyncComponent(() => import('src/components/flash/flash.vue')),
|
Flash: defineAsyncComponent(
|
||||||
StillImage,
|
() => import( 'src/components/flash/flash.vue'),
|
||||||
|
),
|
||||||
|
|
||||||
VideoAttachment: defineAsyncComponent(
|
VideoAttachment: defineAsyncComponent(
|
||||||
() => import('src/components/video_attachment/video_attachment.vue'),
|
() => import( 'src/components/video_attachment/video_attachment.vue'),
|
||||||
),
|
),
|
||||||
Popover,
|
Popover,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import UserAvatar from '../user_avatar/user_avatar.vue'
|
import UserAvatar from '../user_avatar/user_avatar.vue'
|
||||||
import UserLink from '../user_link/user_link.vue'
|
import UserLink from '../user_link/user_link.vue'
|
||||||
import UserPopover from '../user_popover/user_popover.vue'
|
import UserPopover from '../user_popover/user_popover.vue'
|
||||||
|
|
@ -13,7 +13,7 @@ const BasicUserCard = {
|
||||||
components: {
|
components: {
|
||||||
UserPopover,
|
UserPopover,
|
||||||
UserAvatar,
|
UserAvatar,
|
||||||
RichContent,
|
|
||||||
UserLink,
|
UserLink,
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import Popover from 'src/components/popover/popover.vue'
|
||||||
import StatusContent from 'src/components/status_content/status_content.vue'
|
import StatusContent from 'src/components/status_content/status_content.vue'
|
||||||
import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
|
import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
|
||||||
import UserPopover from 'src/components/user_popover/user_popover.vue'
|
import UserPopover from 'src/components/user_popover/user_popover.vue'
|
||||||
|
import Gallery from 'src/components/gallery/gallery.vue'
|
||||||
|
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
import { useInterfaceStore } from 'src/stores/interface'
|
import { useInterfaceStore } from 'src/stores/interface'
|
||||||
|
|
@ -34,9 +35,7 @@ const ChatMessage = {
|
||||||
Attachment,
|
Attachment,
|
||||||
StatusContent,
|
StatusContent,
|
||||||
UserAvatar,
|
UserAvatar,
|
||||||
Gallery: defineAsyncComponent(
|
Gallery,
|
||||||
() => import( 'src/components/gallery/gallery.vue'),
|
|
||||||
),
|
|
||||||
LinkPreview,
|
LinkPreview,
|
||||||
ChatMessageDate,
|
ChatMessageDate,
|
||||||
UserPopover,
|
UserPopover,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
|
import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
|
||||||
import UserPopover from 'src/components/user_popover/user_popover.vue'
|
import UserPopover from 'src/components/user_popover/user_popover.vue'
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@ export default {
|
||||||
name: 'ChatTitle',
|
name: 'ChatTitle',
|
||||||
components: {
|
components: {
|
||||||
UserAvatar,
|
UserAvatar,
|
||||||
RichContent,
|
|
||||||
UserPopover,
|
UserPopover,
|
||||||
},
|
},
|
||||||
props: ['user', 'withAvatar'],
|
props: ['user', 'withAvatar'],
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import { mapState } from 'vuex'
|
||||||
import { WSConnectionStatus } from '../../services/api/api.service.js'
|
import { WSConnectionStatus } from '../../services/api/api.service.js'
|
||||||
import QuickFilterSettings from '../quick_filter_settings/quick_filter_settings.vue'
|
import QuickFilterSettings from '../quick_filter_settings/quick_filter_settings.vue'
|
||||||
import QuickViewSettings from '../quick_view_settings/quick_view_settings.vue'
|
import QuickViewSettings from '../quick_view_settings/quick_view_settings.vue'
|
||||||
import Status from '../status/status.vue'
|
|
||||||
import ThreadTree from '../thread_tree/thread_tree.vue'
|
import ThreadTree from '../thread_tree/thread_tree.vue'
|
||||||
|
|
||||||
import { useInterfaceStore } from 'src/stores/interface'
|
import { useInterfaceStore } from 'src/stores/interface'
|
||||||
|
|
@ -402,7 +402,6 @@ const conversation = {
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Status,
|
|
||||||
ThreadTree,
|
ThreadTree,
|
||||||
QuickFilterSettings,
|
QuickFilterSettings,
|
||||||
QuickViewSettings,
|
QuickViewSettings,
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import StatusContent from 'src/components/status_content/status_content.vue'
|
import StatusContent from 'src/components/status_content/status_content.vue'
|
||||||
import PostStatusForm from 'src/components/post_status_form/post_status_form.vue'
|
import PostStatusForm from 'src/components/post_status_form/post_status_form.vue'
|
||||||
|
import Gallery from 'src/components/gallery/gallery.vue'
|
||||||
|
|
||||||
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
|
|
||||||
|
|
@ -21,9 +22,7 @@ const Draft = {
|
||||||
() => import('src/components/confirm_modal/confirm_modal.vue'),
|
() => import('src/components/confirm_modal/confirm_modal.vue'),
|
||||||
),
|
),
|
||||||
StatusContent,
|
StatusContent,
|
||||||
Gallery: defineAsyncComponent(
|
Gallery,
|
||||||
() => import( 'src/components/gallery/gallery.vue')
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
draft: {
|
draft: {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import { defineAsyncComponent } from 'vue'
|
||||||
import Popover from 'src/components/popover/popover.vue'
|
import Popover from 'src/components/popover/popover.vue'
|
||||||
import { ensureFinalFallback } from '../../i18n/languages.js'
|
import { ensureFinalFallback } from '../../i18n/languages.js'
|
||||||
import Checkbox from '../checkbox/checkbox.vue'
|
import Checkbox from '../checkbox/checkbox.vue'
|
||||||
import StillImage from '../still-image/still-image.vue'
|
|
||||||
|
|
||||||
import { useEmojiStore } from 'src/stores/emoji.js'
|
import { useEmojiStore } from 'src/stores/emoji.js'
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
|
|
@ -142,7 +142,7 @@ const EmojiPicker = {
|
||||||
() => import('src/components/sticker_picker/sticker_picker.vue'),
|
() => import('src/components/sticker_picker/sticker_picker.vue'),
|
||||||
),
|
),
|
||||||
Checkbox,
|
Checkbox,
|
||||||
StillImage,
|
|
||||||
Popover,
|
Popover,
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import StillImage from 'src/components/still-image/still-image.vue'
|
|
||||||
import UserAvatar from '../user_avatar/user_avatar.vue'
|
import UserAvatar from '../user_avatar/user_avatar.vue'
|
||||||
import UserListPopover from '../user_list_popover/user_list_popover.vue'
|
import UserListPopover from '../user_list_popover/user_list_popover.vue'
|
||||||
|
|
||||||
|
|
@ -17,7 +17,7 @@ const EmojiReactions = {
|
||||||
components: {
|
components: {
|
||||||
UserAvatar,
|
UserAvatar,
|
||||||
UserListPopover,
|
UserListPopover,
|
||||||
StillImage,
|
|
||||||
},
|
},
|
||||||
props: ['status'],
|
props: ['status'],
|
||||||
data: () => ({
|
data: () => ({
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
|
import GestureService from '../../services/gesture_service/gesture_service'
|
||||||
|
|
||||||
|
import { useMediaViewerStore } from 'src/stores/media_viewer.js'
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import Modal from 'src/components/modal/modal.vue'
|
import Modal from 'src/components/modal/modal.vue'
|
||||||
import StillImage from 'src/components/still-image/still-image.vue'
|
import StillImage from 'src/components/still-image/still-image.vue'
|
||||||
import GestureService from '../../services/gesture_service/gesture_service'
|
|
||||||
|
|
||||||
import { useMediaViewerStore } from 'src/stores/media_viewer.js'
|
|
||||||
|
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
import {
|
||||||
|
|
@ -18,18 +18,20 @@ library.add(faChevronLeft, faChevronRight, faCircleNotch, faTimes)
|
||||||
|
|
||||||
const MediaModal = {
|
const MediaModal = {
|
||||||
components: {
|
components: {
|
||||||
StillImage,
|
|
||||||
VideoAttachment: defineAsyncComponent(
|
VideoAttachment: defineAsyncComponent(
|
||||||
() => import('src/components/video_attachment/video_attachment.vue'),
|
() => import( 'src/components/video_attachment/video_attachment.vue'),
|
||||||
),
|
),
|
||||||
PinchZoom: defineAsyncComponent(
|
PinchZoom: defineAsyncComponent(
|
||||||
() => import('src/components/pinch_zoom/pinch_zoom.vue'),
|
() => import( 'src/components/pinch_zoom/pinch_zoom.vue'),
|
||||||
),
|
),
|
||||||
SwipeClick: defineAsyncComponent(
|
SwipeClick: defineAsyncComponent(
|
||||||
() => import('src/components/swipe_click/swipe_click.vue'),
|
() => import( 'src/components/swipe_click/swipe_click.vue'),
|
||||||
),
|
),
|
||||||
Modal,
|
Modal,
|
||||||
Flash: defineAsyncComponent(() => import('src/components/flash/flash.vue')),
|
Flash: defineAsyncComponent(
|
||||||
|
() => import( 'src/components/flash/flash.vue'),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import {
|
||||||
routeTo,
|
routeTo,
|
||||||
TIMELINES,
|
TIMELINES,
|
||||||
} from 'src/components/navigation/navigation.js'
|
} from 'src/components/navigation/navigation.js'
|
||||||
import StillImage from 'src/components/still-image/still-image.vue'
|
|
||||||
|
|
||||||
import { useAnnouncementsStore } from 'src/stores/announcements'
|
import { useAnnouncementsStore } from 'src/stores/announcements'
|
||||||
import { useBookmarkFoldersStore } from 'src/stores/bookmark_folders'
|
import { useBookmarkFoldersStore } from 'src/stores/bookmark_folders'
|
||||||
|
|
@ -55,7 +55,7 @@ const NavPanel = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
StillImage,
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
getters() {
|
getters() {
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
import { defineAsyncComponent } from 'vue'
|
|
||||||
import { mapState } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
|
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import { isStatusNotification } from '../../services/notification_utils/notification_utils.js'
|
import { isStatusNotification } from '../../services/notification_utils/notification_utils.js'
|
||||||
import {
|
import {
|
||||||
highlightClass,
|
highlightClass,
|
||||||
highlightStyle,
|
highlightStyle,
|
||||||
} from '../../services/user_highlighter/user_highlighter.js'
|
} from '../../services/user_highlighter/user_highlighter.js'
|
||||||
|
|
||||||
import Report from '../report/report.vue'
|
import Report from '../report/report.vue'
|
||||||
import Status from '../status/status.vue'
|
|
||||||
import StatusContent from '../status_content/status_content.vue'
|
import StatusContent from '../status_content/status_content.vue'
|
||||||
import Timeago from '../timeago/timeago.vue'
|
import Timeago from '../timeago/timeago.vue'
|
||||||
import UserAvatar from '../user_avatar/user_avatar.vue'
|
import UserAvatar from '../user_avatar/user_avatar.vue'
|
||||||
|
|
@ -19,6 +19,7 @@ import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
import { useUserHighlightStore } from 'src/stores/user_highlight.js'
|
import { useUserHighlightStore } from 'src/stores/user_highlight.js'
|
||||||
|
|
||||||
|
import { defineAsyncComponent } from 'vue'
|
||||||
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
|
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
|
||||||
|
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
|
|
@ -64,14 +65,13 @@ const Notification = {
|
||||||
StatusContent,
|
StatusContent,
|
||||||
UserAvatar,
|
UserAvatar,
|
||||||
Timeago,
|
Timeago,
|
||||||
Status,
|
|
||||||
Report,
|
Report,
|
||||||
RichContent,
|
|
||||||
UserPopover,
|
UserPopover,
|
||||||
UserLink,
|
UserLink,
|
||||||
ConfirmModal: defineAsyncComponent(
|
ConfirmModal: defineAsyncComponent(() => import('src/components/confirm_modal/confirm_modal.vue')),
|
||||||
() => import('src/components/confirm_modal/confirm_modal.vue'),
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.addEventListener('selectionchange', this.onContentSelect)
|
document.addEventListener('selectionchange', this.onContentSelect)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import Checkbox from 'components/checkbox/checkbox.vue'
|
import Checkbox from 'components/checkbox/checkbox.vue'
|
||||||
import RichContent from 'components/rich_content/rich_content.jsx'
|
|
||||||
import Timeago from 'components/timeago/timeago.vue'
|
import Timeago from 'components/timeago/timeago.vue'
|
||||||
|
|
||||||
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
|
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
|
||||||
|
|
@ -12,7 +12,7 @@ export default {
|
||||||
props: ['basePoll', 'emoji'],
|
props: ['basePoll', 'emoji'],
|
||||||
components: {
|
components: {
|
||||||
Timeago,
|
Timeago,
|
||||||
RichContent,
|
|
||||||
Checkbox,
|
Checkbox,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ import { propsToNative } from '../../services/attributes_helper/attributes_helpe
|
||||||
import { findOffset } from '../../services/offset_finder/offset_finder.service.js'
|
import { findOffset } from '../../services/offset_finder/offset_finder.service.js'
|
||||||
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
|
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
|
||||||
import statusPoster from '../../services/status_poster/status_poster.service.js'
|
import statusPoster from '../../services/status_poster/status_poster.service.js'
|
||||||
|
import Gallery from 'src/components/gallery/gallery.vue'
|
||||||
|
|
||||||
import { useEmojiStore } from 'src/stores/emoji.js'
|
import { useEmojiStore } from 'src/stores/emoji.js'
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
|
|
@ -150,9 +151,7 @@ const PostStatusForm = {
|
||||||
Select,
|
Select,
|
||||||
Attachment,
|
Attachment,
|
||||||
StatusContent,
|
StatusContent,
|
||||||
Gallery: defineAsyncComponent(
|
Gallery,
|
||||||
() => import( 'src/components/gallery/gallery.vue')
|
|
||||||
),
|
|
||||||
DraftCloser,
|
DraftCloser,
|
||||||
Popover,
|
Popover,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import Status from '../status/status.vue'
|
|
||||||
|
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import { faCircleNotch } from '@fortawesome/free-solid-svg-icons'
|
import { faCircleNotch } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
@ -9,7 +8,7 @@ library.add(faCircleNotch)
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
Status,
|
|
||||||
},
|
},
|
||||||
name: 'Quote',
|
name: 'Quote',
|
||||||
props: {
|
props: {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import Select from '../select/select.vue'
|
import Select from '../select/select.vue'
|
||||||
import StatusContent from '../status_content/status_content.vue'
|
import StatusContent from '../status_content/status_content.vue'
|
||||||
import Timeago from '../timeago/timeago.vue'
|
import Timeago from '../timeago/timeago.vue'
|
||||||
|
|
@ -14,7 +14,7 @@ const Report = {
|
||||||
Select,
|
Select,
|
||||||
StatusContent,
|
StatusContent,
|
||||||
Timeago,
|
Timeago,
|
||||||
RichContent,
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
report() {
|
report() {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { flattenDeep, unescape as ldUnescape } from 'lodash'
|
||||||
import HashtagLink from 'src/components/hashtag_link/hashtag_link.vue'
|
import HashtagLink from 'src/components/hashtag_link/hashtag_link.vue'
|
||||||
import { MENTIONS_LIMIT } from 'src/components/mentions_line/mentions_line.js'
|
import { MENTIONS_LIMIT } from 'src/components/mentions_line/mentions_line.js'
|
||||||
import MentionsLine from 'src/components/mentions_line/mentions_line.vue'
|
import MentionsLine from 'src/components/mentions_line/mentions_line.vue'
|
||||||
import StillImage from 'src/components/still-image/still-image.vue'
|
|
||||||
import StillImageEmojiPopover from 'src/components/still-image/still-image-emoji-popover.vue'
|
import StillImageEmojiPopover from 'src/components/still-image/still-image-emoji-popover.vue'
|
||||||
|
|
||||||
import { convertHtmlToLines } from 'src/services/html_converter/html_line_converter.service.js'
|
import { convertHtmlToLines } from 'src/services/html_converter/html_line_converter.service.js'
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { map, uniqBy } from 'lodash'
|
||||||
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
|
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
|
||||||
import Conversation from '../conversation/conversation.vue'
|
import Conversation from '../conversation/conversation.vue'
|
||||||
import FollowCard from '../follow_card/follow_card.vue'
|
import FollowCard from '../follow_card/follow_card.vue'
|
||||||
import Status from '../status/status.vue'
|
|
||||||
|
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import { faCircleNotch, faSearch } from '@fortawesome/free-solid-svg-icons'
|
import { faCircleNotch, faSearch } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
@ -14,7 +14,7 @@ const Search = {
|
||||||
components: {
|
components: {
|
||||||
FollowCard,
|
FollowCard,
|
||||||
Conversation,
|
Conversation,
|
||||||
Status,
|
|
||||||
TabSwitcher,
|
TabSwitcher,
|
||||||
},
|
},
|
||||||
props: ['query'],
|
props: ['query'],
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@
|
||||||
<script>
|
<script>
|
||||||
import Popover from 'components/popover/popover.vue'
|
import Popover from 'components/popover/popover.vue'
|
||||||
import SelectComponent from 'components/select/select.vue'
|
import SelectComponent from 'components/select/select.vue'
|
||||||
import StillImage from 'components/still-image/still-image.vue'
|
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
@ -160,7 +160,7 @@ export default {
|
||||||
ConfirmModal: defineAsyncComponent(
|
ConfirmModal: defineAsyncComponent(
|
||||||
() => import('src/components/confirm_modal/confirm_modal.vue'),
|
() => import('src/components/confirm_modal/confirm_modal.vue'),
|
||||||
),
|
),
|
||||||
StillImage,
|
|
||||||
SelectComponent,
|
SelectComponent,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { mapActions, mapState } from 'pinia'
|
import { mapActions, mapState } from 'pinia'
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
|
import UserCard from 'src/components/user_card/user_card.vue'
|
||||||
|
|
||||||
import { USERNAME_ROUTES } from 'src/components/navigation/navigation.js'
|
import { USERNAME_ROUTES } from 'src/components/navigation/navigation.js'
|
||||||
import GestureService from '../../services/gesture_service/gesture_service'
|
import GestureService from '../../services/gesture_service/gesture_service'
|
||||||
|
|
@ -65,9 +66,7 @@ const SideDrawer = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
UserCard: defineAsyncComponent(
|
UserCard,
|
||||||
() => import('src/components/user_card/user_card.vue'),
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
currentUser() {
|
currentUser() {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import AvatarList from 'src/components/avatar_list/avatar_list.vue'
|
||||||
import EmojiReactions from 'src/components/emoji_reactions/emoji_reactions.vue'
|
import EmojiReactions from 'src/components/emoji_reactions/emoji_reactions.vue'
|
||||||
import MentionLink from 'src/components/mention_link/mention_link.vue'
|
import MentionLink from 'src/components/mention_link/mention_link.vue'
|
||||||
import MentionsLine from 'src/components/mentions_line/mentions_line.vue'
|
import MentionsLine from 'src/components/mentions_line/mentions_line.vue'
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import StatusActionButtons from 'src/components/status_action_buttons/status_action_buttons.vue'
|
import StatusActionButtons from 'src/components/status_action_buttons/status_action_buttons.vue'
|
||||||
import StatusContent from 'src/components/status_content/status_content.vue'
|
import StatusContent from 'src/components/status_content/status_content.vue'
|
||||||
import Timeago from 'src/components/timeago/timeago.vue'
|
import Timeago from 'src/components/timeago/timeago.vue'
|
||||||
|
|
@ -14,6 +13,7 @@ import UserLink from 'src/components/user_link/user_link.vue'
|
||||||
import UserListPopover from 'src/components/user_list_popover/user_list_popover.vue'
|
import UserListPopover from 'src/components/user_list_popover/user_list_popover.vue'
|
||||||
import UserPopover from 'src/components/user_popover/user_popover.vue'
|
import UserPopover from 'src/components/user_popover/user_popover.vue'
|
||||||
import PostStatusForm from 'src/components/post_status_form/post_status_form.vue'
|
import PostStatusForm from 'src/components/post_status_form/post_status_form.vue'
|
||||||
|
import StatusPopover from 'src/components/status_popover/status_popover.vue'
|
||||||
import { muteFilterHits } from '../../services/status_parser/status_parser.js'
|
import { muteFilterHits } from '../../services/status_parser/status_parser.js'
|
||||||
import {
|
import {
|
||||||
highlightClass,
|
highlightClass,
|
||||||
|
|
@ -120,13 +120,10 @@ const Status = {
|
||||||
UserAvatar,
|
UserAvatar,
|
||||||
AvatarList,
|
AvatarList,
|
||||||
Timeago,
|
Timeago,
|
||||||
StatusPopover: defineAsyncComponent(
|
StatusPopover,
|
||||||
() => import('src/components/status_popover/status_popover.vue'),
|
|
||||||
),
|
|
||||||
UserListPopover,
|
UserListPopover,
|
||||||
EmojiReactions,
|
EmojiReactions,
|
||||||
StatusContent,
|
StatusContent,
|
||||||
RichContent,
|
|
||||||
MentionLink,
|
MentionLink,
|
||||||
MentionsLine,
|
MentionsLine,
|
||||||
UserPopover,
|
UserPopover,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import Popover from 'src/components/popover/popover.vue'
|
import Popover from 'src/components/popover/popover.vue'
|
||||||
|
import EmojiPicker from '../emoji_picker/emoji_picker.vue'
|
||||||
|
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js'
|
import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js'
|
||||||
|
|
@ -75,9 +76,7 @@ export default {
|
||||||
'src/components/status_bookmark_folder_menu/status_bookmark_folder_menu.vue'
|
'src/components/status_bookmark_folder_menu/status_bookmark_folder_menu.vue'
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
EmojiPicker: defineAsyncComponent(
|
EmojiPicker,
|
||||||
() => import('src/components/emoji_picker/emoji_picker.vue'),
|
|
||||||
),
|
|
||||||
Popover,
|
Popover,
|
||||||
},
|
},
|
||||||
data: () => ({
|
data: () => ({
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { mapState } from 'pinia'
|
import { mapState } from 'pinia'
|
||||||
|
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
|
|
||||||
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
|
|
||||||
|
|
@ -114,7 +114,7 @@ const StatusBody = {
|
||||||
...mapState(useMergedConfigStore, ['mergedConfig']),
|
...mapState(useMergedConfigStore, ['mergedConfig']),
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
RichContent,
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.status.attentions &&
|
this.status.attentions &&
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { mapState } from 'pinia'
|
import { mapState } from 'pinia'
|
||||||
|
|
||||||
import Popover from 'src/components/popover/popover.vue'
|
import Popover from 'src/components/popover/popover.vue'
|
||||||
import StillImage from 'src/components/still-image/still-image.vue'
|
|
||||||
|
|
||||||
import { useBookmarkFoldersStore } from 'src/stores/bookmark_folders.js'
|
import { useBookmarkFoldersStore } from 'src/stores/bookmark_folders.js'
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@ const StatusBookmarkFolderMenu = {
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Popover,
|
Popover,
|
||||||
StillImage,
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(useBookmarkFoldersStore, {
|
...mapState(useBookmarkFoldersStore, {
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import StatusBody from 'src/components/status_body/status_body.vue'
|
||||||
import Attachment from '../attachment/attachment.vue'
|
import Attachment from '../attachment/attachment.vue'
|
||||||
import LinkPreview from '../link-preview/link-preview.vue'
|
import LinkPreview from '../link-preview/link-preview.vue'
|
||||||
import Poll from '../poll/poll.vue'
|
import Poll from '../poll/poll.vue'
|
||||||
|
import Gallery from 'src/components/gallery/gallery.vue'
|
||||||
|
|
||||||
import { useMediaViewerStore } from 'src/stores/media_viewer.js'
|
import { useMediaViewerStore } from 'src/stores/media_viewer.js'
|
||||||
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
|
|
@ -132,9 +133,7 @@ const StatusContent = {
|
||||||
components: {
|
components: {
|
||||||
Attachment,
|
Attachment,
|
||||||
Poll,
|
Poll,
|
||||||
Gallery: defineAsyncComponent(
|
Gallery,
|
||||||
() => import( 'src/components/gallery/gallery.vue')
|
|
||||||
),
|
|
||||||
LinkPreview,
|
LinkPreview,
|
||||||
StatusBody,
|
StatusBody,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
import { get } from 'lodash'
|
import { get } from 'lodash'
|
||||||
|
|
||||||
import Modal from '../modal/modal.vue'
|
import Modal from '../modal/modal.vue'
|
||||||
import Status from '../status/status.vue'
|
|
||||||
|
|
||||||
import { useStatusHistoryStore } from 'src/stores/statusHistory.js'
|
import { useStatusHistoryStore } from 'src/stores/statusHistory.js'
|
||||||
|
|
||||||
const StatusHistoryModal = {
|
const StatusHistoryModal = {
|
||||||
components: {
|
components: {
|
||||||
Modal,
|
Modal,
|
||||||
Status,
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ const StatusPopover = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Status,
|
|
||||||
Popover,
|
Popover,
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,13 @@ import Popover from 'components/popover/popover.vue'
|
||||||
import SelectComponent from 'components/select/select.vue'
|
import SelectComponent from 'components/select/select.vue'
|
||||||
import { mapState } from 'pinia'
|
import { mapState } from 'pinia'
|
||||||
|
|
||||||
import StillImage from './still-image.vue'
|
|
||||||
|
|
||||||
import { useEmojiStore } from 'src/stores/emoji'
|
import { useEmojiStore } from 'src/stores/emoji'
|
||||||
import { useInterfaceStore } from 'src/stores/interface'
|
import { useInterfaceStore } from 'src/stores/interface'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { StillImage, Popover, SelectComponent },
|
components: { Popover, SelectComponent },
|
||||||
props: {
|
props: {
|
||||||
shortcode: {
|
shortcode: {
|
||||||
type: String,
|
type: String,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import Status from '../status/status.vue'
|
|
||||||
|
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
import {
|
||||||
|
|
@ -10,7 +10,7 @@ library.add(faAngleDoubleDown, faAngleDoubleRight)
|
||||||
|
|
||||||
const ThreadTree = {
|
const ThreadTree = {
|
||||||
components: {
|
components: {
|
||||||
Status,
|
|
||||||
},
|
},
|
||||||
name: 'ThreadTree',
|
name: 'ThreadTree',
|
||||||
props: {
|
props: {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import Conversation from '../conversation/conversation.vue'
|
||||||
import QuickFilterSettings from '../quick_filter_settings/quick_filter_settings.vue'
|
import QuickFilterSettings from '../quick_filter_settings/quick_filter_settings.vue'
|
||||||
import QuickViewSettings from '../quick_view_settings/quick_view_settings.vue'
|
import QuickViewSettings from '../quick_view_settings/quick_view_settings.vue'
|
||||||
import ScrollTopButton from '../scroll_top_button/scroll_top_button.vue'
|
import ScrollTopButton from '../scroll_top_button/scroll_top_button.vue'
|
||||||
import Status from '../status/status.vue'
|
|
||||||
import TimelineMenu from '../timeline_menu/timeline_menu.vue'
|
import TimelineMenu from '../timeline_menu/timeline_menu.vue'
|
||||||
|
|
||||||
import { useInterfaceStore } from 'src/stores/interface.js'
|
import { useInterfaceStore } from 'src/stores/interface.js'
|
||||||
|
|
@ -52,7 +52,7 @@ const Timeline = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Status,
|
|
||||||
ScrollTopButton,
|
ScrollTopButton,
|
||||||
Conversation,
|
Conversation,
|
||||||
TimelineMenu,
|
TimelineMenu,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import StillImage from '../still-image/still-image.vue'
|
|
||||||
|
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
import { useInterfaceStore } from 'src/stores/interface.js'
|
import { useInterfaceStore } from 'src/stores/interface.js'
|
||||||
|
|
@ -42,7 +42,7 @@ const UserAvatar = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
StillImage,
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
imgSrc(src) {
|
imgSrc(src) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import AccountActions from 'src/components/account_actions/account_actions.vue'
|
||||||
import Checkbox from 'src/components/checkbox/checkbox.vue'
|
import Checkbox from 'src/components/checkbox/checkbox.vue'
|
||||||
import EmojiInput from 'src/components/emoji_input/emoji_input.vue'
|
import EmojiInput from 'src/components/emoji_input/emoji_input.vue'
|
||||||
import suggestor from 'src/components/emoji_input/suggestor.js'
|
import suggestor from 'src/components/emoji_input/suggestor.js'
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import FollowButton from '../follow_button/follow_button.vue'
|
import FollowButton from '../follow_button/follow_button.vue'
|
||||||
import ProgressButton from '../progress_button/progress_button.vue'
|
import ProgressButton from '../progress_button/progress_button.vue'
|
||||||
import RemoteFollow from '../remote_follow/remote_follow.vue'
|
import RemoteFollow from '../remote_follow/remote_follow.vue'
|
||||||
|
|
@ -134,7 +134,7 @@ export default {
|
||||||
ProgressButton,
|
ProgressButton,
|
||||||
FollowButton,
|
FollowButton,
|
||||||
Select,
|
Select,
|
||||||
RichContent,
|
|
||||||
UserLink,
|
UserLink,
|
||||||
UserNote,
|
UserNote,
|
||||||
UserTimedFilterModal: defineAsyncComponent(
|
UserTimedFilterModal: defineAsyncComponent(
|
||||||
|
|
|
||||||
|
|
@ -669,6 +669,7 @@
|
||||||
</template>
|
</template>
|
||||||
<teleport to="#modal">
|
<teleport to="#modal">
|
||||||
<UserTimedFilterModal
|
<UserTimedFilterModal
|
||||||
|
v-if="isOtherUser"
|
||||||
ref="timedMuteDialog"
|
ref="timedMuteDialog"
|
||||||
:user="user"
|
:user="user"
|
||||||
:is-mute="true"
|
:is-mute="true"
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import Popover from 'src/components/popover/popover.vue'
|
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
|
import UserAvatar from 'src/components/user_avatar/user_avatar.vue'
|
||||||
|
import Popover from 'src/components/popover/popover.vue'
|
||||||
import UnicodeDomainIndicator from '../unicode_domain_indicator/unicode_domain_indicator.vue'
|
import UnicodeDomainIndicator from '../unicode_domain_indicator/unicode_domain_indicator.vue'
|
||||||
|
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
|
|
@ -19,7 +18,6 @@ const UserListPopover = {
|
||||||
name: 'UserListPopover',
|
name: 'UserListPopover',
|
||||||
props: ['users'],
|
props: ['users'],
|
||||||
components: {
|
components: {
|
||||||
RichContent,
|
|
||||||
UnicodeDomainIndicator,
|
UnicodeDomainIndicator,
|
||||||
Popover,
|
Popover,
|
||||||
UserAvatar,
|
UserAvatar,
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import { mapState } from 'pinia'
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
|
||||||
import Popover from 'src/components/popover/popover.vue'
|
import Popover from 'src/components/popover/popover.vue'
|
||||||
|
import UserCard from 'src/components/user_card/user_card.vue'
|
||||||
|
|
||||||
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
|
|
||||||
|
|
@ -9,9 +10,7 @@ const UserPopover = {
|
||||||
name: 'UserPopover',
|
name: 'UserPopover',
|
||||||
props: ['userId', 'overlayCenters', 'disabled', 'overlayCentersSelector'],
|
props: ['userId', 'overlayCenters', 'disabled', 'overlayCentersSelector'],
|
||||||
components: {
|
components: {
|
||||||
UserCard: defineAsyncComponent(
|
UserCard,
|
||||||
() => import('src/components/user_card/user_card.vue'),
|
|
||||||
),
|
|
||||||
Popover,
|
Popover,
|
||||||
},
|
},
|
||||||
computed: mapState(useMergedConfigStore, {
|
computed: mapState(useMergedConfigStore, {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { get } from 'lodash'
|
import { get } from 'lodash'
|
||||||
import { mapState } from 'pinia'
|
import { mapState } from 'pinia'
|
||||||
|
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
|
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
|
||||||
import withLoadMore from '../../hocs/with_load_more/with_load_more'
|
import withLoadMore from '../../hocs/with_load_more/with_load_more'
|
||||||
import Conversation from '../conversation/conversation.vue'
|
import Conversation from '../conversation/conversation.vue'
|
||||||
|
|
@ -209,7 +209,7 @@ const UserProfile = {
|
||||||
FollowCard,
|
FollowCard,
|
||||||
TabSwitcher,
|
TabSwitcher,
|
||||||
Conversation,
|
Conversation,
|
||||||
RichContent,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
import Checkbox from '../checkbox/checkbox.vue'
|
import Checkbox from '../checkbox/checkbox.vue'
|
||||||
import List from '../list/list.vue'
|
import List from '../list/list.vue'
|
||||||
import Modal from '../modal/modal.vue'
|
import Modal from '../modal/modal.vue'
|
||||||
import Status from '../status/status.vue'
|
|
||||||
import UserLink from '../user_link/user_link.vue'
|
import UserLink from '../user_link/user_link.vue'
|
||||||
|
|
||||||
import { useReportsStore } from 'src/stores/reports.js'
|
import { useReportsStore } from 'src/stores/reports.js'
|
||||||
|
|
||||||
const UserReportingModal = {
|
const UserReportingModal = {
|
||||||
components: {
|
components: {
|
||||||
Status,
|
|
||||||
List,
|
List,
|
||||||
Checkbox,
|
Checkbox,
|
||||||
Modal,
|
Modal,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { mount, shallowMount } from '@vue/test-utils'
|
import { mount, shallowMount } from '@vue/test-utils'
|
||||||
|
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
|
||||||
|
|
||||||
const attentions = []
|
const attentions = []
|
||||||
const global = {
|
const global = {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue