mirror of
https://github.com/nextcloud/spreed.git
synced 2025-12-18 05:20:50 +01:00
fix: lint padding/newline rules
Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
This commit is contained in:
parent
0cefd79e15
commit
5aa4668f98
121 changed files with 325 additions and 106 deletions
|
|
@ -19,7 +19,6 @@ export default [
|
|||
'@stylistic/array-bracket-spacing': 'off', // changes array formatting
|
||||
'@stylistic/array-element-newline': 'off', // changes 132 files
|
||||
'@stylistic/arrow-parens': 'off', // changes 132 files
|
||||
'@stylistic/block-spacing': 'off',
|
||||
'@stylistic/comma-dangle': 'off', // changes 125 files
|
||||
'@stylistic/function-call-argument-newline': 'off', // changes 125 files
|
||||
'@stylistic/function-paren-newline': 'off', // weird formatting
|
||||
|
|
@ -29,8 +28,6 @@ export default [
|
|||
'@stylistic/linebreak-style': 'off', // changes 25 files -> indent
|
||||
'@stylistic/max-statements-per-line': 'off', // non-fixable
|
||||
'@stylistic/member-delimiter-style': 'off', // removes commas from types
|
||||
'@stylistic/no-multiple-empty-lines': 'off',
|
||||
'@stylistic/padded-blocks': 'off',
|
||||
'@stylistic/quote-props': 'off', // removes quotes from types
|
||||
'@stylistic/semi': 'off', // changes e2ee files
|
||||
'@typescript-eslint/no-unused-expressions': 'off', // non-fixable
|
||||
|
|
@ -66,7 +63,6 @@ export default [
|
|||
'vue/comma-dangle': 'off', // changes commas
|
||||
'vue/first-attribute-linebreak': 'off', // changes all Vue files
|
||||
'vue/multi-word-component-names': 'off', // non-fixable
|
||||
'vue/new-line-between-multi-line-property': 'off',
|
||||
'vue/no-boolean-default': 'off', // non-fixable
|
||||
'vue/no-required-prop-with-default': 'off', // non-fixable
|
||||
'vue/no-unused-properties': 'off', // non-fixable
|
||||
|
|
@ -74,7 +70,6 @@ export default [
|
|||
'vue/no-useless-mustaches': 'off', // changes template
|
||||
'vue/object-curly-newline': 'off', // changes newlines
|
||||
'vue/order-in-components': 'off', // moves code
|
||||
'vue/padding-line-between-blocks': 'off',
|
||||
'vue/quote-props': 'off', // changes template
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -124,6 +124,7 @@ export default {
|
|||
mentionsDirect: 0,
|
||||
})
|
||||
},
|
||||
|
||||
getUserId() {
|
||||
return this.$store.getters.getUserId()
|
||||
},
|
||||
|
|
@ -621,6 +622,7 @@ export default {
|
|||
this.isRefreshingCurrentConversation = false
|
||||
}
|
||||
},
|
||||
|
||||
// Upon pressing Ctrl+F, focus SearchBox native input in the LeftSidebar
|
||||
handleAppSearch() {
|
||||
emit('toggle-navigation', {
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ export default {
|
|||
render: (h) => h(LoadingComponent, { class: 'call-loading' }),
|
||||
},
|
||||
}),
|
||||
|
||||
TopBar: () => import(/* webpackChunkName: "files-sidebar-call-chunk" */'./components/TopBar/TopBar.vue'),
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ export default {
|
|||
render: (h) => h(LoadingComponent, { class: 'tab-loading' }),
|
||||
},
|
||||
}),
|
||||
|
||||
NcButton,
|
||||
},
|
||||
|
||||
|
|
@ -84,15 +85,19 @@ export default {
|
|||
fileInfo() {
|
||||
return this.Talk.fileInfo || {}
|
||||
},
|
||||
|
||||
fileId() {
|
||||
return this.fileInfo.id
|
||||
},
|
||||
|
||||
token() {
|
||||
return this.$store.getters.getToken()
|
||||
},
|
||||
|
||||
fileIdForToken() {
|
||||
return this.$store.getters.getFileIdForToken()
|
||||
},
|
||||
|
||||
isChatTheActiveTab() {
|
||||
// FIXME check for empty active tab is currently needed because the
|
||||
// activeTab is not set when opening the sidebar from the "Details"
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ export default {
|
|||
this.joinConversation()
|
||||
}
|
||||
},
|
||||
|
||||
conversation(conversation) {
|
||||
if (!conversation) {
|
||||
this.isWaitingToClose = true
|
||||
|
|
|
|||
|
|
@ -116,9 +116,11 @@ export default {
|
|||
isConversationsFilesChecked() {
|
||||
return this.conversationsFiles
|
||||
},
|
||||
|
||||
isConversationsFilesPublicSharesChecked() {
|
||||
return this.conversationsFilesPublicShares
|
||||
},
|
||||
|
||||
canEnableE2EECalls() {
|
||||
return this.hasFeatureJoinFeatures || !this.hasSIPBridge
|
||||
},
|
||||
|
|
@ -167,6 +169,7 @@ export default {
|
|||
},
|
||||
})
|
||||
},
|
||||
|
||||
saveConversationsFiles(checked) {
|
||||
this.loadingConversationsFiles = true
|
||||
this.conversationsFiles = checked
|
||||
|
|
@ -187,6 +190,7 @@ export default {
|
|||
},
|
||||
})
|
||||
},
|
||||
|
||||
saveConversationsFilesPublicShares(checked) {
|
||||
this.loadingConversationsFiles = true
|
||||
this.conversationsFilesPublicShares = checked
|
||||
|
|
@ -200,6 +204,7 @@ export default {
|
|||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
h3 {
|
||||
|
|
|
|||
|
|
@ -171,11 +171,13 @@ export default {
|
|||
&& this.hostedHPBLanguage !== ''
|
||||
&& this.hostedHPBCountry !== ''
|
||||
},
|
||||
|
||||
disclaimerHint() {
|
||||
return t('spreed', 'By clicking the button above the information in the form is sent to the servers of Struktur AG. You can find further information at {linkstart}spreed.eu{linkend}.')
|
||||
.replace('{linkstart}', '<a target="_blank" rel="noreferrer nofollow" class="external" href="https://www.spreed.eu/nextcloud-talk-high-performance-backend/">')
|
||||
.replace('{linkend}', ' ↗</a>')
|
||||
},
|
||||
|
||||
translatedStatus() {
|
||||
switch (this.trialAccount.status) {
|
||||
case 'pending':
|
||||
|
|
@ -192,9 +194,11 @@ export default {
|
|||
|
||||
return ''
|
||||
},
|
||||
|
||||
expiryDate() {
|
||||
return moment(this.trialAccount.expires).format('L')
|
||||
},
|
||||
|
||||
createdDate() {
|
||||
return moment(this.trialAccount.created).format('L')
|
||||
},
|
||||
|
|
|
|||
|
|
@ -78,17 +78,20 @@ export default {
|
|||
isEnabled() {
|
||||
return this.matterbridgeEnabled
|
||||
},
|
||||
|
||||
installedVersion() {
|
||||
return t('spreed', 'Installed version: {version}', {
|
||||
version: this.matterbridgeVersion,
|
||||
})
|
||||
},
|
||||
|
||||
description() {
|
||||
return t('spreed', 'You can install the Matterbridge to link Nextcloud Talk to some other services, visit their {linkstart1}GitHub page{linkend} for more details. Downloading and installing the app can take a while. In case it times out, please install it manually from the {linkstart2}Nextcloud App Store{linkend}.')
|
||||
.replace('{linkstart1}', '<a target="_blank" rel="noreferrer nofollow" class="external" href="https://github.com/42wim/matterbridge/wiki">')
|
||||
.replace('{linkstart2}', '<a target="_blank" rel="noreferrer nofollow" class="external" href="https://apps.nextcloud.com/apps/talk_matterbridge">')
|
||||
.replace(/{linkend}/g, ' ↗</a>')
|
||||
},
|
||||
|
||||
errorText() {
|
||||
if (this.error === 'binary_permissions') {
|
||||
return t('spreed', 'Matterbridge binary has incorrect permissions. Please make sure the Matterbridge binary file is owned by the correct user and can be executed. It can be found in "/…/nextcloud/apps/talk_matterbridge/bin/".')
|
||||
|
|
@ -98,11 +101,13 @@ export default {
|
|||
return ''
|
||||
}
|
||||
},
|
||||
|
||||
customBinaryText() {
|
||||
return t('spreed', 'You can also set the path to the Matterbridge binary manually via the config. Check the {linkstart}Matterbridge integration documentation{linkend} for more information.')
|
||||
.replace('{linkstart}', '<a target="_blank" rel="noreferrer nofollow" class="external" href="https://nextcloud-talk.readthedocs.io/en/latest/matterbridge/">')
|
||||
.replace(/{linkend}/g, ' ↗</a>')
|
||||
},
|
||||
|
||||
installButtonText() {
|
||||
return this.isInstalling
|
||||
? t('spreed', 'Downloading …')
|
||||
|
|
|
|||
|
|
@ -84,16 +84,19 @@ export default {
|
|||
default: '',
|
||||
required: true,
|
||||
},
|
||||
|
||||
verify: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
required: true,
|
||||
},
|
||||
|
||||
index: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: true,
|
||||
},
|
||||
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
@ -127,6 +130,7 @@ export default {
|
|||
get() {
|
||||
return this.server
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.$emit('update:server', value)
|
||||
}
|
||||
|
|
@ -152,6 +156,7 @@ export default {
|
|||
removeServer() {
|
||||
this.$emit('remove-server', this.index)
|
||||
},
|
||||
|
||||
updateVerify(checked) {
|
||||
this.$emit('update:verify', checked)
|
||||
},
|
||||
|
|
|
|||
|
|
@ -170,6 +170,7 @@ export default {
|
|||
showUploadLimitWarning() {
|
||||
return this.uploadLimit !== 0 && this.uploadLimit < 512 * (1024 ** 2)
|
||||
},
|
||||
|
||||
uploadLimitWarning() {
|
||||
return t('spreed', 'The PHP settings "upload_max_filesize" or "post_max_size" only will allow to upload files up to {maxUpload}.', {
|
||||
maxUpload: formatFileSize(this.uploadLimit, true, true),
|
||||
|
|
|
|||
|
|
@ -102,16 +102,19 @@ export default {
|
|||
default: '',
|
||||
required: true,
|
||||
},
|
||||
|
||||
verify: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
required: true,
|
||||
},
|
||||
|
||||
index: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: true,
|
||||
},
|
||||
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
@ -150,6 +153,7 @@ export default {
|
|||
get() {
|
||||
return this.server
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.$emit('update:server', value)
|
||||
}
|
||||
|
|
@ -175,6 +179,7 @@ export default {
|
|||
removeServer() {
|
||||
this.$emit('remove-server', this.index)
|
||||
},
|
||||
|
||||
updateVerify(checked) {
|
||||
this.$emit('update:verify', checked)
|
||||
},
|
||||
|
|
|
|||
|
|
@ -61,11 +61,13 @@ export default {
|
|||
default: '',
|
||||
required: true,
|
||||
},
|
||||
|
||||
index: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: true,
|
||||
},
|
||||
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
@ -79,6 +81,7 @@ export default {
|
|||
get() {
|
||||
return this.server
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.$emit('update:server', value)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -107,7 +107,6 @@ export default {
|
|||
const servers = []
|
||||
|
||||
this.servers.forEach((server) => {
|
||||
|
||||
if (server.startsWith('https://')) {
|
||||
server = server.slice(8)
|
||||
} else if (server.startsWith('http://')) {
|
||||
|
|
|
|||
|
|
@ -112,26 +112,31 @@ export default {
|
|||
default: '',
|
||||
required: true,
|
||||
},
|
||||
|
||||
server: {
|
||||
type: String,
|
||||
default: '',
|
||||
required: true,
|
||||
},
|
||||
|
||||
secret: {
|
||||
type: String,
|
||||
default: '',
|
||||
required: true,
|
||||
},
|
||||
|
||||
protocols: {
|
||||
type: String,
|
||||
default: '',
|
||||
required: true,
|
||||
},
|
||||
|
||||
index: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: true,
|
||||
},
|
||||
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
@ -154,34 +159,42 @@ export default {
|
|||
get() {
|
||||
return this.server
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.updateServer(value)
|
||||
}
|
||||
},
|
||||
|
||||
turnSchemes: {
|
||||
get() {
|
||||
return this.schemesOptions.find(i => i.value === this.schemes)
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.updateSchemes(value)
|
||||
}
|
||||
},
|
||||
|
||||
turnProtocols: {
|
||||
get() {
|
||||
return this.protocolOptions.find(i => i.value === this.protocols)
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.updateProtocols(value)
|
||||
}
|
||||
},
|
||||
|
||||
turnSecret: {
|
||||
get() {
|
||||
return this.secret
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.updateSecret(value)
|
||||
},
|
||||
},
|
||||
|
||||
turnServerError() {
|
||||
if (this.schemes.includes('turns') && /^(?:\d{1,3}\.){3}\d{1,3}(?::\d{1,5})?$/.test(this.server.trim())) {
|
||||
return t('spreed', '{schema} scheme must be used with a domain', { schema: 'turns:' })
|
||||
|
|
@ -189,6 +202,7 @@ export default {
|
|||
|
||||
return false
|
||||
},
|
||||
|
||||
protocolOptions() {
|
||||
return [
|
||||
{ value: 'udp,tcp', label: t('spreed', '{option1} and {option2}', { option1: 'UDP', option2: 'TCP' }) },
|
||||
|
|
@ -196,6 +210,7 @@ export default {
|
|||
{ value: 'tcp', label: t('spreed', '{option} only', { option: 'TCP' }) },
|
||||
]
|
||||
},
|
||||
|
||||
schemesOptions() {
|
||||
return [
|
||||
{ value: 'turn,turns', label: t('spreed', '{option1} and {option2}', { option1: 'turn:', option2: 'turns:' }) },
|
||||
|
|
@ -203,6 +218,7 @@ export default {
|
|||
{ value: 'turns', label: t('spreed', '{option} only', { option: 'turns:' }) },
|
||||
]
|
||||
},
|
||||
|
||||
testIconClasses() {
|
||||
return {
|
||||
'icon-category-monitoring': !this.testing && !this.testingError && !this.testingSuccess,
|
||||
|
|
@ -211,6 +227,7 @@ export default {
|
|||
'icon-checkmark': this.testingSuccess,
|
||||
}
|
||||
},
|
||||
|
||||
testResult() {
|
||||
if (this.testingSuccess) {
|
||||
return t('spreed', 'OK: Successful ICE candidates returned by the TURN server')
|
||||
|
|
@ -221,6 +238,7 @@ export default {
|
|||
}
|
||||
return t('spreed', 'Test this server')
|
||||
},
|
||||
|
||||
testAvailable() {
|
||||
const schemes = this.schemes.split(',')
|
||||
const protocols = this.protocols.split(',')
|
||||
|
|
@ -275,6 +293,7 @@ export default {
|
|||
iceServers: [
|
||||
iceServer,
|
||||
],
|
||||
|
||||
iceTransportPolicy: 'relay',
|
||||
}
|
||||
const offerOptions = {
|
||||
|
|
@ -386,18 +405,22 @@ export default {
|
|||
removeServer() {
|
||||
this.$emit('remove-server', this.index)
|
||||
},
|
||||
|
||||
updateSchemes(event) {
|
||||
this.$emit('update:schemes', event.value)
|
||||
this.debounceTestServer()
|
||||
},
|
||||
|
||||
updateServer(value) {
|
||||
this.$emit('update:server', value)
|
||||
this.debounceTestServer()
|
||||
},
|
||||
|
||||
updateSecret(value) {
|
||||
this.$emit('update:secret', value)
|
||||
this.debounceTestServer()
|
||||
},
|
||||
|
||||
updateProtocols(event) {
|
||||
this.$emit('update:protocols', event.value)
|
||||
this.debounceTestServer()
|
||||
|
|
|
|||
|
|
@ -144,7 +144,6 @@ export default {
|
|||
},
|
||||
|
||||
toggleSave() {
|
||||
|
||||
this.saved = true
|
||||
setTimeout(() => {
|
||||
this.saved = false
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ export default {
|
|||
virtualBackground: {
|
||||
type: VIRTUAL_BACKGROUND.BACKGROUND_TYPE.BLUR,
|
||||
},
|
||||
|
||||
simd: VirtualBackground.isWasmSimd(),
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -74,58 +74,72 @@ export default {
|
|||
type: String,
|
||||
default: null,
|
||||
},
|
||||
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
id: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
|
||||
source: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
|
||||
size: {
|
||||
type: Number,
|
||||
default: AVATAR.SIZE.DEFAULT,
|
||||
},
|
||||
|
||||
condensed: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
condensedOverlap: {
|
||||
type: Number,
|
||||
default: 2,
|
||||
},
|
||||
|
||||
offline: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
highlighted: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
disableTooltip: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
disableMenu: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
showUserStatus: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
showUserStatusCompact: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
preloadedUserStatus: {
|
||||
type: Object,
|
||||
default: undefined,
|
||||
},
|
||||
|
||||
menuContainer: {
|
||||
type: String,
|
||||
default: undefined,
|
||||
|
|
@ -177,6 +191,7 @@ export default {
|
|||
return 'icon-contacts'
|
||||
}
|
||||
},
|
||||
|
||||
avatarClass() {
|
||||
return {
|
||||
'avatar-wrapper--dark': this.isDarkTheme,
|
||||
|
|
@ -185,27 +200,34 @@ export default {
|
|||
'avatar-wrapper--highlighted': this.highlighted,
|
||||
}
|
||||
},
|
||||
|
||||
avatarStyle() {
|
||||
return {
|
||||
'--avatar-size': this.size + 'px',
|
||||
'--condensed-overlap': this.condensedOverlap,
|
||||
}
|
||||
},
|
||||
|
||||
isFederatedUser() {
|
||||
return this.source === ATTENDEE.ACTOR_TYPE.FEDERATED_USERS
|
||||
},
|
||||
|
||||
isBot() {
|
||||
return this.source === ATTENDEE.ACTOR_TYPE.BOTS && this.id !== ATTENDEE.CHANGELOG_BOT_ID && this.id !== ATTENDEE.SAMPLE_BOT_ID
|
||||
},
|
||||
|
||||
isGuestUser() {
|
||||
return [ATTENDEE.ACTOR_TYPE.GUESTS, ATTENDEE.ACTOR_TYPE.EMAILS].includes(this.source)
|
||||
},
|
||||
|
||||
hasCustomName() {
|
||||
return this.name?.trim() && this.name !== t('spreed', 'Guest')
|
||||
},
|
||||
|
||||
firstLetterOfGuestName() {
|
||||
return this.name?.trim()?.toUpperCase()?.charAt(0) ?? '?'
|
||||
},
|
||||
|
||||
avatarUrl() {
|
||||
return getUserProxyAvatarOcsUrl(this.token, this.id, this.isDarkTheme, this.size > AVATAR.SIZE.MEDIUM ? 512 : 64)
|
||||
},
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ export default {
|
|||
get() {
|
||||
return this.checked
|
||||
},
|
||||
|
||||
set(value) {
|
||||
if (this.isLocked) {
|
||||
return
|
||||
|
|
|
|||
|
|
@ -186,11 +186,13 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
// Determines whether this component is used in the sidebar
|
||||
isSidebar: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// Determines whether this component is used in the recording view
|
||||
isRecording: {
|
||||
type: Boolean,
|
||||
|
|
@ -238,6 +240,7 @@ export default {
|
|||
localSharedData: {
|
||||
screenVisible: true,
|
||||
},
|
||||
|
||||
showPresenterOverlay: true,
|
||||
debounceFetchPeers: () => {},
|
||||
forcePromotedModel: null,
|
||||
|
|
@ -370,7 +373,6 @@ export default {
|
|||
return (this.showLocalScreen && this.hasLocalVideo)
|
||||
|| ((this.showRemoteScreen || this.showSelectedScreen)
|
||||
&& (this.shownRemoteScreenCallParticipantModel?.attributes.videoAvailable || this.isModelWithVideo(this.shownRemoteScreenCallParticipantModel)))
|
||||
|
||||
},
|
||||
|
||||
presenterModel() {
|
||||
|
|
@ -444,7 +446,6 @@ export default {
|
|||
|
||||
screens() {
|
||||
this._setScreenVisible()
|
||||
|
||||
},
|
||||
|
||||
callParticipantModelsWithScreen(newValue, previousValue) {
|
||||
|
|
@ -456,6 +457,7 @@ export default {
|
|||
this.callViewStore.stopPresentation(this.token)
|
||||
}
|
||||
},
|
||||
|
||||
showLocalScreen(showLocalScreen) {
|
||||
// Everytime the local screen is shared, switch to promoted view
|
||||
if (showLocalScreen) {
|
||||
|
|
@ -465,6 +467,7 @@ export default {
|
|||
this.callViewStore.stopPresentation(this.token)
|
||||
}
|
||||
},
|
||||
|
||||
hasLocalVideo(newValue) {
|
||||
if (this.selectedVideoPeerId === 'local') {
|
||||
if (!newValue) {
|
||||
|
|
@ -732,6 +735,7 @@ export default {
|
|||
clearLast: false,
|
||||
})
|
||||
},
|
||||
|
||||
handleClickLocalVideo() {
|
||||
// DO nothing if no video
|
||||
if (!this.hasLocalVideo || this.isSidebar) {
|
||||
|
|
|
|||
|
|
@ -203,6 +203,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
/**
|
||||
* To be set to true when the grid is in the promoted view.
|
||||
*/
|
||||
|
|
@ -210,38 +211,47 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isSidebar: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isRecording: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
callParticipantModels: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
|
||||
localMediaModel: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
localCallParticipantModel: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
token: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
sharedDatas: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isLocalVideoSelectable: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
screens: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
|
|
@ -319,9 +329,11 @@ export default {
|
|||
|
||||
return this.videos.length
|
||||
},
|
||||
|
||||
videoWidth() {
|
||||
return (this.gridWidth - GRID_GAP * (this.columns - 1)) / this.columns
|
||||
},
|
||||
|
||||
videoHeight() {
|
||||
return (this.gridHeight - GRID_GAP * (this.rows - 1)) / this.rows
|
||||
},
|
||||
|
|
@ -377,6 +389,7 @@ export default {
|
|||
minWidth() {
|
||||
return (this.isStripe || this.isSidebar) ? 200 : 320
|
||||
},
|
||||
|
||||
/**
|
||||
* Minimum height of the video components
|
||||
*/
|
||||
|
|
@ -557,6 +570,7 @@ export default {
|
|||
get() {
|
||||
return this.isStripe
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.callViewStore.setCallViewMode({ token: this.token, isGrid: !value, clearLast: false })
|
||||
},
|
||||
|
|
@ -827,6 +841,7 @@ export default {
|
|||
this.currentPage++
|
||||
console.debug('handleclicknext, ', 'currentPage ', this.currentPage, 'slots ', this.slot, 'videos.length ', this.videos.length)
|
||||
},
|
||||
|
||||
handleClickPrevious() {
|
||||
this.currentPage--
|
||||
console.debug('handleclickprevious, ', 'currentPage ', this.currentPage, 'slots ', this.slots, 'videos.length ', this.videos.length)
|
||||
|
|
@ -840,6 +855,7 @@ export default {
|
|||
// TODO: debounce this
|
||||
this.setTimerForUiControls()
|
||||
},
|
||||
|
||||
setTimerForUiControls() {
|
||||
if (this.showVideoOverlayTimer !== null) {
|
||||
clearTimeout(this.showVideoOverlayTimer)
|
||||
|
|
|
|||
|
|
@ -96,46 +96,57 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
localMediaModel: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
localCallParticipantModel: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isGrid: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isStripe: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
fitVideo: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isSidebar: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
showControls: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
|
||||
unSelectable: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isBig: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isSmall: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isPresenterOverlay: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
|
|||
|
|
@ -52,18 +52,22 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
localMediaModel: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
|
||||
callParticipantModel: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
|
||||
sharedData: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isBig: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ export default {
|
|||
type: String,
|
||||
default: null,
|
||||
},
|
||||
|
||||
user: {
|
||||
type: String,
|
||||
default: '',
|
||||
|
|
|
|||
|
|
@ -130,44 +130,54 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isSidebar: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
hasShadow: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isBig: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
participantName: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
|
||||
showVideoOverlay: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
|
||||
model: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
sharedData: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
// True if the bottom bar is used in the screen component
|
||||
isScreen: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// The current promoted participant
|
||||
isPromoted: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// Is the current selected participant
|
||||
isSelected: {
|
||||
type: Boolean,
|
||||
|
|
@ -198,6 +208,7 @@ export default {
|
|||
showRaiseHandIndicator() {
|
||||
return !this.connectionStateFailedNoRestart && this.model.attributes.raisedHand.state
|
||||
},
|
||||
|
||||
showStopFollowingButton() {
|
||||
return this.isBig && this.callViewStore.selectedVideoPeerId !== null
|
||||
},
|
||||
|
|
@ -206,12 +217,15 @@ export default {
|
|||
showAudioIndicator() {
|
||||
return !this.connectionStateFailedNoRestart && !this.isAudioButtonHidden
|
||||
},
|
||||
|
||||
isAudioButtonHidden() {
|
||||
return this.model.attributes.audioAvailable && !this.canFullModerate
|
||||
},
|
||||
|
||||
isAudioButtonDisabled() {
|
||||
return !this.model.attributes.audioAvailable || !this.canFullModerate
|
||||
},
|
||||
|
||||
audioButtonTitle() {
|
||||
return this.model.attributes.audioAvailable
|
||||
? t('spreed', 'Mute')
|
||||
|
|
@ -222,12 +236,15 @@ export default {
|
|||
showVideoIndicator() {
|
||||
return !this.connectionStateFailedNoRestart && this.model.attributes.videoAvailable
|
||||
},
|
||||
|
||||
isRemoteVideoEnabled() {
|
||||
return this.sharedData.remoteVideoBlocker?.isVideoEnabled()
|
||||
},
|
||||
|
||||
isRemoteVideoBlocked() {
|
||||
return this.sharedData.remoteVideoBlocker && !this.sharedData.remoteVideoBlocker.isVideoEnabled()
|
||||
},
|
||||
|
||||
videoButtonTitle() {
|
||||
return this.isRemoteVideoEnabled
|
||||
? t('spreed', 'Disable video')
|
||||
|
|
@ -243,6 +260,7 @@ export default {
|
|||
isCurrentlyActive() {
|
||||
return this.isSelected || this.model.attributes.speaking
|
||||
},
|
||||
|
||||
showParticipantName() {
|
||||
return !this.model.attributes.videoAvailable || this.isRemoteVideoBlocked
|
||||
|| this.showVideoOverlay || this.isPromoted || this.isCurrentlyActive
|
||||
|
|
@ -255,6 +273,7 @@ export default {
|
|||
? PARTICIPANT.TYPE.USER
|
||||
: PARTICIPANT.TYPE.GUEST)
|
||||
},
|
||||
|
||||
canFullModerate() {
|
||||
return this.participantType === PARTICIPANT.TYPE.OWNER || this.participantType === PARTICIPANT.TYPE.MODERATOR
|
||||
},
|
||||
|
|
|
|||
|
|
@ -129,53 +129,65 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
placeholderForPromoted: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
model: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
sharedData: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
showVideoOverlay: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
|
||||
isGrid: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
fitVideo: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isPresenterOverlay: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isBig: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// True if this video component is used in the promoted view's video stripe
|
||||
isStripe: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// The current promoted participant
|
||||
isPromoted: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// Is the current selected participant
|
||||
isSelected: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// True when this component is used as main video in the sidebar
|
||||
isSidebar: {
|
||||
type: Boolean,
|
||||
|
|
@ -500,7 +512,6 @@ export default {
|
|||
} else {
|
||||
return this.hasVideo
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -516,7 +527,6 @@ export default {
|
|||
} else {
|
||||
return false
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
showBackgroundAndAvatar() {
|
||||
|
|
@ -578,7 +588,6 @@ export default {
|
|||
methods: {
|
||||
t,
|
||||
_setStream(stream) {
|
||||
|
||||
if (!stream) {
|
||||
// Do not clear the srcObject of the video element, just leave
|
||||
// the previous stream as a frozen image.
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ export default {
|
|||
return t('spreed', 'Drop your files to upload')
|
||||
}
|
||||
},
|
||||
|
||||
isReadOnly() {
|
||||
if (this.conversation) {
|
||||
return this.conversation.readOnly === CONVERSATION.STATE.READ_ONLY
|
||||
|
|
|
|||
|
|
@ -154,6 +154,7 @@ export default {
|
|||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* Shows or hides the editing buttons.
|
||||
*/
|
||||
|
|
@ -161,6 +162,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
/**
|
||||
* Force component to emit signals and be used from parent components
|
||||
*/
|
||||
|
|
@ -196,6 +198,7 @@ export default {
|
|||
minContainerWidth: 300,
|
||||
minContainerHeight: 300,
|
||||
},
|
||||
|
||||
backgroundColor: '',
|
||||
emojiAvatar: '',
|
||||
}
|
||||
|
|
@ -233,6 +236,7 @@ export default {
|
|||
this.$emit('avatar-edited', value)
|
||||
}
|
||||
},
|
||||
|
||||
emojiAvatar(value) {
|
||||
if (this.controlled) {
|
||||
this.$emit('avatar-edited', !!value)
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ export default {
|
|||
return option.id === this.conversation.messageExpiration
|
||||
}) ?? this.expirationOptions.at(-1)
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.changeExpiration(value)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -167,6 +167,7 @@ export default {
|
|||
// millisecond based.
|
||||
return this.conversation.lobbyTimer * 1000
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.saveLobbyTimer(value)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,22 +100,27 @@ export default {
|
|||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
|
||||
part: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
type: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
container: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
editing: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
editable: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
|
|
|
|||
|
|
@ -180,6 +180,7 @@ export default {
|
|||
clearInterval(this.stateLoop)
|
||||
this.stateLoop = setInterval(() => this.getBridgeProcessState(token), 60000)
|
||||
},
|
||||
|
||||
clickAddPart(event) {
|
||||
const typeKey = event.type
|
||||
const type = this.matterbridgeTypes[typeKey]
|
||||
|
|
@ -192,26 +193,31 @@ export default {
|
|||
}
|
||||
this.parts.unshift(newPart)
|
||||
},
|
||||
|
||||
onDelete(i) {
|
||||
this.parts.splice(i, 1)
|
||||
this.save()
|
||||
},
|
||||
|
||||
onEditClicked(i) {
|
||||
this.parts[i].editing = !this.parts[i].editing
|
||||
if (!this.parts[i].editing) {
|
||||
this.save()
|
||||
}
|
||||
},
|
||||
|
||||
onEnabled(checked) {
|
||||
this.enabled = checked
|
||||
this.save()
|
||||
},
|
||||
|
||||
save() {
|
||||
if (this.parts.length === 0) {
|
||||
this.enabled = false
|
||||
}
|
||||
this.editBridge(this.token, this.enabled, this.parts)
|
||||
},
|
||||
|
||||
async getBridge(token) {
|
||||
this.loading = true
|
||||
try {
|
||||
|
|
@ -226,6 +232,7 @@ export default {
|
|||
}
|
||||
this.loading = false
|
||||
},
|
||||
|
||||
async editBridge() {
|
||||
this.loading = true
|
||||
this.parts.forEach(part => {
|
||||
|
|
@ -241,6 +248,7 @@ export default {
|
|||
}
|
||||
this.loading = false
|
||||
},
|
||||
|
||||
async getBridgeProcessState(token) {
|
||||
try {
|
||||
const result = await getBridgeProcessState(token)
|
||||
|
|
@ -250,6 +258,7 @@ export default {
|
|||
console.error(exception)
|
||||
}
|
||||
},
|
||||
|
||||
showLogContent() {
|
||||
this.getBridgeProcessState(this.token)
|
||||
this.logModal = true
|
||||
|
|
|
|||
|
|
@ -92,7 +92,6 @@ const eventDateLabel = computed(() => {
|
|||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
}).formatRange(startDate, endDate)
|
||||
|
||||
}
|
||||
|
||||
return time
|
||||
|
|
@ -129,6 +128,7 @@ function handleJoin({ call = false } = {}) {
|
|||
}
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="event-card"
|
||||
:class="{
|
||||
|
|
@ -204,6 +204,7 @@ function handleJoin({ call = false } = {}) {
|
|||
</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.event-card {
|
||||
position: relative;
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
description: {
|
||||
type: String,
|
||||
required: true,
|
||||
|
|
|
|||
|
|
@ -337,6 +337,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
item: {
|
||||
type: Object,
|
||||
default() {
|
||||
|
|
|
|||
|
|
@ -437,7 +437,6 @@ describe('LeftSidebar.vue', () => {
|
|||
itemsListNames.forEach((name, index) => {
|
||||
expect(itemsList.at(index).text()).toStrictEqual(name)
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
test('does not show circles results when circles are disabled', async () => {
|
||||
|
|
@ -599,7 +598,6 @@ describe('LeftSidebar.vue', () => {
|
|||
const wrapper = mountComponent()
|
||||
const newConversationbutton = findNcActionButton(wrapper, 'Create a new conversation')
|
||||
expect(newConversationbutton.exists()).toBeTruthy()
|
||||
|
||||
})
|
||||
test('does not show new conversation button if user cannot start conversations', () => {
|
||||
loadStateSettings.start_conversations = false
|
||||
|
|
|
|||
|
|
@ -517,6 +517,7 @@ export default {
|
|||
this.isNavigating = true
|
||||
}
|
||||
},
|
||||
|
||||
isCompact(value) {
|
||||
if (!value) {
|
||||
// Last messages are likely missing from the store, need to fetch with modifiedSince=0
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
<template>
|
||||
<div class="icon-loading spinner" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
|
||||
|
|
|
|||
|
|
@ -210,7 +210,6 @@ export default {
|
|||
},
|
||||
|
||||
async handleFileInput(event) {
|
||||
|
||||
// Make file path
|
||||
const file = event.target.files[0]
|
||||
|
||||
|
|
@ -240,7 +239,6 @@ export default {
|
|||
})
|
||||
|
||||
this.handleSelectBackground(previewURL)
|
||||
|
||||
} catch (error) {
|
||||
console.debug(error)
|
||||
showError(t('spreed', 'Error while uploading the file'))
|
||||
|
|
|
|||
|
|
@ -565,7 +565,6 @@ describe('Message.vue', () => {
|
|||
})
|
||||
|
||||
describe('actions', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
store = new Store(testStoreConfig)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -156,6 +156,7 @@ export default {
|
|||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* Specifies if the message is a combined system message.
|
||||
*/
|
||||
|
|
@ -163,6 +164,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
/**
|
||||
* Specifies whether the combined system message is collapsed.
|
||||
*/
|
||||
|
|
@ -170,6 +172,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: undefined,
|
||||
},
|
||||
|
||||
/**
|
||||
* Specifies if the message is inside a collapsed group.
|
||||
*/
|
||||
|
|
@ -177,14 +180,17 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
lastCollapsedMessageId: {
|
||||
type: [String, Number],
|
||||
default: 0,
|
||||
},
|
||||
|
||||
previousMessageId: {
|
||||
type: [String, Number],
|
||||
default: 0,
|
||||
},
|
||||
|
||||
nextMessageId: {
|
||||
type: [String, Number],
|
||||
default: 0,
|
||||
|
|
@ -449,6 +455,7 @@ export default {
|
|||
toggleCombinedSystemMessage() {
|
||||
this.$emit('toggle-combined-system-message')
|
||||
},
|
||||
|
||||
toggleFollowUpEmojiPicker() {
|
||||
this.isFollowUpEmojiPickerOpen = !this.isFollowUpEmojiPickerOpen
|
||||
},
|
||||
|
|
|
|||
|
|
@ -372,14 +372,17 @@ export default {
|
|||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isEmojiPickerOpen: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isReactionsMenuOpen: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isForwarderOpen: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
|
|
@ -508,6 +511,7 @@ export default {
|
|||
get() {
|
||||
return new Date(this.customReminderTimestamp)
|
||||
},
|
||||
|
||||
set(value) {
|
||||
if (value !== null) {
|
||||
this.customReminderTimestamp = value.valueOf()
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
id: {
|
||||
type: [String, Number],
|
||||
required: true,
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
richParameters: {
|
||||
type: Object,
|
||||
required: true,
|
||||
|
|
@ -181,6 +182,7 @@ export default {
|
|||
selectedTo() {
|
||||
this.translatedMessage = ''
|
||||
},
|
||||
|
||||
selectedFrom() {
|
||||
this.translatedMessage = ''
|
||||
},
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ export default {
|
|||
type: String,
|
||||
default: '',
|
||||
},
|
||||
|
||||
/**
|
||||
* Link share root, includes the file name.
|
||||
*/
|
||||
|
|
@ -43,6 +44,7 @@ export default {
|
|||
type: String,
|
||||
default: '',
|
||||
},
|
||||
|
||||
/**
|
||||
* File path relative to the user's home storage, used for previewing
|
||||
* the audio before upload
|
||||
|
|
@ -51,6 +53,7 @@ export default {
|
|||
type: String,
|
||||
default: '',
|
||||
},
|
||||
|
||||
/**
|
||||
* Message ID.
|
||||
*/
|
||||
|
|
@ -58,6 +61,7 @@ export default {
|
|||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
|
||||
nextMessageId: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
|
|
|
|||
|
|
@ -60,15 +60,18 @@ export default {
|
|||
contactHasPhoto() {
|
||||
return this.contactPhotoMimetype && this.contactPhoto
|
||||
},
|
||||
|
||||
contactPhotoFromBase64() {
|
||||
if (!this.contactHasPhoto) {
|
||||
return OC.MimeType.getIconUrl('text/vcard')
|
||||
}
|
||||
return 'data:' + this.contactPhotoMimetype + ';base64,' + this.contactPhoto
|
||||
},
|
||||
|
||||
displayName() {
|
||||
return this.contactName || this.name
|
||||
},
|
||||
|
||||
contactAriaLabel() {
|
||||
return t('spreed', 'Contact')
|
||||
},
|
||||
|
|
|
|||
|
|
@ -34,22 +34,27 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
id: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
boardname: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
stackname: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
link: {
|
||||
type: String,
|
||||
required: true,
|
||||
|
|
@ -68,6 +73,7 @@ export default {
|
|||
board: this.boardname,
|
||||
})
|
||||
},
|
||||
|
||||
deckCardAriaLabel() {
|
||||
return t('spreed', 'Deck Card')
|
||||
},
|
||||
|
|
|
|||
|
|
@ -22,14 +22,17 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
id: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
link: {
|
||||
type: String,
|
||||
default: '',
|
||||
|
|
|
|||
|
|
@ -515,7 +515,6 @@ export default {
|
|||
this.openViewer(this.internalAbsolutePath, list, this.file, loadMore)
|
||||
} else {
|
||||
this.openViewer(this.internalAbsolutePath, [this.file], this.file)
|
||||
|
||||
}
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -34,18 +34,22 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
type: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
id: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
server: {
|
||||
type: String,
|
||||
default: '',
|
||||
|
|
@ -70,18 +74,23 @@ export default {
|
|||
isMentionToAll() {
|
||||
return this.type === MENTION.TYPE.CALL
|
||||
},
|
||||
|
||||
isGroupMention() {
|
||||
return [MENTION.TYPE.USERGROUP, MENTION.TYPE.GROUP].includes(this.type)
|
||||
},
|
||||
|
||||
isTeamMention() {
|
||||
return [MENTION.TYPE.CIRCLE, MENTION.TYPE.TEAM].includes(this.type)
|
||||
},
|
||||
|
||||
isMentionToGuest() {
|
||||
return this.type === MENTION.TYPE.GUEST || this.type === MENTION.TYPE.EMAIL
|
||||
},
|
||||
|
||||
isRemoteUser() {
|
||||
return [MENTION.TYPE.USER, MENTION.TYPE.FEDERATED_USER].includes(this.type) && this.server !== ''
|
||||
},
|
||||
|
||||
isCurrentGuest() {
|
||||
// On mention bubbles the id is actually "guest/ACTOR_ID" for guests
|
||||
// This is to make sure guests can never collide with users,
|
||||
|
|
@ -93,6 +102,7 @@ export default {
|
|||
&& (this.id === ('guest/' + this.$store.getters.getActorId())
|
||||
|| this.id === this.$store.getters.getActorId())
|
||||
},
|
||||
|
||||
isCurrentUser() {
|
||||
if (this.isRemoteUser) {
|
||||
// For now, we don't highlight remote users even if they are the one
|
||||
|
|
@ -102,12 +112,15 @@ export default {
|
|||
return this.$store.getters.isActorUser()
|
||||
&& this.id === this.$store.getters.getUserId()
|
||||
},
|
||||
|
||||
isCurrentUserGroup() {
|
||||
return this.isGroupMention && this.$store.getters.isActorMemberOfGroup(this.id)
|
||||
},
|
||||
|
||||
isCurrentUserTeam() {
|
||||
return this.isTeamMention && this.$store.getters.isActorMemberOfTeam(this.id)
|
||||
},
|
||||
|
||||
primary() {
|
||||
return this.isMentionToAll
|
||||
|| this.isCurrentUser
|
||||
|
|
@ -115,6 +128,7 @@ export default {
|
|||
|| this.isCurrentUserTeam
|
||||
|| (this.isMentionToGuest && this.isCurrentGuest)
|
||||
},
|
||||
|
||||
avatarUrl() {
|
||||
if (this.isRemoteUser) {
|
||||
return this.token
|
||||
|
|
|
|||
|
|
@ -196,14 +196,17 @@ export default {
|
|||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
richParameters: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isDeleting: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
hasCall: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@ describe('Reactions.vue', () => {
|
|||
let message
|
||||
|
||||
beforeEach(() => {
|
||||
|
||||
setActivePinia(createPinia())
|
||||
reactionsStore = useReactionsStore()
|
||||
localVue = createLocalVue()
|
||||
|
|
@ -110,7 +109,6 @@ describe('Reactions.vue', () => {
|
|||
canReact: true,
|
||||
id: messageId,
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
|
|
@ -139,7 +137,6 @@ describe('Reactions.vue', () => {
|
|||
// Assert dropdown contains "You" when you have reacted
|
||||
const summary = wrapper.vm.getReactionSummary('🔥')
|
||||
expect(summary).toContain('You')
|
||||
|
||||
})
|
||||
|
||||
test('shows reaction buttons with count but without emoji picker when no react permission', () => {
|
||||
|
|
@ -280,7 +277,6 @@ describe('Reactions.vue', () => {
|
|||
selectedEmoji: '🔥',
|
||||
})
|
||||
})
|
||||
|
||||
})
|
||||
describe('reactions fetching', () => {
|
||||
test('fetches reactions details when they are not available', async () => {
|
||||
|
|
@ -311,6 +307,5 @@ describe('Reactions.vue', () => {
|
|||
// Assert
|
||||
expect(reactionsStore.fetchReactions).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the current user can react to the message.
|
||||
*/
|
||||
|
|
@ -119,6 +120,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
/**
|
||||
* The message id.
|
||||
*/
|
||||
|
|
@ -277,6 +279,7 @@ export default {
|
|||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.reactions-wrapper {
|
||||
--minimal-button-width: 48px;
|
||||
|
|
|
|||
|
|
@ -163,6 +163,7 @@ export default {
|
|||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.reactions__modal {
|
||||
min-height: 450px;
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* The messages object.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -260,9 +260,7 @@ describe('MessagesSystemGroup.vue', () => {
|
|||
previousMessageId: 90,
|
||||
nextMessageId: 200,
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
describe('renders grouped system message of user actions', () => {
|
||||
|
|
@ -474,5 +472,4 @@ describe('MessagesSystemGroup.vue', () => {
|
|||
testGroupedSystemMessages(wrapper, '{actor} demoted {user0} and {user1} from moderators')
|
||||
})
|
||||
})
|
||||
|
||||
})
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* The messages object.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -268,6 +268,7 @@ export default {
|
|||
this.onWindowFocus()
|
||||
}
|
||||
},
|
||||
|
||||
chatIdentifier: {
|
||||
immediate: true,
|
||||
handler(newValue, oldValue) {
|
||||
|
|
@ -307,7 +308,6 @@ export default {
|
|||
this.updateTasksCount()
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
},
|
||||
|
||||
|
|
@ -596,7 +596,6 @@ export default {
|
|||
} else {
|
||||
return moment(startOfDay).format('LL')
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -700,7 +699,6 @@ export default {
|
|||
|
||||
// Once the history is received, starts looking for new messages.
|
||||
await this.pollNewMessages(token)
|
||||
|
||||
} else {
|
||||
this.$store.dispatch('cancelPollNewMessages', { requestId: this.chatIdentifier })
|
||||
}
|
||||
|
|
@ -1195,6 +1193,7 @@ export default {
|
|||
}
|
||||
return '0'
|
||||
},
|
||||
|
||||
/**
|
||||
* gets the first message's id.
|
||||
*
|
||||
|
|
@ -1218,7 +1217,6 @@ export default {
|
|||
if (from.name === 'conversation' && to.name === 'conversation'
|
||||
&& from.params.token === to.params.token
|
||||
&& from.hash !== to.hash) {
|
||||
|
||||
// the hash changed, need to focus/highlight another message
|
||||
if (to.hash && to.hash.startsWith('#message_')) {
|
||||
const focusedId = this.getMessageIdFromHash(to.hash)
|
||||
|
|
|
|||
|
|
@ -164,11 +164,13 @@ export default {
|
|||
isSearching() {
|
||||
return this.searchText !== ''
|
||||
},
|
||||
|
||||
textFieldLabel() {
|
||||
return this.canModerateSipDialOut
|
||||
? t('spreed', 'Search participants or phone numbers')
|
||||
: t('spreed', 'Search participants')
|
||||
},
|
||||
|
||||
cancelSearchLabel() {
|
||||
return t('spreed', 'Cancel search')
|
||||
},
|
||||
|
|
|
|||
|
|
@ -263,6 +263,7 @@ export default {
|
|||
|
||||
this.showModal()
|
||||
},
|
||||
|
||||
/**
|
||||
* Reinitialise the component to it's initial state. This is necessary
|
||||
* because once the component is mounted its data would persist even if
|
||||
|
|
|
|||
|
|
@ -98,10 +98,12 @@ export default {
|
|||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
password: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
listable: {
|
||||
type: Number,
|
||||
required: true,
|
||||
|
|
@ -122,6 +124,7 @@ export default {
|
|||
get() {
|
||||
return this.newConversation.displayName
|
||||
},
|
||||
|
||||
set(displayName) {
|
||||
this.updateNewConversation({ displayName })
|
||||
},
|
||||
|
|
@ -131,6 +134,7 @@ export default {
|
|||
get() {
|
||||
return this.newConversation.description
|
||||
},
|
||||
|
||||
set(description) {
|
||||
this.updateNewConversation({ description })
|
||||
},
|
||||
|
|
@ -154,6 +158,7 @@ export default {
|
|||
get() {
|
||||
return this.newConversation.type === CONVERSATION.TYPE.PUBLIC
|
||||
},
|
||||
|
||||
async set(value) {
|
||||
if (value) {
|
||||
this.updateNewConversation({ type: CONVERSATION.TYPE.PUBLIC, hasPassword: this.forcePasswordProtection ?? false })
|
||||
|
|
@ -171,6 +176,7 @@ export default {
|
|||
get() {
|
||||
return this.newConversation.hasPassword
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.updateNewConversation({ hasPassword: value })
|
||||
if (!value) {
|
||||
|
|
@ -183,6 +189,7 @@ export default {
|
|||
get() {
|
||||
return this.password
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.$emit('update:password', value)
|
||||
},
|
||||
|
|
@ -192,6 +199,7 @@ export default {
|
|||
get() {
|
||||
return this.listable
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.$emit('update:listable', value)
|
||||
},
|
||||
|
|
|
|||
|
|
@ -156,6 +156,7 @@ export default {
|
|||
this.newFileTitle = value.label + value.extension
|
||||
},
|
||||
},
|
||||
|
||||
selectedTemplate: {
|
||||
deep: true,
|
||||
handler(value) {
|
||||
|
|
|
|||
|
|
@ -65,30 +65,37 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
checked: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
fileid: {
|
||||
type: [String, Number],
|
||||
required: true,
|
||||
},
|
||||
|
||||
filename: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
previewUrl: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
|
||||
hasPreview: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
|
||||
mime: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
ratio: {
|
||||
type: Number,
|
||||
default: null,
|
||||
|
|
@ -142,6 +149,7 @@ export default {
|
|||
onCheck() {
|
||||
this.$emit('check', this.fileid)
|
||||
},
|
||||
|
||||
onFailure() {
|
||||
this.failedPreview = true
|
||||
},
|
||||
|
|
|
|||
|
|
@ -220,6 +220,7 @@ export default {
|
|||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Clicks the hidden file input when clicking the correspondent NcActionButton,
|
||||
* thus opening the file-picker
|
||||
|
|
|
|||
|
|
@ -232,6 +232,7 @@ export default {
|
|||
get() {
|
||||
return this.voteToSubmit
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.voteToSubmit = Array.isArray(value) ? value : [value]
|
||||
},
|
||||
|
|
|
|||
|
|
@ -92,11 +92,13 @@ export default {
|
|||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
// Whether to show remove / cancel action
|
||||
canCancel: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// Whether to show edit actions
|
||||
editMessage: {
|
||||
type: Boolean,
|
||||
|
|
|
|||
|
|
@ -940,6 +940,7 @@ export default {
|
|||
this.disabled = false
|
||||
}
|
||||
},
|
||||
|
||||
async holdPhoneNumber() {
|
||||
try {
|
||||
await callSIPHoldPhone(this.sessionIds[0])
|
||||
|
|
@ -951,6 +952,7 @@ export default {
|
|||
showError(t('spreed', 'Phone number could not be put on hold'))
|
||||
}
|
||||
},
|
||||
|
||||
async mutePhoneNumber() {
|
||||
try {
|
||||
await callSIPMutePhone(this.sessionIds[0])
|
||||
|
|
@ -962,6 +964,7 @@ export default {
|
|||
showError(t('spreed', 'Phone number could not be muted'))
|
||||
}
|
||||
},
|
||||
|
||||
async unmutePhoneNumber() {
|
||||
try {
|
||||
await callSIPUnmutePhone(this.sessionIds[0])
|
||||
|
|
@ -973,6 +976,7 @@ export default {
|
|||
showError(t('spreed', 'Phone number could not be unmuted'))
|
||||
}
|
||||
},
|
||||
|
||||
async dialType(value) {
|
||||
try {
|
||||
await callSIPSendDTMF(this.sessionIds[0], value)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@ describe('ParticipantPermissionsEditor.vue', () => {
|
|||
// Add a mock function for the action and see if its called and with which arguments
|
||||
testStoreConfig.modules.participantsStore.actions.setPermissions = jest.fn()
|
||||
store = new Vuex.Store(testStoreConfig)
|
||||
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
|
|
@ -117,7 +116,6 @@ describe('ParticipantPermissionsEditor.vue', () => {
|
|||
})
|
||||
|
||||
describe('Dispatches the action to set the right permissions', () => {
|
||||
|
||||
test('Dispatches setPermissions with the correct permissions value when a permission is added', async () => {
|
||||
const wrapper = await mountParticipantPermissionsEditor(participant)
|
||||
|
||||
|
|
|
|||
|
|
@ -41,10 +41,12 @@ export default {
|
|||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
isSearchResult: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
|
|||
|
|
@ -119,10 +119,12 @@ export default {
|
|||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
|
||||
contactsLoading: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* Token of current conversation (if provided).
|
||||
*/
|
||||
|
|
@ -130,6 +132,7 @@ export default {
|
|||
type: String,
|
||||
default: '',
|
||||
},
|
||||
|
||||
/**
|
||||
* Display no-results state instead of list.
|
||||
*/
|
||||
|
|
@ -137,6 +140,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
/**
|
||||
* Display only results from internal users.
|
||||
*/
|
||||
|
|
@ -144,6 +148,7 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
/**
|
||||
* Display loading state instead of list.
|
||||
*/
|
||||
|
|
@ -151,14 +156,17 @@ export default {
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
scrollable: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
showSearchHints: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
searchText: {
|
||||
type: String,
|
||||
default: '',
|
||||
|
|
@ -225,15 +233,19 @@ export default {
|
|||
return this.searchResults.filter(item => item.source === ATTENDEE.ACTOR_TYPE.USERS)
|
||||
.filter(user => !this.participants.some(participant => user.id === participant.userId))
|
||||
},
|
||||
|
||||
addableGroups() {
|
||||
return this.searchResults.filter((item) => item.source === ATTENDEE.ACTOR_TYPE.GROUPS)
|
||||
},
|
||||
|
||||
addableEmails() {
|
||||
return this.searchResults.filter((item) => item.source === ATTENDEE.ACTOR_TYPE.EMAILS)
|
||||
},
|
||||
|
||||
addableCircles() {
|
||||
return this.searchResults.filter((item) => item.source === ATTENDEE.ACTOR_TYPE.CIRCLES)
|
||||
},
|
||||
|
||||
addableRemotes() {
|
||||
return this.searchResults.filter((item) => item.source === ATTENDEE.ACTOR_TYPE.REMOTES)
|
||||
.map((item) => {
|
||||
|
|
@ -254,6 +266,7 @@ export default {
|
|||
return !this.contactsLoading && this.searchText === ''
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
t,
|
||||
handleClickParticipant(participant) {
|
||||
|
|
|
|||
|
|
@ -124,10 +124,12 @@ export default {
|
|||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
|
||||
canSearch: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
|
||||
canAdd: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
|
|
@ -205,21 +207,27 @@ export default {
|
|||
show() {
|
||||
return this.sidebarStore.show
|
||||
},
|
||||
|
||||
opened() {
|
||||
return !!this.token && this.show
|
||||
},
|
||||
|
||||
token() {
|
||||
return this.$store.getters.getToken()
|
||||
},
|
||||
|
||||
conversation() {
|
||||
return this.$store.getters.conversation(this.token) || this.$store.getters.dummyConversation
|
||||
},
|
||||
|
||||
isOneToOneConversation() {
|
||||
return [CONVERSATION.TYPE.ONE_TO_ONE, CONVERSATION.TYPE.ONE_TO_ONE_FORMER].includes(this.conversation.type)
|
||||
},
|
||||
|
||||
userId() {
|
||||
return this.$store.getters.getUserId()
|
||||
},
|
||||
|
||||
canAddPhones() {
|
||||
const canModerateSipDialOut = hasTalkFeature(this.token, 'sip-support-dialout')
|
||||
&& getTalkConfig(this.token, 'call', 'sip-enabled')
|
||||
|
|
@ -227,9 +235,11 @@ export default {
|
|||
&& getTalkConfig(this.token, 'call', 'can-enable-sip')
|
||||
return canModerateSipDialOut && this.conversation.canEnableSIP
|
||||
},
|
||||
|
||||
isSearching() {
|
||||
return this.searchText !== ''
|
||||
},
|
||||
|
||||
noResults() {
|
||||
return this.searchResults.length === 0
|
||||
},
|
||||
|
|
|
|||
|
|
@ -254,12 +254,15 @@ export default {
|
|||
isSidebarAvailable() {
|
||||
return this.token && !this.isInLobby
|
||||
},
|
||||
|
||||
show() {
|
||||
return this.sidebarStore.show
|
||||
},
|
||||
|
||||
opened() {
|
||||
return this.isSidebarAvailable && this.show
|
||||
},
|
||||
|
||||
token() {
|
||||
return this.$store.getters.getToken()
|
||||
},
|
||||
|
|
@ -358,6 +361,7 @@ export default {
|
|||
unreadMessagesCounter() {
|
||||
return this.conversation.unreadMessages
|
||||
},
|
||||
|
||||
hasUnreadMentions() {
|
||||
return this.conversation.unreadMention
|
||||
},
|
||||
|
|
@ -453,6 +457,7 @@ export default {
|
|||
// FIXME collapse for group conversations until we show anything useful there
|
||||
this.contentModeIndex = this.isOneToOne ? 1 : 0
|
||||
},
|
||||
|
||||
immediate: true,
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -96,21 +96,27 @@ export default {
|
|||
itemsToDisplay() {
|
||||
return Object.values(this.items).reverse().slice(0, this.limit)
|
||||
},
|
||||
|
||||
isLocation() {
|
||||
return this.type === SHARED_ITEM.TYPES.LOCATION
|
||||
},
|
||||
|
||||
isDeckCard() {
|
||||
return this.type === SHARED_ITEM.TYPES.DECK_CARD
|
||||
},
|
||||
|
||||
isPoll() {
|
||||
return this.type === SHARED_ITEM.TYPES.POLL
|
||||
},
|
||||
|
||||
isOther() {
|
||||
return this.type === SHARED_ITEM.TYPES.OTHER
|
||||
},
|
||||
|
||||
isMedia() {
|
||||
return this.type === SHARED_ITEM.TYPES.MEDIA
|
||||
},
|
||||
|
||||
hasListLayout() {
|
||||
return !this.isMedia && (this.tabView || (!this.isLocation && !this.isDeckCard && !this.isPoll))
|
||||
},
|
||||
|
|
|
|||
|
|
@ -78,14 +78,17 @@ export default {
|
|||
actorDisplayName() {
|
||||
return this.$store.getters.getDisplayName() || t('spreed', 'Guest')
|
||||
},
|
||||
|
||||
displayNameLabel() {
|
||||
return t('spreed', 'Display name: {name}', {
|
||||
name: `<strong>${escapeHtml(this.actorDisplayName)}</strong>`,
|
||||
}, undefined, { escape: false })
|
||||
},
|
||||
|
||||
actorId() {
|
||||
return this.$store.getters.getActorId()
|
||||
},
|
||||
|
||||
token() {
|
||||
return this.$store.getters.getToken()
|
||||
},
|
||||
|
|
@ -99,6 +102,7 @@ export default {
|
|||
this.delayHandleUserNameFromBrowserStorage = false
|
||||
}
|
||||
},
|
||||
|
||||
// Update the input field text
|
||||
actorDisplayName(newName) {
|
||||
this.guestUserName = newName
|
||||
|
|
|
|||
|
|
@ -213,16 +213,20 @@ export default {
|
|||
token() {
|
||||
return this.$store.getters.getToken()
|
||||
},
|
||||
|
||||
isNextcloudTalkHashDirty() {
|
||||
return this.talkHashStore.isNextcloudTalkHashDirty
|
||||
|| this.talkHashStore.isNextcloudTalkProxyHashDirty[this.token]
|
||||
},
|
||||
|
||||
conversation() {
|
||||
return this.$store.getters.conversation(this.token) || this.$store.getters.dummyConversation
|
||||
},
|
||||
|
||||
showButtonText() {
|
||||
return !this.hideText && (!this.isMobile || !this.shrinkOnMobile)
|
||||
},
|
||||
|
||||
showRecordingWarning() {
|
||||
return [CALL.RECORDING.VIDEO_STARTING, CALL.RECORDING.AUDIO_STARTING,
|
||||
CALL.RECORDING.VIDEO, CALL.RECORDING.AUDIO].includes(this.conversation.callRecording)
|
||||
|
|
|
|||
|
|
@ -201,7 +201,6 @@ export default {
|
|||
},
|
||||
|
||||
showCallDurationHint() {
|
||||
|
||||
this.showPopover = true
|
||||
this.isCallDurationHintShown = true
|
||||
|
||||
|
|
|
|||
|
|
@ -157,14 +157,17 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
model: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
localCallParticipantModel: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
|
||||
isSidebar: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ export default {
|
|||
return ['conversations', 'messages', 'participants', 'event-cards'].includes(value)
|
||||
},
|
||||
},
|
||||
|
||||
count: {
|
||||
type: Number,
|
||||
default: 5,
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ export default {
|
|||
IconMagnify,
|
||||
NcTextField,
|
||||
},
|
||||
|
||||
props: {
|
||||
/**
|
||||
* The placeholder for the input field
|
||||
|
|
@ -44,6 +45,7 @@ export default {
|
|||
type: String,
|
||||
default: t('spreed', 'Search …'),
|
||||
},
|
||||
|
||||
/**
|
||||
* The value of the input field.
|
||||
*/
|
||||
|
|
@ -51,6 +53,7 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* If true, this component displays an 'x' button to abort the search
|
||||
*/
|
||||
|
|
@ -58,6 +61,7 @@ export default {
|
|||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
|
||||
/**
|
||||
* Conversations list reference for handling click trigger
|
||||
*/
|
||||
|
|
@ -84,6 +88,7 @@ export default {
|
|||
get() {
|
||||
return this.value
|
||||
},
|
||||
|
||||
set(value) {
|
||||
this.updateValue(value)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -153,7 +153,6 @@ describe('message actions', () => {
|
|||
// Assert
|
||||
expect(result.isCurrentUserOwnMessage.value).toBe(false)
|
||||
expect(result.isDeleteable.value).toBe(false)
|
||||
|
||||
})
|
||||
|
||||
test('can edit own message', () => {
|
||||
|
|
@ -420,5 +419,4 @@ describe('message actions', () => {
|
|||
expect(result.lastEditor.value).toBe('(edited by you)')
|
||||
})
|
||||
})
|
||||
|
||||
})
|
||||
|
|
|
|||
|
|
@ -245,7 +245,6 @@ export function useCombinedSystemMessage() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Handle cases when actor promoted several users to moderators
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ const experimentalUpdateParticipants = (getTalkConfig('local', 'experiments', 'e
|
|||
* @param {boolean} isTopBar whether the component is the top bar
|
||||
*/
|
||||
export function useGetParticipants(isActive = ref(true), isTopBar = true) {
|
||||
|
||||
// Encapsulation
|
||||
const sessionStore = useSessionStore()
|
||||
const store = useStore()
|
||||
|
|
|
|||
|
|
@ -667,7 +667,6 @@ const actions = {
|
|||
} else {
|
||||
showSuccess(t('spreed', 'Conversation password has been removed'))
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error while setting a password for conversation: ', error)
|
||||
if (error?.response?.data?.ocs?.data?.message) {
|
||||
|
|
@ -675,7 +674,6 @@ const actions = {
|
|||
} else {
|
||||
showError(t('spreed', 'Error occurred while saving conversation password'))
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -1399,7 +1399,6 @@ const actions = {
|
|||
}
|
||||
|
||||
return await postNewMessage(message, { silent: false })
|
||||
|
||||
},
|
||||
|
||||
async removeExpiredMessages(context, { token }) {
|
||||
|
|
|
|||
|
|
@ -924,7 +924,6 @@ describe('messagesStore', () => {
|
|||
[false, CHAT.FETCH_NEW, newMessagesList, 100, 102],
|
||||
]
|
||||
test.each(testCasesOld)('fetches messages from server: including last known - %s, look into future - %s', async (includeLastKnown, lookIntoFuture, payload, firstKnown, lastKnown) => {
|
||||
|
||||
const response = generateOCSResponse({
|
||||
headers: {
|
||||
'x-chat-last-common-read': '123',
|
||||
|
|
@ -1887,7 +1886,6 @@ describe('messagesStore', () => {
|
|||
|
||||
expect(cancelFunctionMocks[0]).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
describe('hasMoreMessagesToLoad', () => {
|
||||
|
|
@ -2052,7 +2050,6 @@ describe('messagesStore', () => {
|
|||
referenceId: '',
|
||||
},
|
||||
)
|
||||
|
||||
})
|
||||
test('forwards a message with mentions and remove the latter', () => {
|
||||
// Arrange
|
||||
|
|
|
|||
|
|
@ -952,7 +952,6 @@ const actions = {
|
|||
callViewStore.handleJoinCall(getters.conversation(token))
|
||||
} catch (e) {
|
||||
console.error('Error while joining call: ', e)
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -1010,7 +1009,6 @@ const actions = {
|
|||
showError(t('spreed', 'Error occurred when sending invitations'))
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -558,7 +558,6 @@ describe('sessionStore', () => {
|
|||
{ token: TOKEN, attendeeId: 4, updatedData: { inCall: 0, sessionIds: [] } })
|
||||
expect(vuexStore.commit).toHaveBeenNthCalledWith(10 + 4, 'updateParticipant',
|
||||
{ token: TOKEN, attendeeId: 5, updatedData: { inCall: 0, sessionIds: [] } })
|
||||
|
||||
})
|
||||
|
||||
it('should skip update if participant is not found', () => {
|
||||
|
|
|
|||
|
|
@ -137,7 +137,6 @@ export const useBreakoutRoomsStore = defineStore('breakoutRooms', {
|
|||
|
||||
// Get the participants of the breakout rooms
|
||||
await this.fetchBreakoutRoomsParticipants(token)
|
||||
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
showError(t('spreed', 'An error occurred while re-ordering the attendees'))
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@ export const useGuestNameStore = defineStore('guestName', {
|
|||
addGuestName({ token, actorId, actorDisplayName }, { noUpdate }) {
|
||||
if (!this.guestNames[token]) {
|
||||
Vue.set(this.guestNames, token, {})
|
||||
|
||||
}
|
||||
if (!this.guestNames[token][actorId] || actorDisplayName === '') {
|
||||
Vue.set(this.guestNames[token], actorId, t('spreed', 'Guest'))
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
* instead).
|
||||
*/
|
||||
export default (function() {
|
||||
|
||||
/**
|
||||
* Mixin constructor.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import { generateOcsUrl } from '@nextcloud/router'
|
|||
*/
|
||||
|
||||
class StandaloneTest {
|
||||
|
||||
constructor(settings, url) {
|
||||
this.settings = settings
|
||||
this.features = null
|
||||
|
|
@ -155,7 +154,6 @@ class StandaloneTest {
|
|||
this.socket.send(JSON.stringify({ type: 'bye', bye: {} }))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -190,7 +190,6 @@ export class Context {
|
|||
const keyIndex = data[encodedFrame.data.byteLength - 1];
|
||||
|
||||
if (this._cryptoKeyRing[keyIndex]) {
|
||||
|
||||
const decodedFrame = await this._decryptFrame(
|
||||
encodedFrame,
|
||||
keyIndex);
|
||||
|
|
@ -216,7 +215,6 @@ export class Context {
|
|||
keyIndex,
|
||||
initialKey = undefined,
|
||||
ratchetCount = 0) {
|
||||
|
||||
const { encryptionKey } = this._cryptoKeyRing[keyIndex];
|
||||
let { material } = this._cryptoKeyRing[keyIndex];
|
||||
|
||||
|
|
@ -292,7 +290,6 @@ export class Context {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Construct the IV used for AES-GCM and sent (in plain) with the packet similar to
|
||||
* https://tools.ietf.org/html/rfc7714#section-8.1
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ const TYPE_ENCRYPTION_GOT_KEY = 'encryption.gotkey'
|
|||
const TYPE_ENCRYPTION_ERROR = 'encryption.error'
|
||||
|
||||
class Encryption {
|
||||
|
||||
/**
|
||||
* Check if the current browser supports encryption.
|
||||
*
|
||||
|
|
@ -680,7 +679,6 @@ class Encryption {
|
|||
this.context.handleReceiver(receiver, receiver.track.kind, peer.id)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default Encryption
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ import { VIRTUAL_BACKGROUND } from '../../../../constants.ts'
|
|||
* video stream.
|
||||
*/
|
||||
export default class JitsiStreamBackgroundEffect {
|
||||
|
||||
// _model: Object;
|
||||
// _options: Object;
|
||||
// _stream: Object;
|
||||
|
|
@ -220,7 +219,6 @@ export default class JitsiStreamBackgroundEffect {
|
|||
* @return {void}
|
||||
*/
|
||||
runPostProcessing() {
|
||||
|
||||
const height = this._inputVideoElement.videoHeight
|
||||
const width = this._inputVideoElement.videoWidth
|
||||
const { backgroundType } = this._options.virtualBackground
|
||||
|
|
@ -502,5 +500,4 @@ export default class JitsiStreamBackgroundEffect {
|
|||
this._virtualVideo.pause()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
import JitsiStreamBackgroundEffect from './JitsiStreamBackgroundEffect.js'
|
||||
|
||||
describe('JitsiStreamBackgroundEffect', () => {
|
||||
|
||||
describe('getSourcePropertiesForDrawingBackgroundImage', () => {
|
||||
test.each([
|
||||
['landscape source and landscape destination, wider aspect ratio source, wider and higher source', [1200, 500], [300, 200], [225, 0], [750, 500]],
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@ async function makeTFLite(isSimd) {
|
|||
self.compiled = true
|
||||
|
||||
self.postMessage({ message: 'loaded' })
|
||||
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
console.error('JitsiStreamBackgroundEffect.worker: tflite compilation failed. The web server may not be properly configured to send wasm and/or tflite files.')
|
||||
|
|
@ -108,7 +107,6 @@ function runInference(frameId) {
|
|||
const segmentationMaskData = []
|
||||
// All consts in Worker in obj array.
|
||||
for (let i = 0; i < self.segmentationPixelCount; i++) {
|
||||
|
||||
const person = self.tflite.HEAPF32[outputMemoryOffset + i]
|
||||
|
||||
segmentationMaskData.push({
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ import TrackSinkSource from './TrackSinkSource.js'
|
|||
* --------------------
|
||||
*/
|
||||
export default class BlackVideoEnforcer extends TrackSinkSource {
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
|
||||
|
|
@ -149,5 +148,4 @@ export default class BlackVideoEnforcer extends TrackSinkSource {
|
|||
|
||||
this._outputStream = null
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ import { mediaDevicesManager } from '../../webrtc/index.js'
|
|||
* --------------------
|
||||
*/
|
||||
export default class MediaDevicesSource extends TrackSource {
|
||||
|
||||
constructor(outputCount) {
|
||||
super()
|
||||
|
||||
|
|
@ -386,5 +385,4 @@ export default class MediaDevicesSource extends TrackSource {
|
|||
resetPendingVideoInputIdChangedCount()
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -168,7 +168,6 @@ describe('MediaDevicesSource', () => {
|
|||
})
|
||||
|
||||
describe('start', () => {
|
||||
|
||||
/**
|
||||
* Checks the expected output tracks and event listeners.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ import EmitterMixin from '../../EmitterMixin.js'
|
|||
* -----------------
|
||||
*/
|
||||
export default class SpeakingMonitor extends TrackSink {
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this._superEmitterMixin()
|
||||
|
|
@ -131,7 +130,6 @@ export default class SpeakingMonitor extends TrackSink {
|
|||
this._trigger('speakingWhileMuted')
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
EmitterMixin.apply(SpeakingMonitor.prototype)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ import TrackSinkSource from './TrackSinkSource.js'
|
|||
* ------------------
|
||||
*/
|
||||
export default class TrackConstrainer extends TrackSinkSource {
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
|
||||
|
|
@ -51,5 +50,4 @@ export default class TrackConstrainer extends TrackSinkSource {
|
|||
_handleInputTrackEnabled(trackId, enabled) {
|
||||
this._setOutputTrackEnabled('default', enabled)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue