From b9a370b6d96dee6a5c2529c99a5f95afaa1ccab5 Mon Sep 17 00:00:00 2001 From: Alexey Zinoviev Date: Tue, 3 Sep 2024 19:27:15 +0400 Subject: [PATCH 1/2] uberf-8017: allow to update ws name and delete ws Signed-off-by: Alexey Zinoviev --- models/setting/src/index.ts | 26 +-- models/setting/src/plugin.ts | 1 + packages/core/src/classes.ts | 2 +- packages/core/src/utils.ts | 14 +- .../src/components/MessageBox.svelte | 5 +- packages/theme/styles/button.scss | 1 + plugins/client-resources/src/connection.ts | 2 +- .../src/components/Avatar.svelte | 1 + plugins/login/src/index.ts | 4 +- plugins/setting-assets/lang/en.json | 7 +- plugins/setting-assets/lang/es.json | 7 +- plugins/setting-assets/lang/fr.json | 7 +- plugins/setting-assets/lang/pt.json | 7 +- plugins/setting-assets/lang/ru.json | 7 +- plugins/setting-assets/lang/zh.json | 7 +- .../src/components/General.svelte | 188 ++++++++++++++++++ .../src/components/WorkspaceSetting.svelte | 83 -------- plugins/setting-resources/src/index.ts | 4 +- plugins/setting-resources/src/plugin.ts | 6 +- plugins/setting-resources/src/utils.ts | 42 +++- plugins/setting/src/index.ts | 3 +- plugins/workbench-resources/src/connect.ts | 7 +- server/account/src/operations.ts | 88 +++++++- server/rpc/src/rpc.ts | 1 + server/ws/src/server.ts | 10 +- server/ws/src/server_http.ts | 7 +- server/ws/src/server_u.ts | 7 +- server/ws/src/types.ts | 2 +- services/ai-bot/pod-ai-bot/src/controller.ts | 4 +- .../pod-analytics-collector/src/collector.ts | 11 +- 30 files changed, 422 insertions(+), 139 deletions(-) create mode 100644 plugins/setting-resources/src/components/General.svelte delete mode 100644 plugins/setting-resources/src/components/WorkspaceSetting.svelte diff --git a/models/setting/src/index.ts b/models/setting/src/index.ts index 7890baf7287..39be49a0a2f 100644 --- a/models/setting/src/index.ts +++ b/models/setting/src/index.ts @@ -201,6 +201,19 @@ export function createModel (builder: Builder): void { }, setting.ids.Integrations ) + builder.createDoc( + setting.class.WorkspaceSettingCategory, + core.space.Model, + { + name: 'general', + label: setting.string.General, + icon: setting.icon.Setting, + component: setting.component.General, + order: 900, + role: AccountRole.Owner + }, + setting.ids.General + ) builder.createDoc( setting.class.WorkspaceSettingCategory, core.space.Model, @@ -241,19 +254,6 @@ export function createModel (builder: Builder): void { }, setting.ids.Configure ) - builder.createDoc( - setting.class.WorkspaceSettingCategory, - core.space.Model, - { - name: 'workspaceSettings', - label: setting.string.Branding, - icon: setting.icon.AccountSettings, - component: setting.component.WorkspaceSetting, - order: 1300, - role: AccountRole.Owner - }, - setting.ids.WorkspaceSetting - ) builder.createDoc( setting.class.WorkspaceSettingCategory, core.space.Model, diff --git a/models/setting/src/plugin.ts b/models/setting/src/plugin.ts index cab89964985..ea9f1869197 100644 --- a/models/setting/src/plugin.ts +++ b/models/setting/src/plugin.ts @@ -40,6 +40,7 @@ export default mergeIds(settingId, setting, { DateTypeEditor: '' as AnyComponent, RefEditor: '' as AnyComponent, EnumTypeEditor: '' as AnyComponent, + General: '' as AnyComponent, Owners: '' as AnyComponent, CreateMixin: '' as AnyComponent, InviteSetting: '' as AnyComponent, diff --git a/packages/core/src/classes.ts b/packages/core/src/classes.ts index 9d2f4f4413f..96f9e88eda7 100644 --- a/packages/core/src/classes.ts +++ b/packages/core/src/classes.ts @@ -652,7 +652,7 @@ export interface DomainIndexConfiguration extends Doc { skip?: string[] } -export type WorkspaceMode = 'pending-creation' | 'creating' | 'upgrading' | 'deleting' | 'active' +export type WorkspaceMode = 'pending-creation' | 'creating' | 'upgrading' | 'pending-deletion' | 'deleting' | 'active' export interface BaseWorkspaceInfo { workspace: string // An uniq workspace name, Database names diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index bd8dcecbc15..f27ed146241 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -39,7 +39,8 @@ import { Role, roleOrder, Space, - TypedSpace + TypedSpace, + WorkspaceMode } from './classes' import core from './component' import { Hierarchy } from './hierarchy' @@ -152,6 +153,17 @@ export function toWorkspaceString (id: WorkspaceId): string { return id.name } +/** + * @public + */ +export function isWorkspaceCreating (mode?: WorkspaceMode): boolean { + if (mode === undefined) { + return false + } + + return ['pending-creation', 'creating'].includes(mode) +} + const attributesPrefix = 'attributes.' /** diff --git a/packages/presentation/src/components/MessageBox.svelte b/packages/presentation/src/components/MessageBox.svelte index b7f76c49785..78f20ff4498 100644 --- a/packages/presentation/src/components/MessageBox.svelte +++ b/packages/presentation/src/components/MessageBox.svelte @@ -24,6 +24,7 @@ export let richMessage: boolean = false export let params: Record = {} export let okLabel: IntlString | undefined = undefined + export let dangerous: boolean = false export let canSubmit = true export let action: (() => Promise) | undefined = undefined @@ -48,11 +49,11 @@ +
+
+ + + {/if} + + + + diff --git a/plugins/setting-resources/src/components/WorkspaceSetting.svelte b/plugins/setting-resources/src/components/WorkspaceSetting.svelte deleted file mode 100644 index 5ed31dbc1fa..00000000000 --- a/plugins/setting-resources/src/components/WorkspaceSetting.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - - - - -
- -
-
-
- - diff --git a/plugins/setting-resources/src/index.ts b/plugins/setting-resources/src/index.ts index 7ed4cc263f8..59c67507232 100644 --- a/plugins/setting-resources/src/index.ts +++ b/plugins/setting-resources/src/index.ts @@ -23,6 +23,7 @@ import CreateMixin from './components/CreateMixin.svelte' import EditEnum from './components/EditEnum.svelte' import EnumSetting from './components/EnumSetting.svelte' import Integrations from './components/Integrations.svelte' +import General from './components/General.svelte' import Owners from './components/Owners.svelte' import Password from './components/Password.svelte' import Privacy from './components/Privacy.svelte' @@ -56,7 +57,6 @@ import NumberTypeEditor from './components/typeEditors/NumberTypeEditor.svelte' import RefEditor from './components/typeEditors/RefEditor.svelte' import RoleAssignmentEditor from './components/typeEditors/RoleAssignmentEditor.svelte' import StringTypeEditor from './components/typeEditors/StringTypeEditor.svelte' -import WorkspaceSetting from './components/WorkspaceSetting.svelte' import WorkspaceSettings from './components/WorkspaceSettings.svelte' import setting from './plugin' import { filterDescendants, getOwnerFirstName, getOwnerLastName, getOwnerPosition, getValue } from './utils' @@ -90,7 +90,6 @@ export default async (): Promise => ({ Spaces, Profile, Password, - WorkspaceSetting, WorkspaceSettings, Integrations, Support, @@ -107,6 +106,7 @@ export default async (): Promise => ({ ArrayEditor, EditEnum, EnumSetting, + General, Owners, CreateMixin, InviteSetting, diff --git a/plugins/setting-resources/src/plugin.ts b/plugins/setting-resources/src/plugin.ts index f9c8e320cd2..c8474d2eb3c 100644 --- a/plugins/setting-resources/src/plugin.ts +++ b/plugins/setting-resources/src/plugin.ts @@ -101,6 +101,10 @@ export default mergeIds(settingId, setting, { Permissions: '' as IntlString, Assignees: '' as IntlString, DeleteRole: '' as IntlString, - DeleteRoleConfirmation: '' as IntlString + DeleteRoleConfirmation: '' as IntlString, + DeleteWorkspace: '' as IntlString, + DeleteWorkspaceConfirm: '' as IntlString, + WorkspaceName: '' as IntlString, + Workspace: '' as IntlString } }) diff --git a/plugins/setting-resources/src/utils.ts b/plugins/setting-resources/src/utils.ts index ccbefb486d9..3e05d4abba6 100644 --- a/plugins/setting-resources/src/utils.ts +++ b/plugins/setting-resources/src/utils.ts @@ -1,7 +1,9 @@ import contact, { type Employee, type PersonAccount, getFirstName, getLastName } from '@hcengineering/contact' import { employeeByIdStore } from '@hcengineering/contact-resources' import { type Class, type Doc, type Hierarchy, type Ref } from '@hcengineering/core' -import { getClient } from '@hcengineering/presentation' +import { getMetadata } from '@hcengineering/platform' +import login from '@hcengineering/login' +import presentation, { getClient } from '@hcengineering/presentation' import setting from '@hcengineering/setting' import { type TemplateDataProvider } from '@hcengineering/templates' import { get } from 'svelte/store' @@ -98,3 +100,41 @@ export async function getOwnerPosition (provider: TemplateDataProvider): Promise return undefined } } + +export async function rpcAccount (method: string, ...params: any[]): Promise { + const accountsUrl = getMetadata(login.metadata.AccountsUrl) + + if (accountsUrl === undefined) { + throw new Error('accounts url not specified') + } + + const token = getMetadata(presentation.metadata.Token) + if (token === undefined) { + throw new Error('no token available for the session') + } + + const request = { + method, + params + } + + try { + const response = await fetch(accountsUrl, { + method: 'POST', + headers: { + Authorization: 'Bearer ' + token, + 'Content-Type': 'application/json' + }, + body: JSON.stringify(request) + }) + const res = await response.json() + + if (res.error != null) { + throw new Error(`Failed to ${method}: ${res.error}`) + } + + return res + } catch (err: any) { + throw new Error(`Fetch error when calling ${method}: ${err.message}`) + } +} diff --git a/plugins/setting/src/index.ts b/plugins/setting/src/index.ts index 13237257fbb..4a00aecbf4d 100644 --- a/plugins/setting/src/index.ts +++ b/plugins/setting/src/index.ts @@ -126,6 +126,7 @@ export default plugin(settingId, { Privacy: '' as Ref, Terms: '' as Ref, ClassSetting: '' as Ref, + General: '' as Ref, Owners: '' as Ref, InviteSettings: '' as Ref, WorkspaceSetting: '' as Ref, @@ -150,7 +151,6 @@ export default plugin(settingId, { Settings: '' as AnyComponent, Profile: '' as AnyComponent, Password: '' as AnyComponent, - WorkspaceSetting: '' as AnyComponent, WorkspaceSettings: '' as AnyComponent, Integrations: '' as AnyComponent, Support: '' as AnyComponent, @@ -170,7 +170,6 @@ export default plugin(settingId, { Setting: '' as IntlString, Spaces: '' as IntlString, WorkspaceSettings: '' as IntlString, - Branding: '' as IntlString, Integrations: '' as IntlString, Support: '' as IntlString, Privacy: '' as IntlString, diff --git a/plugins/workbench-resources/src/connect.ts b/plugins/workbench-resources/src/connect.ts index 8ed1acfd555..d0f20d3f06e 100644 --- a/plugins/workbench-resources/src/connect.ts +++ b/plugins/workbench-resources/src/connect.ts @@ -8,6 +8,7 @@ import core, { metricsToString, setCurrentAccount, versionToString, + isWorkspaceCreating, type Account, type AccountClient, type Client, @@ -83,10 +84,10 @@ export async function connect (title: string): Promise { setMetadata(presentation.metadata.Token, token) - if (['pending-creation', 'creating'].includes(workspaceLoginInfo?.mode ?? '')) { + if (isWorkspaceCreating(workspaceLoginInfo?.mode)) { const fetchWorkspace = await getResource(login.function.FetchWorkspace) let loginInfo = await ctx.with('fetch-workspace', {}, async () => (await fetchWorkspace(ws))[1]) - if (['pending-creation', 'creating'].includes(loginInfo?.mode ?? '')) { + if (isWorkspaceCreating(loginInfo?.mode)) { while (true) { if (ws !== getCurrentLocation().path[1]) return workspaceCreating.set(loginInfo?.progress ?? 0) @@ -99,7 +100,7 @@ export async function connect (title: string): Promise { return } workspaceCreating.set(loginInfo?.progress) - if (!['pending-creation', 'creating'].includes(loginInfo?.mode ?? '')) { + if (!isWorkspaceCreating(loginInfo?.mode)) { workspaceCreating.set(-1) break } diff --git a/server/account/src/operations.ts b/server/account/src/operations.ts index 2eef71ce2a8..70626d33f9e 100644 --- a/server/account/src/operations.ts +++ b/server/account/src/operations.ts @@ -42,6 +42,7 @@ import core, { TxOperations, Version, versionToString, + isWorkspaceCreating, WorkspaceId, type Branding, type WorkspaceMode @@ -1467,6 +1468,8 @@ export async function getPendingWorkspace ( mode: 'upgrading' } ] + // TODO: support returning pending deletion workspaces when we will actually want + // to clear them with the worker. const defaultRegionQuery = { $or: [{ region: { $exists: false } }, { region: '' }] } const operationQuery = { @@ -1640,7 +1643,7 @@ export async function getUserWorkspaces ( .sort({ lastVisit: -1 }) .toArray() ) - .filter((it) => it.disabled !== true || it.mode !== 'active') + .filter((it) => it.disabled !== true || isWorkspaceCreating(it.mode)) .map(mapToClientWorkspace) } @@ -2623,6 +2626,76 @@ export async function changeUsername ( ctx.info('change-username success', { email }) } +/** + * @public + */ +export async function updateWorkspaceName ( + ctx: MeasureContext, + db: Db, + branding: Branding | null, + token: string, + name: string +): Promise { + const decodedToken = decodeToken(ctx, token) + const workspaceInfo = await getWorkspaceById(db, decodedToken.workspace.name) + if (workspaceInfo === null) { + throw new PlatformError( + new Status(Severity.ERROR, platform.status.WorkspaceNotFound, { workspace: decodedToken.workspace.name }) + ) + } + + await db.collection(WORKSPACE_COLLECTION).updateOne( + { _id: workspaceInfo._id }, + { + $set: { + workspaceName: name + } + } + ) +} + +/** + * @public + */ +export async function deleteWorkspace ( + ctx: MeasureContext, + db: Db, + branding: Branding | null, + token: string +): Promise { + const { workspace, email } = decodeToken(ctx, token) + const workspaceInfo = await getWorkspaceById(db, workspace.name) + if (workspaceInfo === null) { + throw new PlatformError( + new Status(Severity.ERROR, platform.status.WorkspaceNotFound, { workspace: workspace.name }) + ) + } + + const connection = await connect( + getEndpoint(ctx, workspaceInfo, EndpointKind.Internal), + getWorkspaceId(workspaceInfo.workspace) + ) + try { + const ops = new TxOperations(connection, core.account.System) + const ownerAccount = await ops.findOne(contact.class.PersonAccount, { email, role: AccountRole.Owner }) + if (ownerAccount == null) { + throw new PlatformError(new Status(Severity.ERROR, platform.status.Forbidden, {})) + } + + await db.collection(WORKSPACE_COLLECTION).updateOne( + { _id: workspaceInfo._id }, + { + $set: { + disabled: true, + mode: 'pending-deletion' + } + } + ) + } finally { + await connection.close() + } +} + /** * @public */ @@ -2642,9 +2715,6 @@ export function getMethods (): Record { getWorkspaceInfo: wrap(getWorkspaceInfo), createAccount: wrap(createAccount), createWorkspace: wrap(createUserWorkspace), - getPendingWorkspace: wrap(getPendingWorkspace), - updateWorkspaceInfo: wrap(updateWorkspaceInfo), - workerHandshake: wrap(workerHandshake), assignWorkspace: wrap(assignWorkspace), removeWorkspace: wrap(removeWorkspace), leaveWorkspace: wrap(leaveWorkspace), @@ -2656,8 +2726,14 @@ export function getMethods (): Record { confirm: wrap(confirm), getAccountInfoByToken: wrap(getAccountInfoByToken), createMissingEmployee: wrap(createMissingEmployee), - changeUsername: wrap(changeUsername) - // updateAccount: wrap(updateAccount) + changeUsername: wrap(changeUsername), + updateWorkspaceName: wrap(updateWorkspaceName), + deleteWorkspace: wrap(deleteWorkspace), + // updateAccount: wrap(updateAccount), + // Workspace service methods + getPendingWorkspace: wrap(getPendingWorkspace), + updateWorkspaceInfo: wrap(updateWorkspaceInfo), + workerHandshake: wrap(workerHandshake) } } diff --git a/server/rpc/src/rpc.ts b/server/rpc/src/rpc.ts index 5d7cf458ebc..6a1c8c5939c 100644 --- a/server/rpc/src/rpc.ts +++ b/server/rpc/src/rpc.ts @@ -79,6 +79,7 @@ export interface Response { result?: R id?: ReqId error?: Status + terminate?: boolean chunk?: { index: number final: boolean diff --git a/server/ws/src/server.ts b/server/ws/src/server.ts index 95ad01bc9ac..19081bda6a4 100644 --- a/server/ws/src/server.ts +++ b/server/ws/src/server.ts @@ -21,6 +21,7 @@ import core, { systemAccountEmail, toWorkspaceString, versionToString, + isWorkspaceCreating, withContext, type BaseWorkspaceInfo, type Branding, @@ -276,7 +277,7 @@ class TSessionManager implements SessionManager { ): Promise< | { session: Session, context: MeasureContext, workspaceId: string } | { upgrade: true, upgradeInfo?: WorkspaceLoginInfo['upgrade'] } - | { error: any } + | { error: any, terminate?: boolean } > { const wsString = toWorkspaceString(token.workspace) @@ -294,7 +295,12 @@ class TSessionManager implements SessionManager { return { upgrade: true } } - if (['pending-creation', 'creating'].includes(workspaceInfo?.mode) && token.email !== systemAccountEmail) { + if (workspaceInfo.disabled === true && token.email !== systemAccountEmail && token.extra?.admin !== 'true') { + // No access to disabled workspaces for regular users + return { error: new Error('Workspace not found or not available'), terminate: true } + } + + if (isWorkspaceCreating(workspaceInfo?.mode) && token.email !== systemAccountEmail) { // No access to workspace for token. return { error: new Error(`Workspace during creation phase ${token.email} ${token.workspace.name}`) } } diff --git a/server/ws/src/server_http.ts b/server/ws/src/server_http.ts index dbe9d351187..7ef167a42be 100644 --- a/server/ws/src/server_http.ts +++ b/server/ws/src/server_http.ts @@ -277,7 +277,12 @@ export function startHttpServer ( void webSocketData.session.then((s) => { if ('error' in s) { void cs - .send(ctx, { id: -1, error: unknownStatus(s.error.message ?? 'Unknown error') }, false, false) + .send( + ctx, + { id: -1, error: unknownStatus(s.error.message ?? 'Unknown error'), terminate: s.terminate }, + false, + false + ) .then(() => { // No connection to account service, retry from client. setTimeout(() => { diff --git a/server/ws/src/server_u.ts b/server/ws/src/server_u.ts index 6e3469811ee..4eabef5ae4c 100644 --- a/server/ws/src/server_u.ts +++ b/server/ws/src/server_u.ts @@ -135,7 +135,12 @@ export function startUWebsocketServer ( void data.session.then((s) => { if ('error' in s) { void cs - .send(ctx, { id: -1, error: unknownStatus(s.error.message ?? 'Unknown error') }, false, false) + .send( + ctx, + { id: -1, error: unknownStatus(s.error.message ?? 'Unknown error'), terminate: s.terminate }, + false, + false + ) .then(() => { // No connection to account service, retry from client. setTimeout(() => { diff --git a/server/ws/src/types.ts b/server/ws/src/types.ts index 97539dbef11..d0a27e93c3b 100644 --- a/server/ws/src/types.ts +++ b/server/ws/src/types.ts @@ -136,7 +136,7 @@ export interface AddSessionActive { context: MeasureContext workspaceId: string } -export type AddSessionResponse = AddSessionActive | { upgrade: true } | { error: any } +export type AddSessionResponse = AddSessionActive | { upgrade: true } | { error: any, terminate?: boolean } /** * @public diff --git a/services/ai-bot/pod-ai-bot/src/controller.ts b/services/ai-bot/pod-ai-bot/src/controller.ts index 26b1b30c1c8..cf1b5658b32 100644 --- a/services/ai-bot/pod-ai-bot/src/controller.ts +++ b/services/ai-bot/pod-ai-bot/src/controller.ts @@ -13,7 +13,7 @@ // limitations under the License. // -import { MeasureContext, systemAccountEmail } from '@hcengineering/core' +import { MeasureContext, systemAccountEmail, isWorkspaceCreating } from '@hcengineering/core' import { aiBotAccountEmail, AIBotTransferEvent } from '@hcengineering/ai-bot' import { WorkspaceInfoRecord } from '@hcengineering/server-ai-bot' import { getTransactorEndpoint } from '@hcengineering/server-client' @@ -125,7 +125,7 @@ export class AIBotController { return } - if (['pending-creation', 'creating'].includes(info?.mode)) { + if (isWorkspaceCreating(info?.mode)) { this.ctx.info('Workspace is creating -> waiting...', { workspace }) this.assignTimeout = setTimeout(() => { void this.assignToWorkspace(workspace) diff --git a/services/analytics-collector/pod-analytics-collector/src/collector.ts b/services/analytics-collector/pod-analytics-collector/src/collector.ts index 9bee4a29ac5..2fc27764286 100644 --- a/services/analytics-collector/pod-analytics-collector/src/collector.ts +++ b/services/analytics-collector/pod-analytics-collector/src/collector.ts @@ -14,7 +14,14 @@ // import { generateToken, Token } from '@hcengineering/server-token' import { AnalyticEvent } from '@hcengineering/analytics-collector' -import { AccountRole, getWorkspaceId, MeasureContext, toWorkspaceString, WorkspaceId } from '@hcengineering/core' +import { + AccountRole, + getWorkspaceId, + MeasureContext, + toWorkspaceString, + isWorkspaceCreating, + WorkspaceId +} from '@hcengineering/core' import { Person } from '@hcengineering/contact' import { Db, Collection } from 'mongodb' @@ -137,7 +144,7 @@ export class Collector { return false } - if (['pending-creation', 'creating'].includes(info?.mode)) { + if (isWorkspaceCreating(info?.mode)) { return false } From 6203916d231f92b809ccd2da01266669640d2818 Mon Sep 17 00:00:00 2001 From: Alexey Zinoviev Date: Tue, 3 Sep 2024 20:13:13 +0400 Subject: [PATCH 2/2] uberf-8017: adjust ws avatar test Signed-off-by: Alexey Zinoviev --- tests/sanity/tests/model/workspace/owner-pages.ts | 4 ++-- .../tests/model/workspace/workspace-settings-page.ts | 10 +++++----- .../sanity/tests/workspace/workspace-settings.spec.ts | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/sanity/tests/model/workspace/owner-pages.ts b/tests/sanity/tests/model/workspace/owner-pages.ts index f42b1c8e19b..e69c398e6c6 100644 --- a/tests/sanity/tests/model/workspace/owner-pages.ts +++ b/tests/sanity/tests/model/workspace/owner-pages.ts @@ -11,7 +11,7 @@ export class OwnersPage { spacesAdminText = (): Locator => this.page.getByText('Admin Members') addMemberButton = (): Locator => this.page.getByRole('button', { name: 'Members' }) selectMember = (memberName: string): Locator => this.page.getByRole('button', { name: memberName }) - workspaceLogo = (): Locator => this.page.locator('.hulyComponent > .cursor-pointer') + workspaceLogo = (): Locator => this.page.locator('.hulyComponent .cursor-pointer') publicTemplate = (): Locator => this.page.getByText('Public templates') createTemplate = (): Locator => this.page.getByRole('button', { name: 'CREATE TEMPLATE' }) saveTemplate = (): Locator => this.page.getByRole('button', { name: 'Save template' }) @@ -27,7 +27,7 @@ export class OwnersPage { linkValidFor = (): Locator => this.page.getByRole('spinbutton') emailMask = (): Locator => this.page.getByRole('textbox', { name: 'Type text...' }) noLimitToggleButton = (): Locator => this.page.locator('label span') - avatarLarge = (): Locator => this.page.locator('.hulyAvatarSize-x-large.ava-image') + avatarLarge = (): Locator => this.page.locator('.hulyAvatarSize-medium.ava-image') async addMember (memberName: string): Promise { await expect(this.spacesAdminText()).toBeVisible() diff --git a/tests/sanity/tests/model/workspace/workspace-settings-page.ts b/tests/sanity/tests/model/workspace/workspace-settings-page.ts index 76c18e4fa7d..b0d0c924045 100644 --- a/tests/sanity/tests/model/workspace/workspace-settings-page.ts +++ b/tests/sanity/tests/model/workspace/workspace-settings-page.ts @@ -1,9 +1,9 @@ import { type Locator, type Page } from '@playwright/test' export enum ButtonType { + General, Owners, Spaces, - Branding, TextTemplate, RelatedIssues, Classes, @@ -18,9 +18,9 @@ export class WorkspaceSettingsPage { this.page = page } + general = (): Locator => this.page.getByRole('button', { name: 'General' }) owners = (): Locator => this.page.getByRole('button', { name: 'Owners' }) spaces = (): Locator => this.page.getByRole('button', { name: 'Spaces', exact: true }) - branding = (): Locator => this.page.getByRole('button', { name: 'Branding' }) textTemplate = (): Locator => this.page.getByRole('button', { name: 'Text Templates' }) relatedIssues = (): Locator => this.page.getByRole('button', { name: 'Related issues' }) classes = (): Locator => this.page.locator('#navGroup-setting').getByRole('button', { name: 'Classes' }) @@ -29,15 +29,15 @@ export class WorkspaceSettingsPage { async selectWorkspaceSettingsTab (button: ButtonType): Promise { switch (button) { + case ButtonType.General: + await this.general().click() + break case ButtonType.Owners: await this.owners().click() break case ButtonType.Spaces: await this.spaces().click() break - case ButtonType.Branding: - await this.branding().click() - break case ButtonType.TextTemplate: await this.textTemplate().click() break diff --git a/tests/sanity/tests/workspace/workspace-settings.spec.ts b/tests/sanity/tests/workspace/workspace-settings.spec.ts index 4dd4c738890..c74fc2f9595 100644 --- a/tests/sanity/tests/workspace/workspace-settings.spec.ts +++ b/tests/sanity/tests/workspace/workspace-settings.spec.ts @@ -80,7 +80,7 @@ test.describe('Workspace tests', () => { await selectWorkspacePage.createWorkspace(newWorkspaceName) await userProfilePage.openProfileMenu() await userProfilePage.clickSettings() - await workspaceSettingsPage.selectWorkspaceSettingsTab(ButtonType.Branding) + await workspaceSettingsPage.selectWorkspaceSettingsTab(ButtonType.General) await ownersPage.clickOnWorkspaceLogo() await uploadFile(page, 'cat3.jpeg') await ownersPage.saveUploadedLogo()