UPSTREAM BASELINE: nextcloud/spreed v22.0.12 (без изменений)
Type checking / changes (push) Has been cancelled
Type checking / test (push) Has been cancelled
Type checking / typescript-summary (push) Has been cancelled
Node tests / changes (push) Has been cancelled
Node tests / test (push) Has been cancelled
Node tests / test-summary (push) Has been cancelled

Источник: https://github.com/nextcloud/spreed/archive/refs/tags/v22.0.12.tar.gz
С этого коммита ветка официального Nextcloud Talk отрезана (решение владельца 2026-07-06).
Все дальнейшие изменения — только наши; версии релизов: 22.0.12-f7.N.
This commit is contained in:
2026-07-06 14:07:50 +00:00
commit 01acfa3b40
1716 changed files with 613013 additions and 0 deletions
@@ -0,0 +1,266 @@
<!--
- SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<div class="conversation-permissions-editor">
<div class="app-settings-section__hint">
{{ t('spreed', 'Edit the default permissions for participants in this conversation. These settings do not affect moderators.') }}
</div>
<NcNoteCard
type="warning"
:text="t('spreed', 'Every time permissions are modified in this section, custom permissions previously assigned to individual participants will be lost.')" />
<!-- All permissions -->
<div class="conversation-permissions-editor__setting">
<NcCheckboxRadioSwitch
v-model="radioValue"
:disabled="loading"
value="all"
name="permission_radio"
type="radio"
@update:modelValue="handleSubmitPermissions">
{{ t('spreed', 'All permissions') }}
</NcCheckboxRadioSwitch>
<span v-show="loading && radioValue === 'all'" class="icon-loading-small" />
</div>
<p class="conversation-permissions-editor__hint">
{{ t('spreed', 'Participants have permissions to start a call, join a call, enable audio and video, and share screen.') }}
</p>
<!-- No permissions -->
<div class="conversation-permissions-editor__setting">
<NcCheckboxRadioSwitch
v-model="radioValue"
value="restricted"
:disabled="loading"
name="permission_radio"
type="radio"
@update:modelValue="handleSubmitPermissions">
{{ t('spreed', 'Restricted') }}
</NcCheckboxRadioSwitch>
<span v-show="loading && radioValue === 'restricted'" class="icon-loading-small" />
</div>
<p class="conversation-permissions-editor__hint">
{{ t('spreed', 'Participants can join calls, but cannot enable audio nor video nor share screen until a moderator manually grants them permissions.') }}
</p>
<!-- Advanced permissions -->
<div class="conversation-permissions-editor__setting--advanced">
<NcCheckboxRadioSwitch
v-model="radioValue"
value="advanced"
:disabled="loading"
name="permission_radio"
type="radio"
@update:modelValue="showPermissionsEditor = true">
{{ t('spreed', 'Advanced permissions') }}
</NcCheckboxRadioSwitch>
<!-- Edit advanced permissions -->
<NcButton
v-show="showEditButton"
class="edit-button"
variant="tertiary"
:aria-label="t('spreed', 'Edit permissions')"
@click="showPermissionsEditor = true">
<template #icon>
<IconPencilOutline :size="20" />
</template>
</NcButton>
</div>
<PermissionEditor
v-if="showPermissionsEditor"
:conversationName="conversationName"
:permissions="conversationPermissions"
:loading="loading"
nestedContainer=".conversation-permissions-editor"
@close="handleClosePermissionsEditor"
@submit="handleSubmitPermissions" />
</div>
</template>
<script>
import { showError, showSuccess } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
import IconPencilOutline from 'vue-material-design-icons/PencilOutline.vue'
import PermissionEditor from '../PermissionsEditor/PermissionsEditor.vue'
import { PARTICIPANT } from '../../constants.ts'
const PERMISSIONS = PARTICIPANT.PERMISSIONS
export default {
name: 'ConversationPermissionsSettings',
components: {
PermissionEditor,
NcButton,
NcCheckboxRadioSwitch,
NcNoteCard,
IconPencilOutline,
},
props: {
token: {
type: String,
default: null,
},
},
data() {
return {
showPermissionsEditor: false,
isEditingPermissions: false,
loading: false,
radioValue: '',
}
},
computed: {
/**
* The participant's name.
*/
conversationName() {
return this.$store.getters.conversation(this.token).name
},
/**
* The current conversation permissions.
*/
conversationPermissions() {
return this.$store.getters.conversation(this.token).defaultPermissions
},
/**
* Hides and shows the edit button for advanced permissions.
*/
showEditButton() {
return this.radioValue === 'advanced' && !this.showPermissionsEditor
},
},
mounted() {
/**
* Set the initial radio value.
*/
this.setCurrentRadioValue()
},
methods: {
t,
/**
* Binary sum all the permissions and make the request to change them.
*
* @param {string | number} value - The permissions value, which is a
* string (e.g. 'restricted' or 'all') unless this method is called by
* the click event emitted by the `permissionsEditor` component, in
* which case it's a number indicating the permissions value.
*/
async handleSubmitPermissions(value) {
let permissions
// Compute the permissions value
switch (value) {
case 'all':
permissions = PERMISSIONS.MAX_DEFAULT
break
case 'restricted':
permissions = PERMISSIONS.CALL_JOIN
break
default:
permissions = value
}
this.loading = true
// Make the store call
try {
await this.$store.dispatch('setConversationPermissions', {
token: this.token,
permissions,
})
showSuccess(t('spreed', 'Default permissions modified for {conversationName}', { conversationName: this.conversationName }, { escape: false, sanitize: false }))
// Modify the radio buttons value
this.radioValue = this.getPermissionRadioValue(permissions)
this.showPermissionsEditor = false
} catch (error) {
console.debug(error)
showError(t('spreed', 'Could not modify default permissions for {conversationName}', { conversationName: this.conversationName }, { escape: false, sanitize: false }))
// Go back to the previous radio value
this.radioValue = this.getPermissionRadioValue(this.conversationPermissions)
} finally {
this.loading = false
}
},
/**
* Get the radio button string value given a permission number.
*
* @param {number} value - The permissions value.
*/
getPermissionRadioValue(value) {
switch (value) {
case PERMISSIONS.MAX_DEFAULT:
case PERMISSIONS.MAX_CUSTOM:
return 'all'
case PERMISSIONS.CALL_JOIN:
case PERMISSIONS.CALL_JOIN | PERMISSIONS.CUSTOM:
return 'restricted'
default:
return 'advanced'
}
},
/**
* Set the radio value that corresponds to the current default
* permissions in the store.
*/
setCurrentRadioValue() {
this.radioValue = this.getPermissionRadioValue(this.conversationPermissions)
},
/**
* Hides the modal and resets conversation permissions to the previous
* value.
*/
handleClosePermissionsEditor() {
this.showPermissionsEditor = false
this.setCurrentRadioValue()
},
},
}
</script>
<style lang="scss" scoped>
:deep(.mx-input) {
margin: 0;
}
.conversation-permissions-editor {
&__setting {
display: flex;
justify-content: space-between;
&--advanced {
display: flex;
justify-content: flex-start;
}
}
}
.edit-button {
margin-inline-start: 16px;
}
.conversation-permissions-editor__hint {
color: var(--color-text-maxcontrast);
margin-bottom: 16px;
}
</style>