mirror of
https://github.com/hcengineering/platform.git
synced 2026-08-17 18:05:42 +02:00
Add ability to configure guest spaces in settings (#10770)
* Configure guest channels in the settings Signed-off-by: Artem Savchenko <armisav@gmail.com> * Update space classes Signed-off-by: Artem Savchenko <armisav@gmail.com> --------- Signed-off-by: Artem Savchenko <armisav@gmail.com>
This commit is contained in:
@@ -593,7 +593,7 @@ export interface ModulePermissionGroup extends Doc {
|
|||||||
role: AccountRole
|
role: AccountRole
|
||||||
permissions: Ref<Permission>[]
|
permissions: Ref<Permission>[]
|
||||||
disabledPermissions?: Ref<Permission>[]
|
disabledPermissions?: Ref<Permission>[]
|
||||||
spaceClass: Ref<Class<Space>>
|
spaceClass?: Ref<Class<Space>>
|
||||||
enabled: boolean
|
enabled: boolean
|
||||||
order?: number
|
order?: number
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export function createModel (builder: Builder): void {
|
|||||||
application: chunter.app.Chunter,
|
application: chunter.app.Chunter,
|
||||||
role: AccountRole.Guest,
|
role: AccountRole.Guest,
|
||||||
permissions: [],
|
permissions: [],
|
||||||
spaceClass: chunter.class.ChunterSpace,
|
spaceClass: chunter.class.Channel,
|
||||||
enabled: true,
|
enabled: true,
|
||||||
order: 30
|
order: 30
|
||||||
},
|
},
|
||||||
@@ -90,7 +90,7 @@ export function createModel (builder: Builder): void {
|
|||||||
application: chunter.app.Chunter,
|
application: chunter.app.Chunter,
|
||||||
role: AccountRole.ReadOnlyGuest,
|
role: AccountRole.ReadOnlyGuest,
|
||||||
permissions: [],
|
permissions: [],
|
||||||
spaceClass: chunter.class.ChunterSpace,
|
spaceClass: chunter.class.Channel,
|
||||||
enabled: true,
|
enabled: true,
|
||||||
order: 15
|
order: 15
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -273,7 +273,6 @@ export function createModel (builder: Builder): void {
|
|||||||
application: love.app.Love,
|
application: love.app.Love,
|
||||||
role: AccountRole.Guest,
|
role: AccountRole.Guest,
|
||||||
permissions: [],
|
permissions: [],
|
||||||
spaceClass: love.class.Office,
|
|
||||||
enabled: true,
|
enabled: true,
|
||||||
order: 50
|
order: 50
|
||||||
},
|
},
|
||||||
@@ -287,7 +286,6 @@ export function createModel (builder: Builder): void {
|
|||||||
application: love.app.Love,
|
application: love.app.Love,
|
||||||
role: AccountRole.ReadOnlyGuest,
|
role: AccountRole.ReadOnlyGuest,
|
||||||
permissions: [],
|
permissions: [],
|
||||||
spaceClass: love.class.Office,
|
|
||||||
enabled: false,
|
enabled: false,
|
||||||
order: 50
|
order: 50
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ export function createModel (builder: Builder): void {
|
|||||||
application: time.app.Me,
|
application: time.app.Me,
|
||||||
role: AccountRole.Guest,
|
role: AccountRole.Guest,
|
||||||
permissions: [],
|
permissions: [],
|
||||||
spaceClass: core.class.TypedSpace,
|
spaceClass: tracker.class.Project,
|
||||||
enabled: true,
|
enabled: true,
|
||||||
order: 55
|
order: 55
|
||||||
},
|
},
|
||||||
@@ -234,7 +234,7 @@ export function createModel (builder: Builder): void {
|
|||||||
application: time.app.Me,
|
application: time.app.Me,
|
||||||
role: AccountRole.ReadOnlyGuest,
|
role: AccountRole.ReadOnlyGuest,
|
||||||
permissions: [],
|
permissions: [],
|
||||||
spaceClass: core.class.TypedSpace,
|
spaceClass: tracker.class.Project,
|
||||||
enabled: false,
|
enabled: false,
|
||||||
order: 55
|
order: 55
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -917,7 +917,6 @@ function defineSettings (builder: Builder): void {
|
|||||||
application: training.app.Training,
|
application: training.app.Training,
|
||||||
role: AccountRole.Guest,
|
role: AccountRole.Guest,
|
||||||
permissions: [training.ids.GuestTrainingAttemptClassPermission],
|
permissions: [training.ids.GuestTrainingAttemptClassPermission],
|
||||||
spaceClass: core.class.TypedSpace,
|
|
||||||
enabled: true,
|
enabled: true,
|
||||||
order: 25
|
order: 25
|
||||||
},
|
},
|
||||||
@@ -931,7 +930,6 @@ function defineSettings (builder: Builder): void {
|
|||||||
application: training.app.Training,
|
application: training.app.Training,
|
||||||
role: AccountRole.ReadOnlyGuest,
|
role: AccountRole.ReadOnlyGuest,
|
||||||
permissions: [],
|
permissions: [],
|
||||||
spaceClass: core.class.TypedSpace,
|
|
||||||
enabled: false,
|
enabled: false,
|
||||||
order: 25
|
order: 25
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "Umožňuje anonymním uživatelům připojit se k vašemu pracovnímu prostoru jako hosté s omezenými editačními právy",
|
"GuestSignUpDescription": "Umožňuje anonymním uživatelům připojit se k vašemu pracovnímu prostoru jako hosté s omezenými editačními právy",
|
||||||
"GuestChannelsDescription": "Kanály, kde hosté mohou psát zprávy po připojení",
|
"GuestChannelsDescription": "Kanály, kde hosté mohou psát zprávy po připojení",
|
||||||
"GuestChannelsArrayLabel": "Vybrat kanály",
|
"GuestChannelsArrayLabel": "Vybrat kanály",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Dostupné prostory",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Každá karta aplikace má vlastní řádek „Dostupné prostory“ pro automatické připojení hostů; změny se projeví okamžitě.",
|
||||||
"ManageIdentities": "Spravovat identity",
|
"ManageIdentities": "Spravovat identity",
|
||||||
"Release": "Uvolnění",
|
"Release": "Uvolnění",
|
||||||
"ReleaseSocialId": "Uvolnit sociální ID",
|
"ReleaseSocialId": "Uvolnit sociální ID",
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "Ermöglicht anonymen Benutzern den Beitritt zu Ihrem Arbeitsbereich als Gäste mit eingeschränkten Bearbeitungsrechten",
|
"GuestSignUpDescription": "Ermöglicht anonymen Benutzern den Beitritt zu Ihrem Arbeitsbereich als Gäste mit eingeschränkten Bearbeitungsrechten",
|
||||||
"GuestChannelsDescription": "Kanäle, in denen Gäste nach dem Beitritt Nachrichten schreiben können",
|
"GuestChannelsDescription": "Kanäle, in denen Gäste nach dem Beitritt Nachrichten schreiben können",
|
||||||
"GuestChannelsArrayLabel": "Kanäle auswählen",
|
"GuestChannelsArrayLabel": "Kanäle auswählen",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Verfügbare Bereiche",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Jede Anwendungskarte hat eine eigene Zeile „Verfügbare Bereiche“ für den automatischen Gästebeitritt; Änderungen gelten sofort.",
|
||||||
"ManageIdentities": "Identitäten verwalten",
|
"ManageIdentities": "Identitäten verwalten",
|
||||||
"Release": "Freigeben",
|
"Release": "Freigeben",
|
||||||
"ReleaseSocialId": "Social ID freigeben",
|
"ReleaseSocialId": "Social ID freigeben",
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "Allows anonymous users to join your workspace as guests with limited editing rights",
|
"GuestSignUpDescription": "Allows anonymous users to join your workspace as guests with limited editing rights",
|
||||||
"GuestChannelsDescription": "Channels where guests can write messages after joining",
|
"GuestChannelsDescription": "Channels where guests can write messages after joining",
|
||||||
"GuestChannelsArrayLabel": "Select channels",
|
"GuestChannelsArrayLabel": "Select channels",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Available spaces",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Each application card has its own “Available spaces” row to pick where workspace guests are added on activation. Changes apply immediately.",
|
||||||
"ManageIdentities": "Manage identities",
|
"ManageIdentities": "Manage identities",
|
||||||
"Release": "Release",
|
"Release": "Release",
|
||||||
"ReleaseSocialId": "Release social ID",
|
"ReleaseSocialId": "Release social ID",
|
||||||
|
|||||||
@@ -165,6 +165,8 @@
|
|||||||
"GuestSignUpDescription": "Permite a usuarios anónimos unirse a su espacio de trabajo como invitados con derechos de edición limitados",
|
"GuestSignUpDescription": "Permite a usuarios anónimos unirse a su espacio de trabajo como invitados con derechos de edición limitados",
|
||||||
"GuestChannelsDescription": "Canales donde los invitados pueden escribir mensajes después de unirse",
|
"GuestChannelsDescription": "Canales donde los invitados pueden escribir mensajes después de unirse",
|
||||||
"GuestChannelsArrayLabel": "Seleccionar canales",
|
"GuestChannelsArrayLabel": "Seleccionar canales",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Espacios disponibles",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Cada tarjeta de aplicación tiene su propia fila « Espacios disponibles » para la adhesión automática de invitados; los cambios son inmediatos.",
|
||||||
"ManageIdentities": "Gestionar identidades",
|
"ManageIdentities": "Gestionar identidades",
|
||||||
"Release": "Liberar",
|
"Release": "Liberar",
|
||||||
"ReleaseSocialId": "Liberar ID social",
|
"ReleaseSocialId": "Liberar ID social",
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "Permet aux utilisateurs anonymes de rejoindre votre espace de travail en tant qu'invités avec des droits d'édition limités",
|
"GuestSignUpDescription": "Permet aux utilisateurs anonymes de rejoindre votre espace de travail en tant qu'invités avec des droits d'édition limités",
|
||||||
"GuestChannelsDescription": "Canaux où les invités peuvent écrire des messages après leur adhésion",
|
"GuestChannelsDescription": "Canaux où les invités peuvent écrire des messages après leur adhésion",
|
||||||
"GuestChannelsArrayLabel": "Sélectionner des canaux",
|
"GuestChannelsArrayLabel": "Sélectionner des canaux",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Espaces disponibles",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Chaque carte d’application a sa propre ligne « Espaces disponibles » pour l’adhésion automatique des invités ; les changements sont immédiats.",
|
||||||
"ManageIdentities": "Gérer les identités",
|
"ManageIdentities": "Gérer les identités",
|
||||||
"Release": "Libération",
|
"Release": "Libération",
|
||||||
"ReleaseSocialId": "Libérer l'ID social",
|
"ReleaseSocialId": "Libérer l'ID social",
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "Consente agli utenti anonimi di unirsi al tuo spazio di lavoro come ospiti con diritti di modifica limitati",
|
"GuestSignUpDescription": "Consente agli utenti anonimi di unirsi al tuo spazio di lavoro come ospiti con diritti di modifica limitati",
|
||||||
"GuestChannelsDescription": "Canali in cui gli ospiti possono scrivere messaggi dopo essersi uniti",
|
"GuestChannelsDescription": "Canali in cui gli ospiti possono scrivere messaggi dopo essersi uniti",
|
||||||
"GuestChannelsArrayLabel": "Seleziona canali",
|
"GuestChannelsArrayLabel": "Seleziona canali",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Spazi disponibili",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Ogni scheda applicazione ha la propria riga « Spazi disponibili » per l’ingresso automatico degli ospiti; le modifiche sono immediate.",
|
||||||
"ManageIdentities": "Gestisci identità",
|
"ManageIdentities": "Gestisci identità",
|
||||||
"Release": "Rilascio",
|
"Release": "Rilascio",
|
||||||
"ReleaseSocialId": "Rilascia ID social",
|
"ReleaseSocialId": "Rilascia ID social",
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "匿名ユーザーがゲストとしてワークスペースに参加し、制限された編集権限を得られるようにします",
|
"GuestSignUpDescription": "匿名ユーザーがゲストとしてワークスペースに参加し、制限された編集権限を得られるようにします",
|
||||||
"GuestChannelsDescription": "参加後、ゲストがメッセージを書き込めるチャンネル",
|
"GuestChannelsDescription": "参加後、ゲストがメッセージを書き込めるチャンネル",
|
||||||
"GuestChannelsArrayLabel": "チャンネルを選択",
|
"GuestChannelsArrayLabel": "チャンネルを選択",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "利用可能なスペース",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "各アプリのカードにゲスト自動参加用の「利用可能なスペース」行があります。変更はすぐに反映されます。",
|
||||||
"ManageIdentities": "IDを管理",
|
"ManageIdentities": "IDを管理",
|
||||||
"Release": "リリース",
|
"Release": "リリース",
|
||||||
"ReleaseSocialId": "ソーシャルIDをリリース",
|
"ReleaseSocialId": "ソーシャルIDをリリース",
|
||||||
|
|||||||
@@ -165,6 +165,8 @@
|
|||||||
"GuestSignUpDescription": "Permite que usuários anônimos entrem em seu espaço de trabalho como convidados com direitos de edição limitados",
|
"GuestSignUpDescription": "Permite que usuários anônimos entrem em seu espaço de trabalho como convidados com direitos de edição limitados",
|
||||||
"GuestChannelsDescription": "Canais onde convidados podem escrever mensagens após entrar",
|
"GuestChannelsDescription": "Canais onde convidados podem escrever mensagens após entrar",
|
||||||
"GuestChannelsArrayLabel": "Selecionar canais",
|
"GuestChannelsArrayLabel": "Selecionar canais",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Espaços disponíveis",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Cada cartão de app tem sua própria linha « Espaços disponíveis » para adesão automática de convidados; as alterações são aplicadas na hora.",
|
||||||
"ManageIdentities": "Gerenciar identidades",
|
"ManageIdentities": "Gerenciar identidades",
|
||||||
"Release": "Liberação",
|
"Release": "Liberação",
|
||||||
"ReleaseSocialId": "Liberar ID social",
|
"ReleaseSocialId": "Liberar ID social",
|
||||||
|
|||||||
@@ -165,6 +165,8 @@
|
|||||||
"GuestSignUpDescription": "Permite que usuários anônimos entrem em seu espaço de trabalho como convidados com direitos de edição limitados",
|
"GuestSignUpDescription": "Permite que usuários anônimos entrem em seu espaço de trabalho como convidados com direitos de edição limitados",
|
||||||
"GuestChannelsDescription": "Canais onde convidados podem escrever mensagens após ingressar",
|
"GuestChannelsDescription": "Canais onde convidados podem escrever mensagens após ingressar",
|
||||||
"GuestChannelsArrayLabel": "Selecionar canais",
|
"GuestChannelsArrayLabel": "Selecionar canais",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Espaços disponíveis",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Cada cartão de aplicação tem a sua própria linha « Espaços disponíveis » para adesão automática de convidados; as alterações aplicam-se de imediato.",
|
||||||
"ManageIdentities": "Gerenciar identidades",
|
"ManageIdentities": "Gerenciar identidades",
|
||||||
"Release": "Libertação",
|
"Release": "Libertação",
|
||||||
"ReleaseSocialId": "Liberar ID social",
|
"ReleaseSocialId": "Liberar ID social",
|
||||||
|
|||||||
@@ -179,6 +179,8 @@
|
|||||||
"GuestSignUpDescription": "Позволяет анонимным пользователям присоединяться к вашему рабочему пространству в качестве гостей с ограниченными правами редактирования",
|
"GuestSignUpDescription": "Позволяет анонимным пользователям присоединяться к вашему рабочему пространству в качестве гостей с ограниченными правами редактирования",
|
||||||
"GuestChannelsDescription": "Каналы, в которых гости могут писать сообщения после присоединения",
|
"GuestChannelsDescription": "Каналы, в которых гости могут писать сообщения после присоединения",
|
||||||
"GuestChannelsArrayLabel": "Выбрать каналы",
|
"GuestChannelsArrayLabel": "Выбрать каналы",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Доступные пространства",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "У каждого приложения ниже своя строка «Доступные пространства»: выберите, куда при активации добавлять гостей воркспейса. Изменения применяются сразу.",
|
||||||
"ManageIdentities": "Управление идентификаторами",
|
"ManageIdentities": "Управление идентификаторами",
|
||||||
"Release": "Освободить",
|
"Release": "Освободить",
|
||||||
"ReleaseSocialId": "Освободить социальный ID",
|
"ReleaseSocialId": "Освободить социальный ID",
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "Anonim kullanıcıların çalışma alanınıza sınırlı düzenleme haklarıyla misafir olarak katılmasına izin verir",
|
"GuestSignUpDescription": "Anonim kullanıcıların çalışma alanınıza sınırlı düzenleme haklarıyla misafir olarak katılmasına izin verir",
|
||||||
"GuestChannelsDescription": "Misafirlerin katıldıktan sonra mesaj yazabileceği kanallar",
|
"GuestChannelsDescription": "Misafirlerin katıldıktan sonra mesaj yazabileceği kanallar",
|
||||||
"GuestChannelsArrayLabel": "Kanalları seç",
|
"GuestChannelsArrayLabel": "Kanalları seç",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "Kullanılabilir alanlar",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "Her uygulama kartının misafir otomatik katılımı için kendi « Kullanılabilir alanlar » satırı vardır; değişiklikler hemen uygulanır.",
|
||||||
"ManageIdentities": "Kimlikleri yönet",
|
"ManageIdentities": "Kimlikleri yönet",
|
||||||
"Release": "Serbest bırak",
|
"Release": "Serbest bırak",
|
||||||
"ReleaseSocialId": "Sosyal ID'yi serbest bırak",
|
"ReleaseSocialId": "Sosyal ID'yi serbest bırak",
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
"GuestSignUpDescription": "允许匿名用户以访客身份加入您的工作区,获得有限的编辑权限",
|
"GuestSignUpDescription": "允许匿名用户以访客身份加入您的工作区,获得有限的编辑权限",
|
||||||
"GuestChannelsDescription": "访客加入后可以发送消息的频道",
|
"GuestChannelsDescription": "访客加入后可以发送消息的频道",
|
||||||
"GuestChannelsArrayLabel": "选择频道",
|
"GuestChannelsArrayLabel": "选择频道",
|
||||||
|
"GuestAutoJoinAvailableSpaces": "可用空间",
|
||||||
|
"GuestAutoJoinAvailableSpacesHint": "每个应用卡片都有各自的「可用空间」行,用于选择在激活时添加工作区访客的位置;更改会立即生效。",
|
||||||
"ManageIdentities": "管理身份",
|
"ManageIdentities": "管理身份",
|
||||||
"Release": "释放",
|
"Release": "释放",
|
||||||
"ReleaseSocialId": "释放社交ID",
|
"ReleaseSocialId": "释放社交ID",
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
<!--
|
||||||
|
// Copyright © 2026 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
-->
|
||||||
|
<script lang="ts">
|
||||||
|
import { Analytics } from '@hcengineering/analytics'
|
||||||
|
import {
|
||||||
|
AccountRole,
|
||||||
|
setWorkspaceGuestAutoJoinRoles,
|
||||||
|
type ModulePermissionGroup,
|
||||||
|
type Space
|
||||||
|
} from '@hcengineering/core'
|
||||||
|
import { getClient } from '@hcengineering/presentation'
|
||||||
|
import { DropdownLabels, type DropdownTextItem } from '@hcengineering/ui'
|
||||||
|
import settingsRes from '../plugin'
|
||||||
|
|
||||||
|
export let group: ModulePermissionGroup
|
||||||
|
export let disabled = false
|
||||||
|
|
||||||
|
const client = getClient()
|
||||||
|
|
||||||
|
let loading = true
|
||||||
|
let saving = false
|
||||||
|
let loadedGroupId: string | undefined
|
||||||
|
let dropdownItems: DropdownTextItem[] = []
|
||||||
|
let selectedKeys: string[] = []
|
||||||
|
let persistedSelectedKeys: string[] = []
|
||||||
|
let docById: Map<string, Space> = new Map<string, Space>()
|
||||||
|
|
||||||
|
function normalizeAutoJoinForRoles (roles: AccountRole[]): AccountRole[] | undefined {
|
||||||
|
return roles.length > 0 ? [...roles] : undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadSpaces (): Promise<void> {
|
||||||
|
if (group.spaceClass === undefined) {
|
||||||
|
dropdownItems = []
|
||||||
|
selectedKeys = []
|
||||||
|
persistedSelectedKeys = []
|
||||||
|
docById = new Map<string, Space>()
|
||||||
|
loading = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
loading = true
|
||||||
|
try {
|
||||||
|
const res = await client.findAll(group.spaceClass, { archived: false })
|
||||||
|
docById = new Map(res.map((d) => [d._id, d as Space]))
|
||||||
|
const docs = [...docById.values()]
|
||||||
|
dropdownItems = docs.map((d) => ({ id: d._id, label: d.name })).sort((a, b) => a.label.localeCompare(b.label))
|
||||||
|
selectedKeys = docs
|
||||||
|
.filter((d) => d.autoJoinForRoles?.includes(AccountRole.Guest) === true)
|
||||||
|
.map((d) => d._id)
|
||||||
|
.sort()
|
||||||
|
persistedSelectedKeys = [...selectedKeys]
|
||||||
|
} catch (err) {
|
||||||
|
Analytics.handleError(err as Error)
|
||||||
|
dropdownItems = []
|
||||||
|
selectedKeys = []
|
||||||
|
persistedSelectedKeys = []
|
||||||
|
docById = new Map<string, Space>()
|
||||||
|
} finally {
|
||||||
|
loading = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleSelected (e: CustomEvent<string[]>): Promise<void> {
|
||||||
|
const nextKeys = new Set(e.detail)
|
||||||
|
const prevKeys = new Set(persistedSelectedKeys)
|
||||||
|
const toEnable = [...nextKeys].filter((k) => !prevKeys.has(k))
|
||||||
|
const toDisable = [...prevKeys].filter((k) => !nextKeys.has(k))
|
||||||
|
|
||||||
|
if (toEnable.length === 0 && toDisable.length === 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
saving = true
|
||||||
|
try {
|
||||||
|
const ops: Array<Promise<unknown>> = []
|
||||||
|
for (const key of toEnable) {
|
||||||
|
const doc = docById.get(key)
|
||||||
|
if (doc === undefined) continue
|
||||||
|
const roles = setWorkspaceGuestAutoJoinRoles(doc.autoJoinForRoles, true)
|
||||||
|
const autoJoinForRoles = normalizeAutoJoinForRoles(roles)
|
||||||
|
if (autoJoinForRoles === undefined) {
|
||||||
|
ops.push(client.update(doc, { $unset: { autoJoinForRoles: true } } as any))
|
||||||
|
} else {
|
||||||
|
ops.push(client.diffUpdate(doc, { autoJoinForRoles }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of toDisable) {
|
||||||
|
const doc = docById.get(key)
|
||||||
|
if (doc === undefined) continue
|
||||||
|
const roles = setWorkspaceGuestAutoJoinRoles(doc.autoJoinForRoles, false)
|
||||||
|
const autoJoinForRoles = normalizeAutoJoinForRoles(roles)
|
||||||
|
if (autoJoinForRoles === undefined) {
|
||||||
|
ops.push(client.update(doc, { $unset: { autoJoinForRoles: true } } as any))
|
||||||
|
} else {
|
||||||
|
ops.push(client.diffUpdate(doc, { autoJoinForRoles }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await Promise.all(ops)
|
||||||
|
selectedKeys = [...nextKeys].sort()
|
||||||
|
persistedSelectedKeys = [...selectedKeys]
|
||||||
|
} catch (err) {
|
||||||
|
Analytics.handleError(err as Error)
|
||||||
|
selectedKeys = [...persistedSelectedKeys]
|
||||||
|
await loadSpaces()
|
||||||
|
} finally {
|
||||||
|
saving = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$: if (group._id !== loadedGroupId) {
|
||||||
|
loadedGroupId = group._id
|
||||||
|
void loadSpaces()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<DropdownLabels
|
||||||
|
multiselect
|
||||||
|
autoSelect={false}
|
||||||
|
items={dropdownItems}
|
||||||
|
selected={[...(selectedKeys ?? [])]}
|
||||||
|
label={settingsRes.string.GuestAutoJoinAvailableSpaces}
|
||||||
|
showDropdownIcon
|
||||||
|
kind={'no-border'}
|
||||||
|
size={'large'}
|
||||||
|
width={'min(18rem, 100%)'}
|
||||||
|
disabled={disabled || loading || saving || dropdownItems.length === 0}
|
||||||
|
loading={saving}
|
||||||
|
on:selected={handleSelected}
|
||||||
|
/>
|
||||||
@@ -48,6 +48,7 @@
|
|||||||
} from '@hcengineering/ui'
|
} from '@hcengineering/ui'
|
||||||
import setting from '@hcengineering/setting'
|
import setting from '@hcengineering/setting'
|
||||||
import { onMount } from 'svelte'
|
import { onMount } from 'svelte'
|
||||||
|
import AvailableSpacesInput from './AvailableSpacesInput.svelte'
|
||||||
import settingsRes from '../plugin'
|
import settingsRes from '../plugin'
|
||||||
|
|
||||||
let loadingSettings = true
|
let loadingSettings = true
|
||||||
@@ -244,6 +245,14 @@
|
|||||||
allowGuestSignUp = e.detail
|
allowGuestSignUp = e.detail
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onReadonlyGuestsToggle (e: CustomEvent<boolean>): void {
|
||||||
|
void handleToggleReadonlyAccess(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onGuestSignUpToggle (e: CustomEvent<boolean>): void {
|
||||||
|
void handleToggleGuestSignUp(e)
|
||||||
|
}
|
||||||
|
|
||||||
async function onAllowedCardsChange (value: Ref<Card>[]): Promise<void> {
|
async function onAllowedCardsChange (value: Ref<Card>[]): Promise<void> {
|
||||||
if (existingGuestChatSettings === undefined) {
|
if (existingGuestChatSettings === undefined) {
|
||||||
await client.createDoc(communication.class.GuestCommunicationSettings, core.space.Workspace, {
|
await client.createDoc(communication.class.GuestCommunicationSettings, core.space.Workspace, {
|
||||||
@@ -317,12 +326,7 @@
|
|||||||
<Label label={settingsRes.string.GuestAccessDescription} />
|
<Label label={settingsRes.string.GuestAccessDescription} />
|
||||||
</div>
|
</div>
|
||||||
<div class="guestAccessRow-toggleCell">
|
<div class="guestAccessRow-toggleCell">
|
||||||
<Toggle
|
<Toggle on={allowReadOnlyGuests} on:change={onReadonlyGuestsToggle} />
|
||||||
on={allowReadOnlyGuests}
|
|
||||||
on:change={(e) => {
|
|
||||||
void handleToggleReadonlyAccess(e)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="guestAccessRow">
|
<div class="guestAccessRow">
|
||||||
@@ -330,13 +334,7 @@
|
|||||||
<Label label={settingsRes.string.GuestSignUpDescription} />
|
<Label label={settingsRes.string.GuestSignUpDescription} />
|
||||||
</div>
|
</div>
|
||||||
<div class="guestAccessRow-toggleCell">
|
<div class="guestAccessRow-toggleCell">
|
||||||
<Toggle
|
<Toggle disabled={!allowReadOnlyGuests} on={allowGuestSignUp} on:change={onGuestSignUpToggle} />
|
||||||
disabled={!allowReadOnlyGuests}
|
|
||||||
on={allowGuestSignUp}
|
|
||||||
on:change={(e) => {
|
|
||||||
void handleToggleGuestSignUp(e)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#if communicationApiEnabled}
|
{#if communicationApiEnabled}
|
||||||
@@ -376,6 +374,14 @@
|
|||||||
<Label label={setting.string.GuestPermissionsApplicationPermissionsHint} />
|
<Label label={setting.string.GuestPermissionsApplicationPermissionsHint} />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
{#if guestPermissionsTab === 'guest'}
|
||||||
|
<div class="sectionHint">
|
||||||
|
<Label label={core.string.AutoJoinGuestsDescr} />
|
||||||
|
</div>
|
||||||
|
<div class="sectionHint">
|
||||||
|
<Label label={settingsRes.string.GuestAutoJoinAvailableSpacesHint} />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="cardStack" class:cardStack-readonly={anonymousModulePermissionsReadOnly}>
|
<div class="cardStack" class:cardStack-readonly={anonymousModulePermissionsReadOnly}>
|
||||||
@@ -383,10 +389,15 @@
|
|||||||
{@const app = getApplication(group.application)}
|
{@const app = getApplication(group.application)}
|
||||||
{@const moduleOn = isModuleEnabled(group)}
|
{@const moduleOn = isModuleEnabled(group)}
|
||||||
{@const permissionCount = (group.permissions ?? []).length}
|
{@const permissionCount = (group.permissions ?? []).length}
|
||||||
|
{@const hasGuestAutoJoinRow =
|
||||||
|
guestPermissionsTab === 'guest' &&
|
||||||
|
group.role === AccountRole.Guest &&
|
||||||
|
group.spaceClass !== undefined}
|
||||||
|
{@const hasPermissionRowsBlock = permissionCount > 0 || hasGuestAutoJoinRow}
|
||||||
<div class="permissionModuleCard" class:permissionModuleCard-off={!moduleOn}>
|
<div class="permissionModuleCard" class:permissionModuleCard-off={!moduleOn}>
|
||||||
<div
|
<div
|
||||||
class="permissionModuleCard-header"
|
class="permissionModuleCard-header"
|
||||||
class:permissionModuleCard-headerOnly={permissionCount === 0}
|
class:permissionModuleCard-headerOnly={!hasPermissionRowsBlock}
|
||||||
>
|
>
|
||||||
<div class="permissionModuleCard-headerMain">
|
<div class="permissionModuleCard-headerMain">
|
||||||
{#if app}
|
{#if app}
|
||||||
@@ -411,22 +422,37 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if permissionCount > 0}
|
{#if hasPermissionRowsBlock}
|
||||||
<div class="permissionRows">
|
<div class="permissionRows">
|
||||||
{#each group.permissions ?? [] as permissionId}
|
{#if permissionCount > 0}
|
||||||
<div class="permissionRow">
|
{#each group.permissions ?? [] as permissionId}
|
||||||
<div class="permissionRow-label">
|
<div class="permissionRow">
|
||||||
<Label label={getPermissionLabel(permissionId)} />
|
<div class="permissionRow-label">
|
||||||
|
<Label label={getPermissionLabel(permissionId)} />
|
||||||
|
</div>
|
||||||
|
<div class="permissionRow-toggleCell">
|
||||||
|
<Toggle
|
||||||
|
disabled={!moduleOn || anonymousModulePermissionsReadOnly}
|
||||||
|
on={isPermissionActive(group, permissionId)}
|
||||||
|
on:change={handlePermissionToggle(group, permissionId)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="permissionRow-toggleCell">
|
{/each}
|
||||||
<Toggle
|
{/if}
|
||||||
|
{#if hasGuestAutoJoinRow}
|
||||||
|
<div class="permissionRow permissionRow--guestSpaces">
|
||||||
|
<div class="permissionRow-label">
|
||||||
|
<Label label={settingsRes.string.GuestAutoJoinAvailableSpaces} />
|
||||||
|
</div>
|
||||||
|
<div class="permissionRow-editorCell">
|
||||||
|
<AvailableSpacesInput
|
||||||
|
{group}
|
||||||
disabled={!moduleOn || anonymousModulePermissionsReadOnly}
|
disabled={!moduleOn || anonymousModulePermissionsReadOnly}
|
||||||
on={isPermissionActive(group, permissionId)}
|
|
||||||
on:change={handlePermissionToggle(group, permissionId)}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/each}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
@@ -644,6 +670,24 @@
|
|||||||
color: var(--theme-content-color);
|
color: var(--theme-content-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.permissionRow--guestSpaces {
|
||||||
|
align-items: start;
|
||||||
|
min-height: auto;
|
||||||
|
padding-top: 0.75rem;
|
||||||
|
padding-bottom: 0.75rem;
|
||||||
|
grid-template-columns: minmax(0, 1fr) minmax(8rem, max-content);
|
||||||
|
}
|
||||||
|
|
||||||
|
.permissionRow--guestSpaces .permissionRow-editorCell {
|
||||||
|
grid-column: 2;
|
||||||
|
justify-self: end;
|
||||||
|
align-self: start;
|
||||||
|
width: max-content;
|
||||||
|
max-width: min(18rem, calc(100vw - 4rem));
|
||||||
|
min-width: 0;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
.emptyState {
|
.emptyState {
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
color: var(--theme-halfcontent-color);
|
color: var(--theme-halfcontent-color);
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ export default mergeIds(settingId, setting, {
|
|||||||
GuestSignUpDescription: '' as IntlString,
|
GuestSignUpDescription: '' as IntlString,
|
||||||
GuestChannelsDescription: '' as IntlString,
|
GuestChannelsDescription: '' as IntlString,
|
||||||
GuestChannelsArrayLabel: '' as IntlString,
|
GuestChannelsArrayLabel: '' as IntlString,
|
||||||
|
GuestAutoJoinAvailableSpaces: '' as IntlString,
|
||||||
|
GuestAutoJoinAvailableSpacesHint: '' as IntlString,
|
||||||
ApiAccess: '' as IntlString,
|
ApiAccess: '' as IntlString,
|
||||||
ApiToken: '' as IntlString,
|
ApiToken: '' as IntlString,
|
||||||
GenerateApiToken: '' as IntlString,
|
GenerateApiToken: '' as IntlString,
|
||||||
|
|||||||
Reference in New Issue
Block a user