From 10998f5057fc12891832a5104d5810f8950ac5b9 Mon Sep 17 00:00:00 2001 From: royalp Date: Tue, 2 Dec 2025 23:46:39 +0530 Subject: [PATCH 1/2] fix: correct capitalization for special cases like GitHub in authentication in workspace/members settings --- .../workspace/settings/useMemberColumns.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/web/ce/components/workspace/settings/useMemberColumns.tsx b/apps/web/ce/components/workspace/settings/useMemberColumns.tsx index 8f2286a6f53..77b99a0fa57 100644 --- a/apps/web/ce/components/workspace/settings/useMemberColumns.tsx +++ b/apps/web/ce/components/workspace/settings/useMemberColumns.tsx @@ -29,6 +29,17 @@ export const useMemberColumns = () => { const isAdmin = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.WORKSPACE); const isSuspended = (rowData: RowData) => rowData.is_active === false; + + const formatAuthMethod = (method: string | undefined): string => { + if (!method) return ""; + const normalized = method.toLowerCase().replace("-", " "); + if (normalized === "github") return "GitHub"; + if (normalized === "gitlab") return "GitLab"; + // can add more special cases like these + + return normalized.charAt(0).toUpperCase() + normalized.slice(1); + }; + // handlers const handleDisplayFilterUpdate = (filterUpdates: Partial) => { updateFilters(filterUpdates); @@ -109,7 +120,7 @@ export const useMemberColumns = () => { content: t("workspace_settings.settings.members.details.authentication"), tdRender: (rowData: RowData) => isSuspended(rowData) ? null : ( -
{rowData.member.last_login_medium?.replace("-", " ")}
+
{formatAuthMethod(rowData.member.last_login_medium)}
), }, From 1d8b442cf261d06a337840b998b98ad603ee2d3e Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 8 Dec 2025 16:27:53 +0530 Subject: [PATCH 2/2] [WEB-5594] feat: enhance authentication method handling in member columns and introduce new login medium labels --- .../workspace/settings/useMemberColumns.tsx | 26 +++++++------------ packages/constants/src/auth/core.ts | 10 +++++++ packages/constants/src/auth/extended.ts | 3 +++ .../constants/src/{auth.ts => auth/index.ts} | 9 +++++++ packages/types/src/instance/auth-ee.ts | 1 + packages/types/src/instance/auth.ts | 2 ++ packages/types/src/instance/base.ts | 4 +++ packages/types/src/instance/index.ts | 1 + packages/types/src/users.ts | 3 +-- packages/types/src/workspace.ts | 3 ++- 10 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 packages/constants/src/auth/core.ts create mode 100644 packages/constants/src/auth/extended.ts rename packages/constants/src/{auth.ts => auth/index.ts} (93%) create mode 100644 packages/types/src/instance/auth-ee.ts diff --git a/apps/web/ce/components/workspace/settings/useMemberColumns.tsx b/apps/web/ce/components/workspace/settings/useMemberColumns.tsx index 77b99a0fa57..b8ed09087ea 100644 --- a/apps/web/ce/components/workspace/settings/useMemberColumns.tsx +++ b/apps/web/ce/components/workspace/settings/useMemberColumns.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { useParams } from "next/navigation"; -import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { EUserPermissions, EUserPermissionsLevel, LOGIN_MEDIUM_LABELS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { renderFormattedDate } from "@plane/utils"; import { MemberHeaderColumn } from "@/components/project/member-header-column"; @@ -30,16 +30,6 @@ export const useMemberColumns = () => { const isSuspended = (rowData: RowData) => rowData.is_active === false; - const formatAuthMethod = (method: string | undefined): string => { - if (!method) return ""; - const normalized = method.toLowerCase().replace("-", " "); - if (normalized === "github") return "GitHub"; - if (normalized === "gitlab") return "GitLab"; - // can add more special cases like these - - return normalized.charAt(0).toUpperCase() + normalized.slice(1); - }; - // handlers const handleDisplayFilterUpdate = (filterUpdates: Partial) => { updateFilters(filterUpdates); @@ -60,7 +50,7 @@ export const useMemberColumns = () => { tdRender: (rowData: RowData) => ( { handleDisplayFilterUpdate={handleDisplayFilterUpdate} /> ), - tdRender: (rowData: RowData) => , + tdRender: (rowData: RowData) => , }, { key: "Authentication", content: t("workspace_settings.settings.members.details.authentication"), - tdRender: (rowData: RowData) => - isSuspended(rowData) ? null : ( -
{formatAuthMethod(rowData.member.last_login_medium)}
- ), + tdRender: (rowData: RowData) => { + if (isSuspended(rowData)) return null; + const loginMedium = rowData.member.last_login_medium; + if (!loginMedium) return null; + return
{LOGIN_MEDIUM_LABELS[loginMedium]}
; + }, }, { diff --git a/packages/constants/src/auth/core.ts b/packages/constants/src/auth/core.ts new file mode 100644 index 00000000000..a7693487923 --- /dev/null +++ b/packages/constants/src/auth/core.ts @@ -0,0 +1,10 @@ +import type { TCoreLoginMediums } from "@plane/types"; + +export const CORE_LOGIN_MEDIUM_LABELS: Record = { + email: "Email", + "magic-code": "Magic code", + github: "GitHub", + gitlab: "GitLab", + google: "Google", + gitea: "Gitea", +}; diff --git a/packages/constants/src/auth/extended.ts b/packages/constants/src/auth/extended.ts new file mode 100644 index 00000000000..97eb974bd1e --- /dev/null +++ b/packages/constants/src/auth/extended.ts @@ -0,0 +1,3 @@ +import type { TExtendedLoginMediums } from "@plane/types"; + +export const EXTENDED_LOGIN_MEDIUM_LABELS: Record = {}; diff --git a/packages/constants/src/auth.ts b/packages/constants/src/auth/index.ts similarity index 93% rename from packages/constants/src/auth.ts rename to packages/constants/src/auth/index.ts index 953375c0e52..2c52598e336 100644 --- a/packages/constants/src/auth.ts +++ b/packages/constants/src/auth/index.ts @@ -1,3 +1,7 @@ +import type { TLoginMediums } from "@plane/types"; +import { CORE_LOGIN_MEDIUM_LABELS } from "./core"; +import { EXTENDED_LOGIN_MEDIUM_LABELS } from "./extended"; + export enum E_PASSWORD_STRENGTH { EMPTY = "empty", LENGTH_NOT_VALID = "length_not_valid", @@ -156,3 +160,8 @@ export enum EAuthErrorCodes { // Rate limit RATE_LIMIT_EXCEEDED = "5900", } + +export const LOGIN_MEDIUM_LABELS: Record = { + ...CORE_LOGIN_MEDIUM_LABELS, + ...EXTENDED_LOGIN_MEDIUM_LABELS, +} as const; diff --git a/packages/types/src/instance/auth-ee.ts b/packages/types/src/instance/auth-ee.ts new file mode 100644 index 00000000000..5bead56aaa7 --- /dev/null +++ b/packages/types/src/instance/auth-ee.ts @@ -0,0 +1 @@ +export type TExtendedLoginMediums = never; diff --git a/packages/types/src/instance/auth.ts b/packages/types/src/instance/auth.ts index c65f9ebb8b8..5024849e900 100644 --- a/packages/types/src/instance/auth.ts +++ b/packages/types/src/instance/auth.ts @@ -43,3 +43,5 @@ export type TGetBaseAuthenticationModeProps = { updateConfig: (key: TInstanceAuthenticationMethodKeys, value: string) => void; resolvedTheme: string | undefined; }; + +export type TCoreLoginMediums = "email" | "magic-code" | "github" | "gitlab" | "google" | "gitea"; diff --git a/packages/types/src/instance/base.ts b/packages/types/src/instance/base.ts index 975e1238609..10aa0d39ab0 100644 --- a/packages/types/src/instance/base.ts +++ b/packages/types/src/instance/base.ts @@ -5,7 +5,9 @@ import type { TInstanceImageConfigurationKeys, TInstanceAuthenticationKeys, TInstanceWorkspaceConfigurationKeys, + TCoreLoginMediums, } from "./"; +import type { TExtendedLoginMediums } from "./auth-ee"; export interface IInstanceInfo { instance: IInstance; @@ -98,3 +100,5 @@ export interface IInstanceConfiguration { export type IFormattedInstanceConfiguration = { [key in TInstanceConfigurationKeys]: string; }; + +export type TLoginMediums = TCoreLoginMediums | TExtendedLoginMediums; diff --git a/packages/types/src/instance/index.ts b/packages/types/src/instance/index.ts index bc6474b832f..ec67eb273aa 100644 --- a/packages/types/src/instance/index.ts +++ b/packages/types/src/instance/index.ts @@ -1,5 +1,6 @@ export * from "./ai"; export * from "./auth"; +export * from "./auth-ee"; export * from "./base"; export * from "./email"; export * from "./image"; diff --git a/packages/types/src/users.ts b/packages/types/src/users.ts index ef1bfa5a2df..9278996a7ab 100644 --- a/packages/types/src/users.ts +++ b/packages/types/src/users.ts @@ -1,5 +1,6 @@ import type { TUserPermissions } from "./enums"; import type { IIssueActivity, TIssuePriorities, TStateGroups } from "."; +import type { TLoginMediums } from "./instance"; /** * @description The start of the week for the user @@ -15,8 +16,6 @@ export enum EStartOfTheWeek { SATURDAY = 6, } -export type TLoginMediums = "email" | "magic-code" | "github" | "gitlab" | "google"; - export interface IUserLite { avatar_url: string; display_name: string; diff --git a/packages/types/src/workspace.ts b/packages/types/src/workspace.ts index 356d0993ec0..aee3c3f3491 100644 --- a/packages/types/src/workspace.ts +++ b/packages/types/src/workspace.ts @@ -3,6 +3,7 @@ import type { ICycle } from "./cycle"; import type { TUserPermissions } from "./enums"; import type { TProjectMembership } from "./project"; import type { IUser, IUserLite } from "./users"; +import type { TLoginMediums } from "./instance"; import type { IWorkspaceViewProps } from "./view-props"; export enum EUserWorkspaceRoles { @@ -82,7 +83,7 @@ export interface IWorkspaceMember { last_name?: string; joining_date?: string; display_name?: string; - last_login_medium?: string; + last_login_medium?: TLoginMediums; is_active?: boolean; }