From 2bc968295d8b46a02184324178714d9fd1172ae1 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Mon, 6 Apr 2026 19:32:07 +0500 Subject: [PATCH 1/5] Add automationOnly flag to associations and restrict manual management in UI (#10730) Signed-off-by: Denis Bykhov --- foundations/core/packages/core/src/classes.ts | 1 + models/core/src/core.ts | 2 ++ .../src/components/AssociationEditor.svelte | 18 +++++++++++++++--- .../src/components/CreateRelation.svelte | 13 +++++++++++-- .../src/components/EditRelation.svelte | 12 ++++++++++-- .../src/components/RelationEditor.svelte | 18 ++++++++++++------ 6 files changed, 51 insertions(+), 13 deletions(-) diff --git a/foundations/core/packages/core/src/classes.ts b/foundations/core/packages/core/src/classes.ts index 57c92ef3a3..2b8c9954cf 100644 --- a/foundations/core/packages/core/src/classes.ts +++ b/foundations/core/packages/core/src/classes.ts @@ -139,6 +139,7 @@ export interface Association extends Doc { nameA: string nameB: string type: '1:1' | '1:N' | 'N:N' + automationOnly?: boolean } /** diff --git a/models/core/src/core.ts b/models/core/src/core.ts index 71f69cff51..0866c91bb7 100644 --- a/models/core/src/core.ts +++ b/models/core/src/core.ts @@ -150,6 +150,8 @@ export class TAssociation extends TDoc implements Association { nameB!: string type!: '1:1' | '1:N' | 'N:N' + + automationOnly?: boolean } @Model(core.class.Relation, core.class.Doc, DOMAIN_RELATION) diff --git a/plugins/setting-resources/src/components/AssociationEditor.svelte b/plugins/setting-resources/src/components/AssociationEditor.svelte index 1787023368..473b890232 100644 --- a/plugins/setting-resources/src/components/AssociationEditor.svelte +++ b/plugins/setting-resources/src/components/AssociationEditor.svelte @@ -24,7 +24,8 @@ DropdownLabelsIntl, EditBox, Label, - NestedDropdown + NestedDropdown, + Toggle } from '@hcengineering/ui' import view from '@hcengineering/view' import card from '@hcengineering/card' @@ -96,6 +97,7 @@ let classBRef: Ref> | undefined = undefined let nameA = association.nameA let nameB = association.nameB + let automationOnly = association.automationOnly ?? false $: classA = isEmptyClass(classARef) ? undefined : hierarchy.getClass(classARef as Ref>) $: classB = isEmptyClass(classBRef) ? undefined : hierarchy.getClass(classBRef as Ref>) @@ -113,6 +115,7 @@ classARef = !isEmptyClass(association.classA) ? association.classA : undefined nameA = association.nameA nameB = association.nameB + automationOnly = association.automationOnly ?? false } function isAssociation (data: Data | Association): data is Association { @@ -128,7 +131,8 @@ if (association !== undefined && isAssociation(association)) { await client.diffUpdate(association, { nameA, - nameB + nameB, + automationOnly }) } else { await client.createDoc(core.class.Association, core.space.Model, { @@ -136,7 +140,8 @@ classB: classBRef, type: mode, nameA, - nameB + nameB, + automationOnly }) dispatch('create') dispatch('close') @@ -224,6 +229,13 @@ {/if} + +
+ + + +
diff --git a/plugins/setting-resources/src/components/CreateRelation.svelte b/plugins/setting-resources/src/components/CreateRelation.svelte index 966d55b2f6..d616ffb526 100644 --- a/plugins/setting-resources/src/components/CreateRelation.svelte +++ b/plugins/setting-resources/src/components/CreateRelation.svelte @@ -17,7 +17,7 @@ import core, { Class, Doc, Ref } from '@hcengineering/core' import { getEmbeddedLabel } from '@hcengineering/platform' import presentation, { Card, getClient } from '@hcengineering/presentation' - import { DropdownIntlItem, DropdownLabelsIntl, EditBox, Label, NestedDropdown } from '@hcengineering/ui' + import { DropdownIntlItem, DropdownLabelsIntl, EditBox, Label, NestedDropdown, Toggle } from '@hcengineering/ui' import view from '@hcengineering/view' import { createEventDispatcher } from 'svelte' import setting from '../plugin' @@ -96,6 +96,7 @@ let classBRef: Ref> | undefined = undefined let nameA: string = '' let nameB: string = '' + let automationOnly = false async function save (): Promise { if (classBRef === undefined || classARef === undefined) { @@ -106,7 +107,8 @@ classB: classBRef, type: mode, nameA, - nameB + nameB, + automationOnly }) dispatch('close', _id) } @@ -200,5 +202,12 @@ />
+ +
+ + + +
diff --git a/plugins/setting-resources/src/components/EditRelation.svelte b/plugins/setting-resources/src/components/EditRelation.svelte index 3ed5c3a1fd..b3cf303e67 100644 --- a/plugins/setting-resources/src/components/EditRelation.svelte +++ b/plugins/setting-resources/src/components/EditRelation.svelte @@ -16,7 +16,7 @@ import core, { Association } from '@hcengineering/core' import { getEmbeddedLabel, IntlString } from '@hcengineering/platform' import presentation, { getClient, MessageBox } from '@hcengineering/presentation' - import { Button, DropdownIntlItem, EditBox, IconDelete, Label, Modal, showPopup } from '@hcengineering/ui' + import { Button, DropdownIntlItem, EditBox, IconDelete, Label, Modal, showPopup, Toggle } from '@hcengineering/ui' import view from '@hcengineering/view' import setting from '../plugin' import { clearSettingsStore } from '../store' @@ -30,11 +30,13 @@ const classB = hierarchy.getClass(association.classB) let nameA = association.nameA let nameB = association.nameB + let automationOnly = association.automationOnly ?? false async function save (): Promise { await client.diffUpdate(association, { nameA, - nameB + nameB, + automationOnly }) clearSettingsStore() } @@ -108,5 +110,11 @@ +
+ + + +
diff --git a/plugins/view-resources/src/components/RelationEditor.svelte b/plugins/view-resources/src/components/RelationEditor.svelte index b8aa18ad4e..f82e9ef06a 100644 --- a/plugins/view-resources/src/components/RelationEditor.svelte +++ b/plugins/view-resources/src/components/RelationEditor.svelte @@ -82,17 +82,23 @@ : { docA: doc._id, docB: object._id, association: association._id } const relation = await client.findOne(core.class.Relation, q) const overrides = new Map() + const excludedActions: string[] = [] if (relation !== undefined) { - overrides.set(view.action.Delete, async (obj: Doc | Doc[], ev?: Event) => { - if (relation !== undefined) { - await client.remove(relation) - } - }) + if (association.automationOnly) { + excludedActions.push(view.action.Delete) + } else { + overrides.set(view.action.Delete, async (obj: Doc | Doc[], ev?: Event) => { + if (relation !== undefined) { + await client.remove(relation) + } + }) + } } - showMenu(ev, { object: doc, overrides }) + showMenu(ev, { object: doc, overrides, excludedActions }) } function isAllowedToCreate (association: Association, docs: Doc[], direction: 'A' | 'B'): boolean { + if (association.automationOnly) return false if (docs.length === 0 || association.type === 'N:N') return true if (association.type === '1:1') return false return direction === 'B' From dae5b8aec33d95aecbec401e02c9bcbc7004115c Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Mon, 6 Apr 2026 21:28:35 +0500 Subject: [PATCH 2/5] Fix subProcessMatchCheck (#10731) Signed-off-by: Denis Bykhov --- plugins/process-resources/src/utils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/process-resources/src/utils.ts b/plugins/process-resources/src/utils.ts index d8545c1f64..db0553edb9 100644 --- a/plugins/process-resources/src/utils.ts +++ b/plugins/process-resources/src/utils.ts @@ -863,9 +863,9 @@ export async function subProcessMatchCheck ( params: Record, context: Record ): Promise { - const { process: _process, ...otherCritera } = params + const { process: _process, currentState } = params if (_process === undefined) return false - if (Object.keys(otherCritera).length === 0) return true + if (currentState === undefined) return true const subProcesses = await client.findAll(process.class.Execution, { parentId: execution._id, @@ -874,18 +874,18 @@ export async function subProcessMatchCheck ( if (subProcesses.length === 0) return false - const [predicate, value] = Object.entries(otherCritera)[0] + const [predicate, value] = Object.entries(currentState)[0] const res = matchQuery( subProcesses, - { currentState: { $in: value } }, + { currentState: { $in: value as any } }, process.class.Execution, client.getHierarchy(), true ) if (predicate === '$all') { return res.length === subProcesses.length - } else if (predicate === '$any') { + } else if (predicate === '$in') { return res.length > 0 } else if (predicate === '$nin') { return res.length === 0 From 4beee5c914df4fd5465d257374915251c4f915a9 Mon Sep 17 00:00:00 2001 From: Artyom Savchenko Date: Mon, 6 Apr 2026 23:28:57 +0700 Subject: [PATCH 3/5] Update dark theme (#10728) Signed-off-by: Artem Savchenko --- packages/theme/styles/_colors.scss | 106 +++++++++++------------ packages/theme/styles/_lumia-colors.scss | 18 ++-- packages/ui/src/colors.ts | 4 +- 3 files changed, 64 insertions(+), 64 deletions(-) diff --git a/packages/theme/styles/_colors.scss b/packages/theme/styles/_colors.scss index 7ef6e0410c..12fb534f6e 100644 --- a/packages/theme/styles/_colors.scss +++ b/packages/theme/styles/_colors.scss @@ -113,10 +113,10 @@ --secondary-button-disabled: rgba(255, 255, 255, .12); --secondary-button-disabled-color: rgba(255, 255, 255, .4); - --theme-button-default: rgba(255, 255, 255, .02); - --theme-button-hovered: rgba(255, 255, 255, .04); - --theme-button-pressed: rgba(255, 255, 255, .08); - --theme-button-focused: rgba(255, 255, 255, .04); + --theme-button-default: rgba(255, 255, 255, .03); + --theme-button-hovered: rgba(255, 255, 255, .07); + --theme-button-pressed: rgba(255, 255, 255, .11); + --theme-button-focused: rgba(255, 255, 255, .07); --theme-button-focused-border: rgba(255, 255, 255, .09); --theme-button-disabled: transparent; --theme-button-border: rgba(255, 255, 255, .09); @@ -125,8 +125,8 @@ --theme-breadcrumb-hovered: rgba(255, 255, 255, .08); --theme-breadcrumb-pressed: rgba(255, 255, 255, .1); --theme-button-icon-default: rgba(255, 255, 255, 0); - --theme-button-icon-hovered: rgba(255, 255, 255, .06); - --theme-button-icon-pressed: rgba(255, 255, 255, .1); + --theme-button-icon-hovered: rgba(255, 255, 255, .08); + --theme-button-icon-pressed: rgba(255, 255, 255, .12); --theme-button-contrast-color: #000; --theme-button-contrast-enabled: rgba(255, 255, 255, .8); @@ -136,7 +136,7 @@ --theme-button-contrast-disabled-color: rgba(0, 0, 0, .5); --theme-button-contrast-border: rgba(255, 255, 255, .2); - --theme-button-container-color: #25262A; + --theme-button-container-color: #22262B; --theme-button-attention-gradient: linear-gradient(135deg, #7C3AED, #A855F7); --theme-button-attention-border: #A855F7; @@ -151,13 +151,13 @@ --theme-refinput-border: rgba(255, 255, 255, .1); // Be aware to update defineAlpha() function in colors.ts - --theme-bg-color: #1A1A28; + --theme-bg-color: #161719; --theme-bg-accent-color: rgba(0, 0, 0, .08); --theme-bg-dark-color: rgba(0, 0, 0, .2); - --theme-back-color: #0f0f18; + --theme-back-color: #0E0F10; --theme-overlay-color: rgba(0, 0, 0, .3); - --theme-statusbar-color: #1A1928; - --theme-navpanel-color: #14141F; + --theme-statusbar-color: #0E0F10; + --theme-navpanel-color: #0E0F10; --theme-navpanel-hovered: rgba(255, 255, 255, .04); --theme-navpanel-selected: rgba(255, 255, 255, .08); --theme-navpanel-divider: rgba(255, 255, 255, .1); @@ -165,9 +165,9 @@ --theme-navpanel-icons-color: #7F7F7F; --theme-navpanel-icons-divider: rgba(255, 255, 255, .11); --theme-navpanel-shadow-mobile: drop-shadow(0 0 3px rgba(0, 0, 0, .5)); - --theme-comp-header-color: #1F1F2C; + --theme-comp-header-color: #1E2024; --theme-divider-color: rgba(255, 255, 255, .06); - --theme-bg-divider-color: #282834; + --theme-bg-divider-color: #22242A; --theme-mention-bg-color: rgba(55, 122, 230, 0.1); --theme-mention-focused-bg-color: rgba(55, 122, 230, 0.2); --theme-broken-mention-color: rgba(255, 255, 255, .4); @@ -184,22 +184,22 @@ --theme-list-border-color: rgba(255, 255, 255, .05); --theme-list-header-color: #C88C65; - --theme-list-subheader-color: #262634; - --theme-list-row-color: #21212F; + --theme-list-subheader-color: #22242A; + --theme-list-row-color: #1D1F23; --theme-list-divider-color: rgba(255, 255, 255, .09); --theme-list-subheader-divider: rgba(255, 255, 255, .06); - --theme-list-button-color: #262633; - --theme-list-button-hover: #2F2F3A; - --theme-link-button-color: #262634; - --theme-link-button-hover: #2F2F3B; + --theme-list-button-color: #22242A; + --theme-list-button-hover: #2A2C32; + --theme-link-button-color: #22242A; + --theme-link-button-hover: #2A2C33; --theme-table-border-color: rgba(255, 255, 255, .1); - --theme-table-header-color: #1C1C29; - --theme-table-row-color: #21212F; + --theme-table-header-color: #1A1C20; + --theme-table-row-color: #1D1F23; - --theme-kanban-card-bg-color: rgba(222, 222, 240, .04); - --theme-kanban-card-border: transparent; + --theme-kanban-card-bg-color: rgba(222, 222, 240, .055); + --theme-kanban-card-border: rgba(255, 255, 255, .06); --theme-kanban-card-footer: rgba(217, 217, 217, .07); --theme-editbox-focus-color: rgba(255, 255, 255, .04); @@ -212,16 +212,16 @@ --theme-checkbox-border: rgba(0, 0, 0, .12); --theme-checkbox-disabled: #999; --theme-progress-color: #FFFFFF; - --theme-popup-color: #2A2939; - --theme-popup-trans-color: #2A2939ee; - --theme-popup-trans-gradient: linear-gradient(to bottom, #2A2939ff, #2A293900); - --theme-popup-hover: #333240; - --theme-popup-divider: rgba(255, 255, 255, .09); - --theme-popup-header: #3A3A47; + --theme-popup-color: #1F2328; + --theme-popup-trans-color: #1F2328ee; + --theme-popup-trans-gradient: linear-gradient(to bottom, #1F2328ff, #1F232800); + --theme-popup-hover: #2C3139; + --theme-popup-divider: rgba(255, 255, 255, .08); + --theme-popup-header: #323842; --theme-popup-shadow: 0 0 .5rem rgba(0, 0, 0, .2); --theme-popup-checkicon: #FFFFFF99; - --theme-popup-deactivated: #1A1A28; - --theme-panel-color: #1A1A28; + --theme-popup-deactivated: #161719; + --theme-panel-color: #161719; --theme-calendar-today-color: #fff; --theme-calendar-holiday-color: #eb5757; --theme-calendar-weekend-color: rgba(242, 153, 74, 1); @@ -245,17 +245,17 @@ --theme-diffview-delete-color: rgb(248, 81, 73); --theme-tooltip-color: rgba(255, 255, 255, .8); - --theme-tooltip-bg: #353347; + --theme-tooltip-bg: #2C3139; --theme-tooltip-key-bg: rgba(255, 255, 255, .08); --theme-inbox-notify: #F47758; --theme-inbox-people-notify: #2B5190; - --theme-inbox-activity-bgcolor: #1A1A28; + --theme-inbox-activity-bgcolor: #0E0F10; --theme-inbox-activitymsg-bgcolor: rgba(255, 255, 255, .03); --theme-inbox-activitymsg-divider: rgba(255, 255, 255, .1); --theme-inbox-activitymsg-border: rgba(255, 255, 255, .03); --theme-inbox-counter-bgcolor: rgba(255, 255, 255, .06); - --theme-inbox-people-counter-bgcolor: rgba(43, 81, 144, .1); + --theme-inbox-people-counter-bgcolor: rgba(32, 93, 194, .14); --theme-toggle-sw-color: #fff; --theme-toggle-on-sw-color: #fff; @@ -309,13 +309,13 @@ --theme-text-editor-palette-bg-pink: rgba(78, 44, 60, 1); --theme-text-editor-palette-bg-red:rgba(82, 46, 42, 1); - --accent-bg-color: #27282b; + --accent-bg-color: #22262B; --accent-shadow: rgb(0 0 0 / 10%) 0px 2px 4px; - --highlight-hover: #282834; - --highlight-select: #252b3a; - --highlight-select-border: #44506b; - --highlight-select-hover: #2c3346; + --highlight-hover: #2A2E34; + --highlight-select: #2C3139; + --highlight-select-border: #3D4450; + --highlight-select-hover: #323842; --scrollbar-bar-color: #35354a; --scrollbar-bar-hover: #8a8aa5; @@ -330,13 +330,13 @@ --divider-color: #303236; --divider-trans-color: rgba(255, 255, 255, .12); - --menu-bg-select: #2d2f36; - --menu-bg-select-trans: #2d2f3665; + --menu-bg-select: #2C3139; + --menu-bg-select-trans: #2C313965; --menu-icon-hover: #f3f3f8; - --header-bg-color: linear-gradient(0deg, var(--accent-bg-color), #2d2e31); - --popup-bg-color: linear-gradient(136.61deg, var(--accent-bg-color) 13.72%, #2d2e31 74.3%); - --popup-bg-hover: #37373c; - --popup-divider: #313236; + --header-bg-color: linear-gradient(0deg, var(--accent-bg-color), #2A2E34); + --popup-bg-color: linear-gradient(136.61deg, var(--accent-bg-color) 13.72%, #2C3139 74.3%); + --popup-bg-hover: #323842; + --popup-divider: #2E333C; --popup-shadow: rgb(0 0 0 / 50%) 0px 4px 24px; --popup-panel-shadow: rgb(0 0 0 / 55%) 0px 7px 24px; --popup-aside-shadow: rgb(0 0 0 / 25%) 0px 8px 16px; @@ -381,28 +381,28 @@ --theme-clockface-arrows-holder: radial-gradient(at top center, #2F2F3A, #555555); --theme-clockface-arrows-shadow: 0 0 1px white; - --theme-link-preview-bg-color: #2B2D41; + --theme-link-preview-bg-color: #252A32; --theme-link-preview-description-color: #C1C9D6; --theme-link-preview-text-color:#FFFFFF; --theme-dialog-border-color: rgba(255, 255, 255, 0.1); - --theme-dialog-background-color: #2a2938; + --theme-dialog-background-color: #1F2328; --theme-dialog-back-color: #848484; --theme-icon-stroke: #e8e9e9; --theme-state-ghost-color: rgba(123, 123, 123, 0.6); --theme-state-ghost-background-color: rgba(123, 123, 123, 0.1); --theme-state-ghost-border-color: transparent; - --theme-state-primary-color: #3070dc; - --theme-state-primary-background-color: rgba(48, 112, 220, 0.1); - --theme-state-primary-border-color: rgba(48, 112, 220, 0.15); + --theme-state-primary-color: #377AE6; + --theme-state-primary-background-color: rgba(55, 122, 230, 0.14); + --theme-state-primary-border-color: rgba(55, 122, 230, 0.26); --theme-state-regular-color: #7b7b7b; --theme-state-regular-background-color: rgba(123, 123, 123, 0.1); --theme-state-regular-border-color: rgba(123, 123, 123, 0.15); --theme-wizard-not-visited-color: #34343c; - --calendar-event-back-color: #2B2D41; - --calendar-event-border-color: rgba(43, 81, 144, 0.2); - --calendar-event-handle-color: #2b5190; + --calendar-event-back-color: #252A32; + --calendar-event-border-color: rgba(55, 122, 230, 0.28); + --calendar-event-handle-color: #205DC2; --theme-label-green-color: rgba(34, 197, 94, .8); --theme-label-green-bg-color: rgba(34, 197, 94, .08); diff --git a/packages/theme/styles/_lumia-colors.scss b/packages/theme/styles/_lumia-colors.scss index 541ce1e218..37832da0c9 100644 --- a/packages/theme/styles/_lumia-colors.scss +++ b/packages/theme/styles/_lumia-colors.scss @@ -49,17 +49,17 @@ --global-ui-active-BackgroundColor: #A5BDFF26; --global-ui-highlight-BackgroundColor: #A5BDFF0D; --global-ui-hover-highlight-BackgroundColor: #A5BDFF26; - --global-surface-01-BackgroundColor: #131925; + --global-surface-01-BackgroundColor: #0E0F10; --global-surface-01-BorderColor: #1F2737; - --global-surface-01-hover-BackgroundColor: #19202E; - --global-surface-02-BackgroundColor: #19202E; + --global-surface-01-hover-BackgroundColor: #121314; + --global-surface-02-BackgroundColor: #161719; --global-surface-02-BorderColor: #262F40; - --global-surface-03-hover-BackgroundColor: #19202E; + --global-surface-03-hover-BackgroundColor: #1A1C1F; --global-subtle-ui-BorderColor: #A5BDFF0D; --global-subtle-BackgroundColor: #072790; - --global-popover-BackgroundColor: #262F40; - --global-popover-hover-BackgroundColor: #1F2737; - --global-popover-BorderColor: #A5BDFF1A; + --global-popover-BackgroundColor: #1F2328; + --global-popover-hover-BackgroundColor: #2C3139; + --global-popover-BorderColor: #FFFFFF14; --global-primary-LinkColor: #4D7FF5; --global-primary-IconColor: #ffffff; --global-primary-TextColor: #FFFFFF; @@ -73,7 +73,7 @@ --global-popover-ShadowColor: #0E131E59; --global-modal-ShadowColor: #0E131E73; --global-accent-SkyText: #B9D1F5; - --global-accent-BackgroundColor: #204DC8; + --global-accent-BackgroundColor: #205DC2; --global-on-nuance-TextColor: #041d7d; --global-no-priority-PriorityColor: #8E99AF; @@ -91,7 +91,7 @@ --icon-disabled-IconColor: #394358; - --border-talk-indication-secondary: #25262A; + --border-talk-indication-secondary: #22262B; /** Buttons **/ --button-subtle-LabelColor: #fff; diff --git a/packages/ui/src/colors.ts b/packages/ui/src/colors.ts index f84d218e60..cd3ffd7899 100644 --- a/packages/ui/src/colors.ts +++ b/packages/ui/src/colors.ts @@ -212,7 +212,7 @@ export const avatarDarkColors = Object.freeze([ ]) export function defaultBackground (dark: boolean): string { - return dark ? 'linear-gradient(90deg, #262634, #1A1A28)' : '#FFFFFF' + return dark ? 'linear-gradient(90deg, #22242A, #161719)' : '#FFFFFF' } export const FeijoaColor = '#A5D179' @@ -418,7 +418,7 @@ export function defineAlpha (dark: boolean, color: string, percent = 100): strin const p1 = percent / 100 - const bg = dark ? hexToRgb('#1A1A28') : hexToRgb('#F1F1F4') + const bg = dark ? hexToRgb('#161719') : hexToRgb('#F1F1F4') return rgbToHex({ r: r * p1 + bg.r * (1 - p1), From d0b27dce72c1db97ddc7ac784d8ecd903d548e4c Mon Sep 17 00:00:00 2001 From: Artyom Savchenko Date: Mon, 6 Apr 2026 23:29:11 +0700 Subject: [PATCH 4/5] feat: Anonymous guest permissions (#10726) * Anonymous guest permissions Signed-off-by: Artem Savchenko * Fix channels dropdown Signed-off-by: Artem Savchenko * Update guest layout Signed-off-by: Artem Savchenko --------- Signed-off-by: Artem Savchenko --- dev/docker-compose.yaml | 2 +- dev/prod/public/config.json | 2 +- models/card/src/index.ts | 14 + models/chunter/src/index.ts | 14 + models/chunter/src/plugin.ts | 3 +- models/controlled-documents/src/index.ts | 14 + models/controlled-documents/src/plugin.ts | 3 +- models/document/src/index.ts | 14 + models/document/src/plugin.ts | 3 +- models/drive/src/index.ts | 14 + models/drive/src/plugin.ts | 3 +- models/love/src/index.ts | 14 + models/love/src/plugin.ts | 3 +- models/test-management/src/index.ts | 14 + models/test-management/src/plugin.ts | 3 +- models/tracker/src/index.ts | 14 + models/tracker/src/plugin.ts | 1 + models/training/src/index.ts | 14 + models/training/src/plugin.ts | 3 +- .../ui/src/components/SwitcherBase.svelte | 5 +- plugins/card/src/index.ts | 3 +- plugins/setting-assets/lang/cs.json | 9 +- plugins/setting-assets/lang/de.json | 9 +- plugins/setting-assets/lang/en.json | 9 +- plugins/setting-assets/lang/es.json | 9 +- plugins/setting-assets/lang/fr.json | 9 +- plugins/setting-assets/lang/it.json | 9 +- plugins/setting-assets/lang/ja.json | 9 +- plugins/setting-assets/lang/pt-br.json | 9 +- plugins/setting-assets/lang/pt.json | 9 +- plugins/setting-assets/lang/ru.json | 9 +- plugins/setting-assets/lang/tr.json | 9 +- plugins/setting-assets/lang/zh.json | 9 +- .../src/components/General.svelte | 118 +---- .../GuestPermissionsSettings.svelte | 441 ++++++++++++++---- plugins/setting/src/index.ts | 7 +- .../src/components/Applications.svelte | 4 +- 37 files changed, 588 insertions(+), 250 deletions(-) diff --git a/dev/docker-compose.yaml b/dev/docker-compose.yaml index 0491c0f304..fe928696fb 100644 --- a/dev/docker-compose.yaml +++ b/dev/docker-compose.yaml @@ -310,7 +310,7 @@ services: - PAYMENT_URL=http://huly.local:3040 - COMMUNICATION_API_ENABLED=true - BACKUP_URL=http://huly.local:4039/api/backup, - - EXCLUDED_APPLICATIONS_FOR_ANONYMOUS=["chunter", "notification"] + - EXCLUDED_APPLICATIONS_FOR_ANONYMOUS=[] # - DISABLE_SIGNUP=true - OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318/v1/traces - PULSE_URL=ws://huly.local:8099/ws diff --git a/dev/prod/public/config.json b/dev/prod/public/config.json index c339391708..a074414bee 100644 --- a/dev/prod/public/config.json +++ b/dev/prod/public/config.json @@ -30,7 +30,7 @@ "BACKUP_URL": "http://huly.local:4039/api/backup", "PULSE_URL": "ws://huly.local:8099/ws", "HULYLAKE_URL": "http://huly.local:8096", - "EXCLUDED_APPLICATIONS_FOR_ANONYMOUS": "[\"chunter\", \"notification\"]", + "EXCLUDED_APPLICATIONS_FOR_ANONYMOUS": "[]", "ANALYTICS_COLLECTOR_URL": "http://huly.local:4017", "LINK_PREVIEW_URL": "http://huly.local:4041" } diff --git a/models/card/src/index.ts b/models/card/src/index.ts index 9fb5c5afcc..8294d46d21 100644 --- a/models/card/src/index.ts +++ b/models/card/src/index.ts @@ -947,6 +947,20 @@ export function createModel (builder: Builder): void { card.ids.ModulePermissionGroup ) + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: card.app.Card, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: card.class.CardSpace, + enabled: false, + order: 20 + }, + card.ids.ModulePermissionGroupReadOnlyGuest + ) + builder.mixin(card.class.Card, core.class.Class, view.mixin.ClassFilters, { filters: ['space'], ignoreKeys: ['parent'] diff --git a/models/chunter/src/index.ts b/models/chunter/src/index.ts index 41c0cb6cff..420d973a85 100644 --- a/models/chunter/src/index.ts +++ b/models/chunter/src/index.ts @@ -83,6 +83,20 @@ export function createModel (builder: Builder): void { chunter.ids.ModulePermissionGroup ) + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: chunter.app.Chunter, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: chunter.class.ChunterSpace, + enabled: true, + order: 15 + }, + chunter.ids.ModulePermissionGroupReadOnlyGuest + ) + builder.createDoc( workbench.class.Widget, core.space.Model, diff --git a/models/chunter/src/plugin.ts b/models/chunter/src/plugin.ts index 7bffa1ca41..bc3c922bd5 100644 --- a/models/chunter/src/plugin.ts +++ b/models/chunter/src/plugin.ts @@ -95,7 +95,8 @@ export default mergeIds(chunterId, chunter, { }, ids: { ChunterNotificationGroup: '' as Ref, - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref }, space: { General: '' as Ref, diff --git a/models/controlled-documents/src/index.ts b/models/controlled-documents/src/index.ts index be34b62b2c..c60a24f062 100644 --- a/models/controlled-documents/src/index.ts +++ b/models/controlled-documents/src/index.ts @@ -1124,6 +1124,20 @@ export function createModel (builder: Builder): void { }, documents.ids.ModulePermissionGroup ) + + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: documents.app.Documents, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: documents.class.OrgSpace, + enabled: false, + order: 42 + }, + documents.ids.ModulePermissionGroupReadOnlyGuest + ) definePermissions(builder) defineNotifications(builder) defineSearch(builder) diff --git a/models/controlled-documents/src/plugin.ts b/models/controlled-documents/src/plugin.ts index ccf4155a91..4081905158 100644 --- a/models/controlled-documents/src/plugin.ts +++ b/models/controlled-documents/src/plugin.ts @@ -93,6 +93,7 @@ export default mergeIds(documentsId, documents, { StateNotification: '' as Ref }, ids: { - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref } }) diff --git a/models/document/src/index.ts b/models/document/src/index.ts index 285f46bdd5..380a7efffd 100644 --- a/models/document/src/index.ts +++ b/models/document/src/index.ts @@ -553,6 +553,20 @@ export function createModel (builder: Builder): void { }, document.ids.ModulePermissionGroup ) + + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: document.app.Documents, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: document.class.Teamspace, + enabled: false, + order: 40 + }, + document.ids.ModulePermissionGroupReadOnlyGuest + ) definePermissions(builder) builder.createDoc(core.class.DomainIndexConfiguration, core.space.Model, { diff --git a/models/document/src/plugin.ts b/models/document/src/plugin.ts index 71344870c2..97760535e6 100644 --- a/models/document/src/plugin.ts +++ b/models/document/src/plugin.ts @@ -62,7 +62,8 @@ export default mergeIds(documentId, document, { Other: '' as Ref }, ids: { - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref }, string: { ConfigDescription: '' as IntlString, diff --git a/models/drive/src/index.ts b/models/drive/src/index.ts index c0a1e39922..35b23ed18d 100644 --- a/models/drive/src/index.ts +++ b/models/drive/src/index.ts @@ -855,5 +855,19 @@ export function createModel (builder: Builder): void { }, drive.ids.ModulePermissionGroup ) + + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: drive.app.Drive, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: drive.class.Drive, + enabled: false, + order: 60 + }, + drive.ids.ModulePermissionGroupReadOnlyGuest + ) definePermissions(builder) } diff --git a/models/drive/src/plugin.ts b/models/drive/src/plugin.ts index aee47f4d9c..36e73ed91e 100644 --- a/models/drive/src/plugin.ts +++ b/models/drive/src/plugin.ts @@ -102,7 +102,8 @@ export default mergeIds(driveId, drive, { RestoreFileVersion: '' as ViewAction }, ids: { - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref }, string: { Grid: '' as IntlString, diff --git a/models/love/src/index.ts b/models/love/src/index.ts index 0e67856e1d..343c2aa218 100644 --- a/models/love/src/index.ts +++ b/models/love/src/index.ts @@ -280,6 +280,20 @@ export function createModel (builder: Builder): void { love.ids.ModulePermissionGroup ) + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: love.app.Love, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: love.class.Office, + enabled: false, + order: 50 + }, + love.ids.ModulePermissionGroupReadOnlyGuest + ) + builder.createDoc( workbench.class.Widget, core.space.Model, diff --git a/models/love/src/plugin.ts b/models/love/src/plugin.ts index 72acc0f5e4..63ee645f5f 100644 --- a/models/love/src/plugin.ts +++ b/models/love/src/plugin.ts @@ -51,7 +51,8 @@ export default mergeIds(loveId, love, { Settings: '' as Ref, LoveNotificationGroup: '' as Ref, MeetingMinutesChatNotification: '' as Ref, - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref }, function: { MeetingMinutesTitleProvider: '' as Resource<(client: Client, ref: Ref, doc?: Doc) => Promise> diff --git a/models/test-management/src/index.ts b/models/test-management/src/index.ts index 3252a2fc2e..610e3b4798 100644 --- a/models/test-management/src/index.ts +++ b/models/test-management/src/index.ts @@ -216,6 +216,20 @@ export function createModel (builder: Builder): void { testManagement.ids.ModulePermissionGroup ) + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: testManagement.app.TestManagement, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: testManagement.class.TestProject, + enabled: false, + order: 70 + }, + testManagement.ids.ModulePermissionGroupReadOnlyGuest + ) + builder.mixin(testManagement.class.TestCase, core.class.Class, view.mixin.ObjectIcon, { component: testManagement.component.TestCaseStatusPresenter }) diff --git a/models/test-management/src/plugin.ts b/models/test-management/src/plugin.ts index a5d21836c1..9445a77f07 100644 --- a/models/test-management/src/plugin.ts +++ b/models/test-management/src/plugin.ts @@ -50,6 +50,7 @@ export default mergeIds(testManagementId, testManganement, { RunTestPlanButton: '' as AnyComponent }, ids: { - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref } }) diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index 54c2dedd55..44d1b97b50 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -682,6 +682,20 @@ export function createModel (builder: Builder): void { tracker.ids.ModulePermissionGroup ) + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: tracker.app.Tracker, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: tracker.class.Project, + enabled: true, + order: 10 + }, + tracker.ids.ModulePermissionGroupReadOnlyGuest + ) + builder.createDoc( chunter.class.ChatMessageViewlet, core.space.Model, diff --git a/models/tracker/src/plugin.ts b/models/tracker/src/plugin.ts index cd9f7faa15..ac5d0e4601 100644 --- a/models/tracker/src/plugin.ts +++ b/models/tracker/src/plugin.ts @@ -82,6 +82,7 @@ export default mergeIds(trackerId, tracker, { BaseProjectType: '' as Ref, GuestIssueClassPermission: '' as Ref, ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref, IssueUpdatedActivityViewlet: '' as Ref, IssueCreatedActivityViewlet: '' as Ref, IssueRemovedActivityViewlet: '' as Ref, diff --git a/models/training/src/index.ts b/models/training/src/index.ts index 7c612d7ac9..1b531e8506 100644 --- a/models/training/src/index.ts +++ b/models/training/src/index.ts @@ -923,6 +923,20 @@ function defineSettings (builder: Builder): void { }, training.ids.ModulePermissionGroup ) + + builder.createDoc( + core.class.ModulePermissionGroup, + core.space.Model, + { + application: training.app.Training, + role: AccountRole.ReadOnlyGuest, + permissions: [], + spaceClass: core.class.TypedSpace, + enabled: false, + order: 25 + }, + training.ids.ModulePermissionGroupReadOnlyGuest + ) } const columns = { diff --git a/models/training/src/plugin.ts b/models/training/src/plugin.ts index 86071cd6a2..13a33b10a0 100644 --- a/models/training/src/plugin.ts +++ b/models/training/src/plugin.ts @@ -35,7 +35,8 @@ export default mergeIds(trainingId, training, { }, ids: { GuestTrainingAttemptClassPermission: '' as Ref, - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref }, // TODO: Move function resources declarations to plugins/*-resources diff --git a/packages/ui/src/components/SwitcherBase.svelte b/packages/ui/src/components/SwitcherBase.svelte index 47b8c0bc5a..4a8d18b183 100644 --- a/packages/ui/src/components/SwitcherBase.svelte +++ b/packages/ui/src/components/SwitcherBase.svelte @@ -80,10 +80,11 @@ background-color: var(--global-accent-BackgroundColor); .icon { - color: var(--global-on-nuance-TextColor); + color: var(--global-on-accent-TextColor); } span { - color: var(--global-on-nuance-TextColor); + color: var(--global-on-accent-TextColor); + font-weight: 500; } } &:checked + .switcher-element.subtle { diff --git a/plugins/card/src/index.ts b/plugins/card/src/index.ts index 5184d80009..4c8b3924f6 100644 --- a/plugins/card/src/index.ts +++ b/plugins/card/src/index.ts @@ -226,7 +226,8 @@ const cardPlugin = plugin(cardId, { ids: { CardWidget: '' as Ref, GuestCardClassPermission: '' as Ref, - ModulePermissionGroup: '' as Ref + ModulePermissionGroup: '' as Ref, + ModulePermissionGroupReadOnlyGuest: '' as Ref }, component: { LabelsPresenter: '' as AnyComponent, diff --git a/plugins/setting-assets/lang/cs.json b/plugins/setting-assets/lang/cs.json index 9cd84e9c53..72f70c49a2 100644 --- a/plugins/setting-assets/lang/cs.json +++ b/plugins/setting-assets/lang/cs.json @@ -212,9 +212,12 @@ "OfficeDefaultSettings": "Výchozí nastavení pro jednací místnosti", "DefaultStartWithTranscription": "Povolit přepis v nových kancelářích", "DefaultStartWithRecording": "Povolit záznam v nových kancelářích", - "GuestPermissionsSettings": "Oprávnění hostů", - "GuestPermissionsModulePermissions": "Oprávnění modulů", - "GuestPermissionsModulePermissionsHint": "Vyberte, které moduly mohou hosté používat, a níže upravte oprávnění pro jednotlivé aplikace.", + "GuestPermissionsSettings": "Hosté", + "GuestPermissionsApplicationPermissions": "Oprávnění aplikací", + "GuestPermissionsApplicationPermissionsHint": "Vyberte, které aplikace mohou hosté používat, a níže upravte oprávnění pro jednotlivé aplikace.", + "GuestPermissionsTabGuest": "Host", + "GuestPermissionsTabAnonymousGuest": "Anonymní host", + "GuestPermissionsAnonymousApplicationHint": "Přístup k aplikacím pro anonymní (pouze pro čtení) hosty. Které aplikace uvidí, může záviset i na konfiguraci nasazení.", "ImportDocumentPermission": "Importovat dokumenty", "ImportDocumentDescription": "Umožňuje uživatelům importovat dokumenty do pracovního prostoru", "SelectUsers": "Vybrat uživatele", diff --git a/plugins/setting-assets/lang/de.json b/plugins/setting-assets/lang/de.json index 77cfe2c0ba..ed11ae789e 100644 --- a/plugins/setting-assets/lang/de.json +++ b/plugins/setting-assets/lang/de.json @@ -214,9 +214,12 @@ "OfficeDefaultSettings": "Standardeinstellungen für Besprechungsräume", "DefaultStartWithTranscription": "Transkription in neuen Büroräumen aktivieren", "DefaultStartWithRecording": "Aufnahme in neuen Büroräumen aktivieren", - "GuestPermissionsSettings": "Gastberechtigungen", - "GuestPermissionsModulePermissions": "Modulberechtigungen", - "GuestPermissionsModulePermissionsHint": "Wählen Sie, welche Module Gäste nutzen dürfen, und passen Sie unten die Berechtigungen für jede App an.", + "GuestPermissionsSettings": "Gäste", + "GuestPermissionsApplicationPermissions": "Anwendungsberechtigungen", + "GuestPermissionsApplicationPermissionsHint": "Wählen Sie, welche Anwendungen Gäste nutzen dürfen, und passen Sie unten die Berechtigungen für jede Anwendung an.", + "GuestPermissionsTabGuest": "Gast", + "GuestPermissionsTabAnonymousGuest": "Anonymer Gast", + "GuestPermissionsAnonymousApplicationHint": "Anwendungszugriff für anonyme (nur lesende) Gäste. Welche Anwendungen sie sehen, kann auch von der Bereitstellungskonfiguration abhängen.", "ImportDocumentPermission": "Dokumente importieren", "ImportDocumentDescription": "Gewährt Benutzern die Möglichkeit, Dokumente in den Arbeitsbereich zu importieren", "SelectUsers": "Benutzer auswählen", diff --git a/plugins/setting-assets/lang/en.json b/plugins/setting-assets/lang/en.json index 7ec7b53bea..aaaa1636e5 100644 --- a/plugins/setting-assets/lang/en.json +++ b/plugins/setting-assets/lang/en.json @@ -215,9 +215,12 @@ "OfficeDefaultSettings": "Default settings for meeting rooms", "DefaultStartWithTranscription": "Enable transcription in new office rooms", "DefaultStartWithRecording": "Enable recording in new office rooms", - "GuestPermissionsSettings": "Guest permissions", - "GuestPermissionsModulePermissions": "Module permissions", - "GuestPermissionsModulePermissionsHint": "Choose which modules guests can use, then adjust permissions for each app below.", + "GuestPermissionsSettings": "Guests", + "GuestPermissionsApplicationPermissions": "Application permissions", + "GuestPermissionsApplicationPermissionsHint": "Choose which applications guests can use, then adjust permissions for each application below.", + "GuestPermissionsTabGuest": "Guest", + "GuestPermissionsTabAnonymousGuest": "Anonymous guest", + "GuestPermissionsAnonymousApplicationHint": "Application access for anonymous (read-only) guests. Which applications they see can also depend on deployment configuration.", "ImportDocumentPermission": "Import documents", "ImportDocumentDescription": "Grants users ability to import documents into the workspace", "SelectUsers": "Select users", diff --git a/plugins/setting-assets/lang/es.json b/plugins/setting-assets/lang/es.json index de7d47925c..4256f7ee8c 100644 --- a/plugins/setting-assets/lang/es.json +++ b/plugins/setting-assets/lang/es.json @@ -205,9 +205,12 @@ "OfficeDefaultSettings": "Configuración predeterminada para salas de reuniones", "DefaultStartWithTranscription": "Habilitar transcripción en nuevas oficinas", "DefaultStartWithRecording": "Habilitar grabación en nuevas oficinas", - "GuestPermissionsSettings": "Permisos de invitados", - "GuestPermissionsModulePermissions": "Permisos de módulos", - "GuestPermissionsModulePermissionsHint": "Elija qué módulos pueden usar los invitados y luego ajuste los permisos de cada aplicación a continuación.", + "GuestPermissionsSettings": "Invitados", + "GuestPermissionsApplicationPermissions": "Permisos de aplicaciones", + "GuestPermissionsApplicationPermissionsHint": "Elija qué aplicaciones pueden usar los invitados y luego ajuste los permisos de cada aplicación a continuación.", + "GuestPermissionsTabGuest": "Invitado", + "GuestPermissionsTabAnonymousGuest": "Invitado anónimo", + "GuestPermissionsAnonymousApplicationHint": "Acceso a aplicaciones para invitados anónimos (solo lectura). Las aplicaciones que ven también pueden depender de la configuración de despliegue.", "ImportDocumentPermission": "Importar documentos", "ImportDocumentDescription": "Otorga a los usuarios la capacidad de importar documentos al espacio de trabajo", "SelectUsers": "Seleccionar usuarios", diff --git a/plugins/setting-assets/lang/fr.json b/plugins/setting-assets/lang/fr.json index 72f43b6b15..5c6037eac8 100644 --- a/plugins/setting-assets/lang/fr.json +++ b/plugins/setting-assets/lang/fr.json @@ -214,9 +214,12 @@ "OfficeDefaultSettings": "Paramètres par défaut pour les salles de réunion", "DefaultStartWithTranscription": "Activer la transcription dans les nouveaux bureaux", "DefaultStartWithRecording": "Activer l'enregistrement dans les nouveaux bureaux", - "GuestPermissionsSettings": "Permissions des invités", - "GuestPermissionsModulePermissions": "Permissions des modules", - "GuestPermissionsModulePermissionsHint": "Choisissez les modules accessibles aux invités, puis ajustez les permissions pour chaque application ci-dessous.", + "GuestPermissionsSettings": "Invités", + "GuestPermissionsApplicationPermissions": "Permissions des applications", + "GuestPermissionsApplicationPermissionsHint": "Choisissez les applications accessibles aux invités, puis ajustez les permissions pour chaque application ci-dessous.", + "GuestPermissionsTabGuest": "Invité", + "GuestPermissionsTabAnonymousGuest": "Invité anonyme", + "GuestPermissionsAnonymousApplicationHint": "Accès aux applications pour les invités anonymes (lecture seule). Les applications visibles peuvent aussi dépendre de la configuration de déploiement.", "ImportDocumentPermission": "Importer des documents", "ImportDocumentDescription": "Accorde aux utilisateurs la possibilité d'importer des documents dans l'espace de travail", "SelectUsers": "Sélectionner des utilisateurs", diff --git a/plugins/setting-assets/lang/it.json b/plugins/setting-assets/lang/it.json index 030ecb9e8c..bc21f048e4 100644 --- a/plugins/setting-assets/lang/it.json +++ b/plugins/setting-assets/lang/it.json @@ -214,9 +214,12 @@ "OfficeDefaultSettings": "Impostazioni predefinite per le sale riunioni", "DefaultStartWithTranscription": "Abilita trascrizione nelle nuove stanze dell'ufficio", "DefaultStartWithRecording": "Abilita registrazione nelle nuove stanze dell'ufficio", - "GuestPermissionsSettings": "Permessi ospite", - "GuestPermissionsModulePermissions": "Permessi dei moduli", - "GuestPermissionsModulePermissionsHint": "Scegli quali moduli possono usare gli ospiti, poi regola i permessi per ogni app qui sotto.", + "GuestPermissionsSettings": "Ospiti", + "GuestPermissionsApplicationPermissions": "Permessi delle applicazioni", + "GuestPermissionsApplicationPermissionsHint": "Scegli quali applicazioni possono usare gli ospiti, poi regola i permessi per ogni applicazione qui sotto.", + "GuestPermissionsTabGuest": "Ospite", + "GuestPermissionsTabAnonymousGuest": "Ospite anonimo", + "GuestPermissionsAnonymousApplicationHint": "Accesso alle applicazioni per ospiti anonimi (sola lettura). Le applicazioni visibili possono dipendere anche dalla configurazione di distribuzione.", "ImportDocumentPermission": "Importa documenti", "ImportDocumentDescription": "Concede agli utenti la possibilità di importare documenti nell'area di lavoro", "SelectUsers": "Seleziona utenti", diff --git a/plugins/setting-assets/lang/ja.json b/plugins/setting-assets/lang/ja.json index 471f3d444d..8889c80f14 100644 --- a/plugins/setting-assets/lang/ja.json +++ b/plugins/setting-assets/lang/ja.json @@ -214,9 +214,12 @@ "OfficeDefaultSettings": "会議室のデフォルト設定", "DefaultStartWithTranscription": "新しいオフィスルームで文字起こしを有効にする", "DefaultStartWithRecording": "新しいオフィスルームで録画を有効にする", - "GuestPermissionsSettings": "ゲストの権限", - "GuestPermissionsModulePermissions": "モジュールの権限", - "GuestPermissionsModulePermissionsHint": "ゲストが利用できるモジュールを選び、その下で各アプリの権限を調整します。", + "GuestPermissionsSettings": "ゲスト", + "GuestPermissionsApplicationPermissions": "アプリケーションの権限", + "GuestPermissionsApplicationPermissionsHint": "ゲストが利用できるアプリケーションを選び、その下で各アプリケーションの権限を調整します。", + "GuestPermissionsTabGuest": "ゲスト", + "GuestPermissionsTabAnonymousGuest": "匿名ゲスト", + "GuestPermissionsAnonymousApplicationHint": "匿名(読み取り専用)ゲストのアプリケーションアクセス。表示されるアプリケーションはデプロイ設定にも依存する場合があります。", "ImportDocumentPermission": "ドキュメントをインポート", "ImportDocumentDescription": "ユーザーにワークスペースにドキュメントをインポートする機能を付与します", "SelectUsers": "ユーザーを選択", diff --git a/plugins/setting-assets/lang/pt-br.json b/plugins/setting-assets/lang/pt-br.json index 1a061058bd..9de2c3bb13 100644 --- a/plugins/setting-assets/lang/pt-br.json +++ b/plugins/setting-assets/lang/pt-br.json @@ -205,9 +205,12 @@ "OfficeDefaultSettings": "Configurações padrão para salas de reunião", "DefaultStartWithTranscription": "Habilitar transcrição em novos escritórios", "DefaultStartWithRecording": "Habilitar gravação em novos escritórios", - "GuestPermissionsSettings": "Permissões de convidados", - "GuestPermissionsModulePermissions": "Permissões de módulos", - "GuestPermissionsModulePermissionsHint": "Escolha quais módulos os convidados podem usar e, em seguida, ajuste as permissões de cada aplicativo abaixo.", + "GuestPermissionsSettings": "Convidados", + "GuestPermissionsApplicationPermissions": "Permissões de aplicativos", + "GuestPermissionsApplicationPermissionsHint": "Escolha quais aplicativos os convidados podem usar e, em seguida, ajuste as permissões de cada aplicativo abaixo.", + "GuestPermissionsTabGuest": "Convidado", + "GuestPermissionsTabAnonymousGuest": "Convidado anônimo", + "GuestPermissionsAnonymousApplicationHint": "Acesso a aplicativos para convidados anônimos (somente leitura). Os aplicativos visíveis também podem depender da configuração de implantação.", "ImportDocumentPermission": "Importar documentos", "ImportDocumentDescription": "Concede aos usuários a capacidade de importar documentos para o espaço de trabalho", "SelectUsers": "Selecionar usuários", diff --git a/plugins/setting-assets/lang/pt.json b/plugins/setting-assets/lang/pt.json index a44599991b..eb2e327852 100644 --- a/plugins/setting-assets/lang/pt.json +++ b/plugins/setting-assets/lang/pt.json @@ -205,9 +205,12 @@ "OfficeDefaultSettings": "Configurações padrão para salas de reunião", "DefaultStartWithTranscription": "Habilitar transcrição em novos escritórios", "DefaultStartWithRecording": "Habilitar gravação em novos escritórios", - "GuestPermissionsSettings": "Permissões de convidados", - "GuestPermissionsModulePermissions": "Permissões de módulos", - "GuestPermissionsModulePermissionsHint": "Escolha quais módulos os convidados podem usar e, em seguida, ajuste as permissões de cada aplicação abaixo.", + "GuestPermissionsSettings": "Convidados", + "GuestPermissionsApplicationPermissions": "Permissões de aplicações", + "GuestPermissionsApplicationPermissionsHint": "Escolha quais aplicações os convidados podem usar e, em seguida, ajuste as permissões de cada aplicação abaixo.", + "GuestPermissionsTabGuest": "Convidado", + "GuestPermissionsTabAnonymousGuest": "Convidado anónimo", + "GuestPermissionsAnonymousApplicationHint": "Acesso a aplicações para convidados anónimos (só leitura). As aplicações visíveis também podem depender da configuração de implementação.", "ImportDocumentPermission": "Importar documentos", "ImportDocumentDescription": "Concede aos usuários a capacidade de importar documentos para o espaço de trabalho", "SelectUsers": "Selecionar usuários", diff --git a/plugins/setting-assets/lang/ru.json b/plugins/setting-assets/lang/ru.json index 7c61a771c5..513d69b2b2 100644 --- a/plugins/setting-assets/lang/ru.json +++ b/plugins/setting-assets/lang/ru.json @@ -215,9 +215,12 @@ "OfficeDefaultSettings": "Настройки по умолчанию для переговорных", "DefaultStartWithTranscription": "Включить транскрипцию в новых комнатах", "DefaultStartWithRecording": "Включить запись в новых комнатах", - "GuestPermissionsSettings": "Права гостей", - "GuestPermissionsModulePermissions": "Права модулей", - "GuestPermissionsModulePermissionsHint": "Выберите, какие модули доступны гостям, затем настройте права для каждого приложения ниже.", + "GuestPermissionsSettings": "Гости", + "GuestPermissionsApplicationPermissions": "Права приложений", + "GuestPermissionsApplicationPermissionsHint": "Выберите, какие приложения доступны гостям, затем настройте права для каждого приложения ниже.", + "GuestPermissionsTabGuest": "Гость", + "GuestPermissionsTabAnonymousGuest": "Анонимный гость", + "GuestPermissionsAnonymousApplicationHint": "Доступ к приложениям для анонимных гостей (только чтение). Видимые приложения также могут зависеть от конфигурации развёртывания.", "ImportDocumentPermission": "Импорт документов", "ImportDocumentDescription": "Предоставляет пользователям возможность импортировать документы в рабочее пространство", "SelectUsers": "Выбрать пользователей", diff --git a/plugins/setting-assets/lang/tr.json b/plugins/setting-assets/lang/tr.json index a14577706d..8057899a51 100644 --- a/plugins/setting-assets/lang/tr.json +++ b/plugins/setting-assets/lang/tr.json @@ -214,9 +214,12 @@ "OfficeDefaultSettings": "Toplantı odaları için varsayılan ayarlar", "DefaultStartWithTranscription": "Yeni ofis odalarında transkripsiyonu etkinleştir", "DefaultStartWithRecording": "Yeni ofis odalarında kaydı etkinleştir", - "GuestPermissionsSettings": "Misafir izinleri", - "GuestPermissionsModulePermissions": "Modül izinleri", - "GuestPermissionsModulePermissionsHint": "Misafirlerin hangi modülleri kullanabileceğini seçin, ardından her uygulama için izinleri aşağıdan ayarlayın.", + "GuestPermissionsSettings": "Misafirler", + "GuestPermissionsApplicationPermissions": "Uygulama izinleri", + "GuestPermissionsApplicationPermissionsHint": "Misafirlerin hangi uygulamaları kullanabileceğini seçin, ardından her uygulama için izinleri aşağıdan ayarlayın.", + "GuestPermissionsTabGuest": "Misafir", + "GuestPermissionsTabAnonymousGuest": "Anonim misafir", + "GuestPermissionsAnonymousApplicationHint": "Anonim (salt okunur) misafirler için uygulama erişimi. Gördükleri uygulamalar da dağıtım yapılandırmasına bağlı olabilir.", "ImportDocumentPermission": "Belgeleri içe aktar", "ImportDocumentDescription": "Kullanıcılara çalışma alanına belge içe aktarma yeteneği verir", "SelectUsers": "Kullanıcıları seç", diff --git a/plugins/setting-assets/lang/zh.json b/plugins/setting-assets/lang/zh.json index d55a63ba8b..a30f894b4c 100644 --- a/plugins/setting-assets/lang/zh.json +++ b/plugins/setting-assets/lang/zh.json @@ -214,9 +214,12 @@ "OfficeDefaultSettings": "会议室的默认设置", "DefaultStartWithTranscription": "在新办公室启用转录", "DefaultStartWithRecording": "在新办公室启用录制", - "GuestPermissionsSettings": "访客权限", - "GuestPermissionsModulePermissions": "模块权限", - "GuestPermissionsModulePermissionsHint": "选择访客可以使用哪些模块,然后在下方调整每个应用的权限。", + "GuestPermissionsSettings": "访客", + "GuestPermissionsApplicationPermissions": "应用权限", + "GuestPermissionsApplicationPermissionsHint": "选择访客可以使用哪些应用,然后在下方调整每个应用的权限。", + "GuestPermissionsTabGuest": "访客", + "GuestPermissionsTabAnonymousGuest": "匿名访客", + "GuestPermissionsAnonymousApplicationHint": "匿名(只读)访客的应用访问。他们可见的应用也可能取决于部署配置。", "ImportDocumentPermission": "导入文档", "ImportDocumentDescription": "授予用户将文档导入工作区的权限", "SelectUsers": "选择用户", diff --git a/plugins/setting-resources/src/components/General.svelte b/plugins/setting-resources/src/components/General.svelte index b88a6118e1..9f1e4bc367 100644 --- a/plugins/setting-resources/src/components/General.svelte +++ b/plugins/setting-resources/src/components/General.svelte @@ -13,30 +13,16 @@ // limitations under the License. -->
-
- {#if loading} -
- -
- {:else} - -
-
-
-
-
-
-
-
+
+ -
- {#each sortedVisibleModuleGroups as group} - {@const app = getApplication(group.application)} - {@const moduleOn = isModuleEnabled(group)} - {@const permissionCount = (group.permissions ?? []).length} -
-
-
- {#if app} -
- -
- {:else} -
- {/if} -
-
-
-
-
- {/if} + + {/if} + +
+
+
+
+
+ {#if guestPermissionsTab === 'anonymous'} +
+
+ +
+ {#each sortedVisibleModuleGroups as group} + {@const app = getApplication(group.application)} + {@const moduleOn = isModuleEnabled(group)} + {@const permissionCount = (group.permissions ?? []).length} +
+
+
+ {#if app} +
+ +
+ {:else} +
+ {/if} +
+
+
+
+
+
+ +
+
+ + {#if permissionCount > 0} +
+ {#each group.permissions ?? [] as permissionId} +
+
+
+
+ +
+
+ {/each} +
+ {/if} +
+ {/each} + {#if visibleModuleGroups.length === 0} +
—
+ {/if} +
+
+
+ + {/if} +