From 77e5e60ba0c16865c1d10a7ba47952e4225c4f40 Mon Sep 17 00:00:00 2001 From: arpandhakal Date: Wed, 20 Aug 2025 17:16:18 +0545 Subject: [PATCH 1/3] feat(OUT-2227): added support for custom client/company labels in table headers --- src/components/table/Table.tsx | 6 +++--- src/types/common.ts | 9 +++++++++ src/utils/getWorkspaceLabels.ts | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/utils/getWorkspaceLabels.ts diff --git a/src/components/table/Table.tsx b/src/components/table/Table.tsx index c568fc2..5b32048 100644 --- a/src/components/table/Table.tsx +++ b/src/components/table/Table.tsx @@ -14,10 +14,10 @@ import { order } from '@/utils/orderable'; import copilotTheme from '@/utils/copilotTheme'; import NoRowsOverlay from './NoRowsOverlay'; import Loading from '@/app/loading'; +import { getWorkspaceLabels } from '@/utils/getWorkspaceLabels'; export const TableCore = () => { const appState = useAppState(); - // Row Data: The data to be displayed. const [rowData, setRowData] = useState([]); // @@ -80,7 +80,7 @@ export const TableCore = () => { colDefs = [ ...colDefs, { - field: 'client', + field: getWorkspaceLabels(appState?.workspace).individualTerm, cellRenderer: ClientCellRenderer, flex: 1, comparator: comparatorTypeI, @@ -110,7 +110,7 @@ export const TableCore = () => { colDefs = [ ...colDefs, { - field: 'company', + field: getWorkspaceLabels(appState?.workspace).groupTerm, cellRenderer: CompanyCellRenderer, flex: 1, comparator: comparatorTypeI, diff --git a/src/types/common.ts b/src/types/common.ts index 9574565..9418ea8 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -34,6 +34,15 @@ export type MeResponse = z.infer; export const WorkspaceResponseSchema = z.object({ id: z.string(), isCompaniesEnabled: z.boolean().optional(), + label: z + .object({ + individualTerm: z.string().optional(), + individualTermPlural: z.string().optional(), + groupTerm: z.string().optional(), + groupTermPlural: z.string().optional(), + }) + .optional(), + // For future use // industry: z.string().optional(), // isClientDirectSignUpEnabled: z.boolean().optional(), diff --git a/src/utils/getWorkspaceLabels.ts b/src/utils/getWorkspaceLabels.ts new file mode 100644 index 0000000..7e90bd8 --- /dev/null +++ b/src/utils/getWorkspaceLabels.ts @@ -0,0 +1,22 @@ +import { WorkspaceResponse } from '@/types/common'; + +export const getWorkspaceLabels = (workspace?: WorkspaceResponse, shouldCapitalize?: boolean) => { + const capitalize = (str?: string) => (str ? str.charAt(0).toUpperCase() + str.slice(1) : str); + const labels = shouldCapitalize + ? { + individualTerm: workspace?.label?.individualTerm ? capitalize(workspace.label.individualTerm) : 'Client', + individualTermPlural: workspace?.label?.individualTermPlural + ? capitalize(workspace.label.individualTermPlural) + : 'Clients', + groupTerm: workspace?.label?.groupTerm ? capitalize(workspace.label.groupTerm) : 'Company', + groupTermPlural: workspace?.label?.groupTermPlural ? capitalize(workspace.label.groupTermPlural) : 'Companies', + } + : { + individualTerm: workspace?.label?.individualTerm ? workspace.label.individualTerm : 'client', + individualTermPlural: workspace?.label?.individualTermPlural ? workspace.label.individualTermPlural : 'clients', + groupTerm: workspace?.label?.groupTerm ? workspace.label.groupTerm : 'company', + groupTermPlural: workspace?.label?.groupTermPlural ? workspace.label.groupTermPlural : 'companies', + }; //clean this when we are making workspace's label field non-optional. + + return labels; +}; From b488efdac9a3d4adabbee70e679d6a0092103e97 Mon Sep 17 00:00:00 2001 From: arpandhakal Date: Fri, 22 Aug 2025 14:21:20 +0545 Subject: [PATCH 2/3] fix(OUT-2227): response key in workspace schema changed from label to labels --- src/types/common.ts | 2 +- src/utils/getWorkspaceLabels.ts | 34 +++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/types/common.ts b/src/types/common.ts index 9418ea8..3764672 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -34,7 +34,7 @@ export type MeResponse = z.infer; export const WorkspaceResponseSchema = z.object({ id: z.string(), isCompaniesEnabled: z.boolean().optional(), - label: z + labels: z .object({ individualTerm: z.string().optional(), individualTermPlural: z.string().optional(), diff --git a/src/utils/getWorkspaceLabels.ts b/src/utils/getWorkspaceLabels.ts index 7e90bd8..b4c4e9f 100644 --- a/src/utils/getWorkspaceLabels.ts +++ b/src/utils/getWorkspaceLabels.ts @@ -1,22 +1,32 @@ import { WorkspaceResponse } from '@/types/common'; -export const getWorkspaceLabels = (workspace?: WorkspaceResponse, shouldCapitalize?: boolean) => { - const capitalize = (str?: string) => (str ? str.charAt(0).toUpperCase() + str.slice(1) : str); +type WorkspaceLabels = { + individualTerm: string; + individualTermPlural: string; + groupTerm: string; + groupTermPlural: string; +}; + +export const getWorkspaceLabels = (workspace?: WorkspaceResponse, shouldCapitalize?: boolean): WorkspaceLabels => { + const capitalize = (str?: string): string => (str ? str.charAt(0).toUpperCase() + str.slice(1) : ''); + const deCapitalize = (str?: string): string => (str ? str.charAt(0).toLowerCase() + str.slice(1) : ''); const labels = shouldCapitalize ? { - individualTerm: workspace?.label?.individualTerm ? capitalize(workspace.label.individualTerm) : 'Client', - individualTermPlural: workspace?.label?.individualTermPlural - ? capitalize(workspace.label.individualTermPlural) + individualTerm: workspace?.labels?.individualTerm ? capitalize(workspace.labels.individualTerm) : 'Client', + individualTermPlural: workspace?.labels?.individualTermPlural + ? capitalize(workspace.labels.individualTermPlural) : 'Clients', - groupTerm: workspace?.label?.groupTerm ? capitalize(workspace.label.groupTerm) : 'Company', - groupTermPlural: workspace?.label?.groupTermPlural ? capitalize(workspace.label.groupTermPlural) : 'Companies', + groupTerm: workspace?.labels?.groupTerm ? capitalize(workspace.labels.groupTerm) : 'Company', + groupTermPlural: workspace?.labels?.groupTermPlural ? capitalize(workspace.labels.groupTermPlural) : 'Companies', } : { - individualTerm: workspace?.label?.individualTerm ? workspace.label.individualTerm : 'client', - individualTermPlural: workspace?.label?.individualTermPlural ? workspace.label.individualTermPlural : 'clients', - groupTerm: workspace?.label?.groupTerm ? workspace.label.groupTerm : 'company', - groupTermPlural: workspace?.label?.groupTermPlural ? workspace.label.groupTermPlural : 'companies', - }; //clean this when we are making workspace's label field non-optional. + individualTerm: workspace?.labels?.individualTerm ? deCapitalize(workspace.labels.individualTerm) : 'client', + individualTermPlural: workspace?.labels?.individualTermPlural + ? deCapitalize(workspace.labels.individualTermPlural) + : 'clients', + groupTerm: workspace?.labels?.groupTerm ? deCapitalize(workspace.labels.groupTerm) : 'company', + groupTermPlural: workspace?.labels?.groupTermPlural ? deCapitalize(workspace.labels.groupTermPlural) : 'companies', + }; return labels; }; From 1dc27d7615cf04c483f062c664f2912288d7a9a7 Mon Sep 17 00:00:00 2001 From: arpandhakal Date: Mon, 25 Aug 2025 17:41:57 +0545 Subject: [PATCH 3/3] fix(OUT-2227): cleanup getWorkspaceLabel util --- src/utils/getWorkspaceLabels.ts | 35 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/utils/getWorkspaceLabels.ts b/src/utils/getWorkspaceLabels.ts index b4c4e9f..312a0ea 100644 --- a/src/utils/getWorkspaceLabels.ts +++ b/src/utils/getWorkspaceLabels.ts @@ -7,26 +7,19 @@ type WorkspaceLabels = { groupTermPlural: string; }; -export const getWorkspaceLabels = (workspace?: WorkspaceResponse, shouldCapitalize?: boolean): WorkspaceLabels => { - const capitalize = (str?: string): string => (str ? str.charAt(0).toUpperCase() + str.slice(1) : ''); - const deCapitalize = (str?: string): string => (str ? str.charAt(0).toLowerCase() + str.slice(1) : ''); - const labels = shouldCapitalize - ? { - individualTerm: workspace?.labels?.individualTerm ? capitalize(workspace.labels.individualTerm) : 'Client', - individualTermPlural: workspace?.labels?.individualTermPlural - ? capitalize(workspace.labels.individualTermPlural) - : 'Clients', - groupTerm: workspace?.labels?.groupTerm ? capitalize(workspace.labels.groupTerm) : 'Company', - groupTermPlural: workspace?.labels?.groupTermPlural ? capitalize(workspace.labels.groupTermPlural) : 'Companies', - } - : { - individualTerm: workspace?.labels?.individualTerm ? deCapitalize(workspace.labels.individualTerm) : 'client', - individualTermPlural: workspace?.labels?.individualTermPlural - ? deCapitalize(workspace.labels.individualTermPlural) - : 'clients', - groupTerm: workspace?.labels?.groupTerm ? deCapitalize(workspace.labels.groupTerm) : 'company', - groupTermPlural: workspace?.labels?.groupTermPlural ? deCapitalize(workspace.labels.groupTermPlural) : 'companies', - }; +export const getWorkspaceLabels = (workspace?: WorkspaceResponse, shouldCapitalize: boolean = false): WorkspaceLabels => { + const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); + const deCapitalize = (str: string) => str.charAt(0).toLowerCase() + str.slice(1); - return labels; + const format = (value: string | undefined, fallback: string) => { + if (!value) return shouldCapitalize ? capitalize(fallback) : deCapitalize(fallback); + return shouldCapitalize ? capitalize(value) : deCapitalize(value); + }; + + return { + individualTerm: format(workspace?.labels?.individualTerm, 'client'), + individualTermPlural: format(workspace?.labels?.individualTermPlural, 'clients'), + groupTerm: format(workspace?.labels?.groupTerm, 'company'), + groupTermPlural: format(workspace?.labels?.groupTermPlural, 'companies'), + }; };