384 update the input of the record show page inside the command menu (#10213)

Created a new component `RecordTitleCell` with an API close to
`RecordInlineCell`.
This new component is an autogrowing input. 
It consumes the `FieldContext`. It uses some hooks and states from
`RecordInlineCell` because I didn't want to duplicate all the logic, but
this logic could be duplicated.

Two issues that I didn't solve in this PR:
- There is a flashing glitch inside the input when typing
- The input of a workflow isn't focused when creating a new one. This is
because of an issue with the `useHotkeyScopeOnMount` hook which is
deprecated but still used in some components. Upon redirection on the
workflow showpage, the hokey scope of the input is overridden by the
hokey scopes of the components which use `useHotkeyScopeOnMount`. I
decided not to open the input for now.

## Command menu record show page

### Single input


https://github.com/user-attachments/assets/50dc235c-8f34-4445-8b04-586125606bd5

### Double input


https://github.com/user-attachments/assets/bdcfd6eb-d25e-4006-a87f-6e615e8a6e7e

## Workflow breadcrumb


https://github.com/user-attachments/assets/ded38dd6-5794-4779-a4ae-b3948567595a

## Record show page

### Single input


https://github.com/user-attachments/assets/8ad7a606-556a-416b-8788-93415f7989e1

### Double input


https://github.com/user-attachments/assets/55aae40b-36ae-40f1-8171-06f1a5db3532
This commit is contained in:
Raphaël Bosi
2025-02-14 12:33:18 +00:00
committed by GitHub
parent a4a085392d
commit 80c55b4462
85 changed files with 1415 additions and 757 deletions
@@ -1,26 +1,35 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
import { EditableBreadcrumbItem } from '@/ui/navigation/bread-crumb/components/EditableBreadcrumbItem';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions';
import { RecordTitleCell } from '@/object-record/record-title-cell/components/RecordTitleCell';
import styled from '@emotion/styled';
import { capitalize } from 'twenty-shared';
import { FieldMetadataType, capitalize } from 'twenty-shared';
const StyledEditableTitleContainer = styled.div`
align-items: center;
display: flex;
flex-direction: row;
overflow-x: hidden;
width: 100%;
`;
const StyledEditableTitlePrefix = styled.div`
color: ${({ theme }) => theme.font.color.tertiary};
display: flex;
flex: 1 0 auto;
flex-direction: row;
gap: ${({ theme }) => theme.spacing(1)};
padding: ${({ theme }) => theme.spacing(0.75)};
`;
const StyledTitle = styled.div`
max-width: 100%;
overflow: hidden;
padding-right: ${({ theme }) => theme.spacing(1)};
width: fit-content;
`;
export const ObjectRecordShowPageBreadcrumb = ({
objectNameSingular,
objectRecordId,
@@ -40,22 +49,12 @@ export const ObjectRecordShowPageBreadcrumb = ({
},
});
const { updateOneRecord } = useUpdateOneRecord({
const { useUpdateOneObjectRecordMutation } = useRecordShowContainerActions({
objectNameSingular,
recordGqlFields: {
[labelIdentifierFieldMetadataItem?.name ?? 'name']: true,
},
objectRecordId,
recordFromStore: record ?? null,
});
const handleSubmit = (value: string) => {
updateOneRecord({
idToUpdate: objectRecordId,
updateOneRecordInput: {
name: value,
},
});
};
if (loading) {
return null;
}
@@ -66,13 +65,35 @@ export const ObjectRecordShowPageBreadcrumb = ({
{capitalize(objectLabelPlural)}
<span>{' / '}</span>
</StyledEditableTitlePrefix>
<EditableBreadcrumbItem
defaultValue={record?.name ?? ''}
noValuePlaceholder={labelIdentifierFieldMetadataItem?.label ?? 'Name'}
placeholder={labelIdentifierFieldMetadataItem?.label ?? 'Name'}
onSubmit={handleSubmit}
hotkeyScope="editable-breadcrumb-item"
/>
<StyledTitle>
<FieldContext.Provider
value={{
recordId: objectRecordId,
recoilScopeId:
objectRecordId + labelIdentifierFieldMetadataItem?.id,
isLabelIdentifier: false,
fieldDefinition: {
type:
labelIdentifierFieldMetadataItem?.type ||
FieldMetadataType.TEXT,
iconName: '',
fieldMetadataId: labelIdentifierFieldMetadataItem?.id ?? '',
label: labelIdentifierFieldMetadataItem?.label || '',
metadata: {
fieldName: labelIdentifierFieldMetadataItem?.name || '',
objectMetadataNameSingular: objectNameSingular,
},
defaultValue: labelIdentifierFieldMetadataItem?.defaultValue,
},
useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isCentered: false,
isDisplayModeFixHeight: true,
}}
>
<RecordTitleCell sizeVariant="sm" />
</FieldContext.Provider>
</StyledTitle>
</StyledEditableTitleContainer>
);
};
@@ -7,11 +7,13 @@ import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/
import { RightDrawerTitleRecordInlineCell } from '@/object-record/record-right-drawer/components/RightDrawerTitleRecordInlineCell';
import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions';
import { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData';
import { RecordTitleCell } from '@/object-record/record-title-cell/components/RecordTitleCell';
import { ShowPageSummaryCard } from '@/ui/layout/show-page/components/ShowPageSummaryCard';
import { ShowPageSummaryCardSkeletonLoader } from '@/ui/layout/show-page/components/ShowPageSummaryCardSkeletonLoader';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { isDefined } from 'twenty-shared';
import { FieldMetadataType } from '~/generated/graphql';
import { FeatureFlagKey, FieldMetadataType } from '~/generated/graphql';
type SummaryCardProps = {
objectNameSingular: string;
@@ -53,6 +55,10 @@ export const SummaryCard = ({
isRecordDeleted: recordFromStore?.isDeleted,
});
const isCommandMenuV2Enabled = useIsFeatureEnabled(
FeatureFlagKey.IsCommandMenuV2Enabled,
);
if (isNewRightDrawerItemLoading || !isDefined(recordFromStore)) {
return <ShowPageSummaryCardSkeletonLoader />;
}
@@ -93,7 +99,9 @@ export const SummaryCard = ({
isDisplayModeFixHeight: true,
}}
>
{isInRightDrawer ? (
{isCommandMenuV2Enabled ? (
<RecordTitleCell sizeVariant="md" />
) : isInRightDrawer ? (
<RightDrawerTitleRecordInlineCell />
) : (
<RecordInlineCell readonly={isReadOnly} />
@@ -5,7 +5,7 @@ import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-ce
import { useSelectedTableCellEditMode } from '@/object-record/record-table/record-table-cell/hooks/useSelectedTableCellEditMode';
import { recordTablePendingRecordIdByGroupComponentFamilyState } from '@/object-record/record-table/states/recordTablePendingRecordIdByGroupComponentFamilyState';
import { recordTablePendingRecordIdComponentState } from '@/object-record/record-table/states/recordTablePendingRecordIdComponentState';
import { isUpdatingRecordEditableNameState } from '@/object-record/states/isUpdatingRecordEditableName';
import { useRecordTitleCell } from '@/object-record/record-title-cell/hooks/useRecordTitleCell';
import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropdownFocusIdForRecordField';
import { shouldRedirectToShowPageOnCreation } from '@/object-record/utils/shouldRedirectToShowPageOnCreation';
import { AppPath } from '@/types/AppPath';
@@ -60,67 +60,59 @@ export const useCreateNewTableRecord = ({
const navigate = useNavigateApp();
const createNewTableRecord = useRecoilCallback(
({ set }) =>
async () => {
const recordId = v4();
const { openRecordTitleCell } = useRecordTitleCell();
if (isCommandMenuV2Enabled) {
// TODO: Generalize this behaviour, there will be a view setting to specify
// if the new record should be displayed in the side panel or on the record page
if (
shouldRedirectToShowPageOnCreation(objectMetadataItem.nameSingular)
) {
await createOneRecord({
id: recordId,
name: 'Untitled',
});
const createNewTableRecord = async () => {
const recordId = v4();
navigate(AppPath.RecordShowPage, {
objectNameSingular: objectMetadataItem.nameSingular,
objectRecordId: recordId,
});
if (isCommandMenuV2Enabled) {
// TODO: Generalize this behaviour, there will be a view setting to specify
// if the new record should be displayed in the side panel or on the record page
if (shouldRedirectToShowPageOnCreation(objectMetadataItem.nameSingular)) {
await createOneRecord({
id: recordId,
name: 'Untitled',
});
set(isUpdatingRecordEditableNameState, true);
return;
}
navigate(AppPath.RecordShowPage, {
objectNameSingular: objectMetadataItem.nameSingular,
objectRecordId: recordId,
});
await createOneRecord({ id: recordId });
openRecordInCommandMenu(recordId, objectMetadataItem.nameSingular);
// TODO: we should open the record title cell here but because
// we are redirecting to the record show page, the hotkey scope will
// be overridden by the hotkey scope on mount. We need to deprecate
// the useHotkeyScopeOnMount hook.
return;
}
return;
}
setPendingRecordId(recordId);
setSelectedTableCellEditMode(-1, 0);
setHotkeyScope(
DEFAULT_CELL_SCOPE.scope,
DEFAULT_CELL_SCOPE.customScopes,
);
await createOneRecord({ id: recordId });
if (isDefined(objectMetadataItem.labelIdentifierFieldMetadataId)) {
setActiveDropdownFocusIdAndMemorizePrevious(
getDropdownFocusIdForRecordField(
recordId,
objectMetadataItem.labelIdentifierFieldMetadataId,
'table-cell',
),
);
}
},
[
createOneRecord,
isCommandMenuV2Enabled,
navigate,
objectMetadataItem.labelIdentifierFieldMetadataId,
objectMetadataItem.nameSingular,
openRecordInCommandMenu,
setActiveDropdownFocusIdAndMemorizePrevious,
setHotkeyScope,
setPendingRecordId,
setSelectedTableCellEditMode,
],
);
openRecordInCommandMenu(recordId, objectMetadataItem.nameSingular);
openRecordTitleCell({
recordId,
fieldMetadataId: objectMetadataItem.labelIdentifierFieldMetadataId,
});
return;
}
setPendingRecordId(recordId);
setSelectedTableCellEditMode(-1, 0);
setHotkeyScope(DEFAULT_CELL_SCOPE.scope, DEFAULT_CELL_SCOPE.customScopes);
if (isDefined(objectMetadataItem.labelIdentifierFieldMetadataId)) {
setActiveDropdownFocusIdAndMemorizePrevious(
getDropdownFocusIdForRecordField(
recordId,
objectMetadataItem.labelIdentifierFieldMetadataId,
'table-cell',
),
);
}
};
const createNewTableRecordInGroup = useRecoilCallback(
({ set }) =>
@@ -0,0 +1,109 @@
import { useContext } from 'react';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { FieldFocusContextProvider } from '@/object-record/record-field/contexts/FieldFocusContextProvider';
import { useIsFieldInputOnly } from '@/object-record/record-field/hooks/useIsFieldInputOnly';
import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { useInlineCell } from '../../record-inline-cell/hooks/useInlineCell';
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/meta-types/input/components/DateTimeFieldInput';
import { RecordTitleCellContainer } from '@/object-record/record-title-cell/components/RecordTitleCellContainer';
import {
RecordTitleCellContext,
RecordTitleCellContextProps,
} from '@/object-record/record-title-cell/components/RecordTitleCellContext';
import { RecordTitleCellFieldDisplay } from '@/object-record/record-title-cell/components/RecordTitleCellFieldDisplay';
import { RecordTitleCellFieldInput } from '@/object-record/record-title-cell/components/RecordTitleCellFieldInput';
import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropdownFocusIdForRecordField';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { activeDropdownFocusIdState } from '@/ui/layout/dropdown/states/activeDropdownFocusIdState';
import { useRecoilCallback } from 'recoil';
type RecordTitleCellProps = {
loading?: boolean;
sizeVariant?: 'sm' | 'md';
};
export const RecordTitleCell = ({
loading,
sizeVariant,
}: RecordTitleCellProps) => {
const { fieldDefinition, recordId } = useContext(FieldContext);
const isFieldInputOnly = useIsFieldInputOnly();
const { closeInlineCell } = useInlineCell();
const handleEnter: FieldInputEvent = (persistField) => {
persistField();
closeInlineCell();
};
const handleEscape = () => {
closeInlineCell();
};
const handleTab: FieldInputEvent = (persistField) => {
persistField();
closeInlineCell();
};
const handleShiftTab: FieldInputEvent = (persistField) => {
persistField();
closeInlineCell();
};
const handleClickOutside: FieldInputClickOutsideEvent = useRecoilCallback(
({ snapshot }) =>
(persistField, event) => {
const recordFieldDropdownId = getDropdownFocusIdForRecordField(
recordId,
fieldDefinition.fieldMetadataId,
'inline-cell',
);
const activeDropdownFocusId = snapshot
.getLoadable(activeDropdownFocusIdState)
.getValue();
if (recordFieldDropdownId !== activeDropdownFocusId) {
return;
}
event.stopImmediatePropagation();
persistField();
closeInlineCell();
},
[closeInlineCell, fieldDefinition.fieldMetadataId, recordId],
);
const recordTitleCellContextValue: RecordTitleCellContextProps = {
editModeContent: (
<RecordTitleCellFieldInput
recordFieldInputId={getRecordFieldInputId(
recordId,
fieldDefinition?.metadata?.fieldName,
)}
onEnter={handleEnter}
onEscape={handleEscape}
onTab={handleTab}
onShiftTab={handleShiftTab}
onClickOutside={handleClickOutside}
sizeVariant={sizeVariant}
/>
),
displayModeContent: <RecordTitleCellFieldDisplay />,
editModeContentOnly: isFieldInputOnly,
loading: loading,
};
return (
<FieldFocusContextProvider>
<RecordTitleCellContext.Provider value={recordTitleCellContextValue}>
<RecordTitleCellContainer />
</RecordTitleCellContext.Provider>
</FieldFocusContextProvider>
);
};
@@ -0,0 +1,13 @@
import { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell';
import { RecordTitleCellContext } from '@/object-record/record-title-cell/components/RecordTitleCellContext';
import { useContext } from 'react';
export const RecordTitleCellContainer = () => {
const { displayModeContent, editModeContent } = useContext(
RecordTitleCellContext,
);
const { isInlineCellInEditMode } = useInlineCell();
return <>{isInlineCellInEditMode ? editModeContent : displayModeContent}</>;
};
@@ -0,0 +1,18 @@
import { createContext, ReactElement } from 'react';
export type RecordTitleCellContextProps = {
editModeContent?: ReactElement;
editModeContentOnly?: boolean;
displayModeContent?: ReactElement;
loading?: boolean;
};
const defaultRecordTitleCellContextProp: RecordTitleCellContextProps = {
editModeContent: undefined,
editModeContentOnly: false,
displayModeContent: undefined,
loading: false,
};
export const RecordTitleCellContext =
createContext<RecordTitleCellContextProps>(defaultRecordTitleCellContextProp);
@@ -0,0 +1,24 @@
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName';
import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText';
import { RecordTitleCellSingleTextDisplayMode } from '@/object-record/record-title-cell/components/RecordTitleCellTextFieldDisplay';
import { RecordTitleFullNameFieldDisplay } from '@/object-record/record-title-cell/components/RecordTitleFullNameFieldDisplay';
import { useContext } from 'react';
export const RecordTitleCellFieldDisplay = () => {
const { fieldDefinition } = useContext(FieldContext);
if (!isFieldText(fieldDefinition) && !isFieldFullName(fieldDefinition)) {
throw new Error('Field definition is not a text or full name field');
}
return (
<>
{isFieldText(fieldDefinition) ? (
<RecordTitleCellSingleTextDisplayMode />
) : isFieldFullName(fieldDefinition) ? (
<RecordTitleFullNameFieldDisplay />
) : null}
</>
);
};
@@ -0,0 +1,66 @@
import { useContext } from 'react';
import { RecordFieldInputScope } from '@/object-record/record-field/scopes/RecordFieldInputScope';
import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName';
import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText';
import { RecordTitleCellTextFieldInput } from '@/object-record/record-title-cell/components/RecordTitleCellTextFieldInput';
import { RecordTitleFullNameFieldInput } from '@/object-record/record-title-cell/components/RecordTitleFullNameFieldInput';
type RecordTitleCellFieldInputProps = {
recordFieldInputId: string;
onClickOutside?: (
persist: () => void,
event: MouseEvent | TouchEvent,
) => void;
onEnter?: FieldInputEvent;
onEscape?: FieldInputEvent;
onTab?: FieldInputEvent;
onShiftTab?: FieldInputEvent;
sizeVariant?: 'sm' | 'md';
};
export const RecordTitleCellFieldInput = ({
sizeVariant,
recordFieldInputId,
onEnter,
onEscape,
onShiftTab,
onTab,
onClickOutside,
}: RecordTitleCellFieldInputProps) => {
const { fieldDefinition } = useContext(FieldContext);
if (!isFieldText(fieldDefinition) && !isFieldFullName(fieldDefinition)) {
throw new Error('Field definition is not a text or full name field');
}
return (
<RecordFieldInputScope
recordFieldInputScopeId={getScopeIdFromComponentId(recordFieldInputId)}
>
{isFieldText(fieldDefinition) ? (
<RecordTitleCellTextFieldInput
onEnter={onEnter}
onEscape={onEscape}
onClickOutside={onClickOutside}
onTab={onTab}
onShiftTab={onShiftTab}
sizeVariant={sizeVariant}
/>
) : isFieldFullName(fieldDefinition) ? (
<RecordTitleFullNameFieldInput
onEnter={onEnter}
onEscape={onEscape}
onClickOutside={onClickOutside}
onTab={onTab}
onShiftTab={onShiftTab}
sizeVariant={sizeVariant}
/>
) : null}
</RecordFieldInputScope>
);
};
@@ -0,0 +1,40 @@
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell';
import { useRecordValue } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext';
import styled from '@emotion/styled';
import { useContext } from 'react';
import { OverflowingTextWithTooltip } from 'twenty-ui';
const StyledDiv = styled.div`
align-items: center;
background: inherit;
border: none;
border-radius: ${({ theme }) => theme.border.radius.sm};
color: ${({ theme }) => theme.font.color.primary};
cursor: pointer;
overflow: hidden;
height: 28px;
line-height: 28px;
:hover {
background: ${({ theme }) => theme.background.transparent.light};
}
`;
export const RecordTitleCellSingleTextDisplayMode = () => {
const { recordId, fieldDefinition } = useContext(FieldContext);
const recordValue = useRecordValue(recordId);
const { openInlineCell } = useInlineCell();
return (
<StyledDiv onClick={() => openInlineCell()}>
<OverflowingTextWithTooltip
text={
recordValue?.[fieldDefinition.metadata.fieldName] ||
fieldDefinition.label
}
/>
</StyledDiv>
);
};
@@ -0,0 +1,78 @@
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useTextField } from '@/object-record/record-field/meta-types/hooks/useTextField';
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/meta-types/input/components/DateTimeFieldInput';
import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents';
import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { TextInputV2 } from '@/ui/input/components/TextInputV2';
import { useRef } from 'react';
import { isDefined } from 'twenty-shared';
import { turnIntoUndefinedIfWhitespacesOnly } from '~/utils/string/turnIntoUndefinedIfWhitespacesOnly';
type RecordTitleCellTextFieldInputProps = {
onClickOutside?: FieldInputClickOutsideEvent;
onEnter?: FieldInputEvent;
onEscape?: FieldInputEvent;
onTab?: FieldInputEvent;
onShiftTab?: FieldInputEvent;
sizeVariant?: 'sm' | 'md';
};
export const RecordTitleCellTextFieldInput = ({
sizeVariant,
onEnter,
onEscape,
onClickOutside,
onTab,
onShiftTab,
}: RecordTitleCellTextFieldInputProps) => {
const { fieldDefinition, draftValue, hotkeyScope, setDraftValue } =
useTextField();
const wrapperRef = useRef<HTMLInputElement>(null);
const handleChange = (newText: string) => {
setDraftValue(turnIntoUndefinedIfWhitespacesOnly(newText));
};
const persistField = usePersistField();
useRegisterInputEvents<string>({
inputRef: wrapperRef,
inputValue: draftValue ?? '',
onEnter: (inputValue) => {
onEnter?.(() => persistField(inputValue));
},
onEscape: (inputValue) => {
onEscape?.(() => persistField(inputValue));
},
onClickOutside: (event, inputValue) => {
onClickOutside?.(() => persistField(inputValue), event);
},
onTab: (inputValue) => {
onTab?.(() => persistField(inputValue));
},
onShiftTab: (inputValue) => {
onShiftTab?.(() => persistField(inputValue));
},
hotkeyScope,
});
const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {
if (isDefined(draftValue)) {
event.target.select();
}
};
return (
<TextInputV2
autoGrow
sizeVariant={sizeVariant}
inheritFontStyles
value={draftValue ?? ''}
onChange={handleChange}
placeholder={fieldDefinition.label}
onFocus={handleFocus}
autoFocus
/>
);
};
@@ -0,0 +1,235 @@
import styled from '@emotion/styled';
import { ClipboardEvent, useEffect, useRef, useState } from 'react';
import { Key } from 'ts-key-enum';
import { FieldDoubleText } from '@/object-record/record-field/types/FieldDoubleText';
import { TextInputV2 } from '@/ui/input/components/TextInputV2';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
import { isDefined } from 'twenty-shared';
import { splitFullName } from '~/utils/format/spiltFullName';
import { turnIntoEmptyStringIfWhitespacesOnly } from '~/utils/string/turnIntoEmptyStringIfWhitespacesOnly';
const StyledContainer = styled.div`
display: flex;
gap: ${({ theme }) => theme.spacing(1)};
justify-content: inherit;
width: 100%;
`;
const StyledTextInputWrapper = styled.div`
max-width: 50%;
`;
type RecordTitleDoubleTextInputProps = {
firstValue: string;
secondValue: string;
firstValuePlaceholder: string;
secondValuePlaceholder: string;
hotkeyScope: string;
onEnter: (newDoubleTextValue: FieldDoubleText) => void;
onEscape: (newDoubleTextValue: FieldDoubleText) => void;
onTab?: (newDoubleTextValue: FieldDoubleText) => void;
onShiftTab?: (newDoubleTextValue: FieldDoubleText) => void;
onClickOutside: (
event: MouseEvent | TouchEvent,
newDoubleTextValue: FieldDoubleText,
) => void;
onChange?: (newDoubleTextValue: FieldDoubleText) => void;
onPaste?: (newDoubleTextValue: FieldDoubleText) => void;
sizeVariant?: 'sm' | 'md';
};
export const RecordTitleDoubleTextInput = ({
firstValue,
secondValue,
firstValuePlaceholder,
secondValuePlaceholder,
hotkeyScope,
onClickOutside,
onEnter,
onEscape,
onShiftTab,
onTab,
onChange,
onPaste,
sizeVariant,
}: RecordTitleDoubleTextInputProps) => {
const [firstInternalValue, setFirstInternalValue] = useState(firstValue);
const [secondInternalValue, setSecondInternalValue] = useState(secondValue);
const firstValueInputRef = useRef<HTMLInputElement>(null);
const secondValueInputRef = useRef<HTMLInputElement>(null);
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
setFirstInternalValue(firstValue);
setSecondInternalValue(secondValue);
}, [firstValue, secondValue]);
const handleChange = (
newFirstValue: string,
newSecondValue: string,
): void => {
setFirstInternalValue(newFirstValue);
setSecondInternalValue(newSecondValue);
onChange?.({
firstValue: newFirstValue,
secondValue: newSecondValue,
});
};
const [focusPosition, setFocusPosition] = useState<'left' | 'right'>('left');
useScopedHotkeys(
Key.Enter,
() => {
onEnter({
firstValue: firstInternalValue,
secondValue: secondInternalValue,
});
},
hotkeyScope,
[onEnter, firstInternalValue, secondInternalValue],
);
useScopedHotkeys(
[Key.Escape],
() => {
onEscape({
firstValue: firstInternalValue,
secondValue: secondInternalValue,
});
},
hotkeyScope,
[onEscape, firstInternalValue, secondInternalValue],
);
useScopedHotkeys(
'tab',
() => {
if (focusPosition === 'left') {
setFocusPosition('right');
secondValueInputRef.current?.focus();
} else {
onTab?.({
firstValue: firstInternalValue,
secondValue: secondInternalValue,
});
}
},
hotkeyScope,
[onTab, firstInternalValue, secondInternalValue, focusPosition],
);
useScopedHotkeys(
'shift+tab',
() => {
if (focusPosition === 'right') {
setFocusPosition('left');
firstValueInputRef.current?.focus();
} else {
onShiftTab?.({
firstValue: firstInternalValue,
secondValue: secondInternalValue,
});
}
},
hotkeyScope,
[onShiftTab, firstInternalValue, secondInternalValue, focusPosition],
);
useListenClickOutside({
refs: [containerRef],
callback: (event) => {
onClickOutside?.(event, {
firstValue: firstInternalValue,
secondValue: secondInternalValue,
});
},
enabled: isDefined(onClickOutside),
listenerId: 'record-title-double-text-input',
});
const handleOnPaste = (event: ClipboardEvent<HTMLInputElement>) => {
if (firstInternalValue.length > 0 || secondInternalValue.length > 0) {
return;
}
event.preventDefault();
const name = event.clipboardData.getData('Text');
const splittedName = splitFullName(name);
onPaste?.({
firstValue: splittedName[0],
secondValue: splittedName[1],
});
};
const handleClickToPreventParentClickEvents = (
event: React.MouseEvent<HTMLInputElement>,
) => {
event.stopPropagation();
event.preventDefault();
};
return (
<StyledContainer ref={containerRef}>
<StyledTextInputWrapper>
<TextInputV2
autoGrow
sizeVariant={sizeVariant}
autoComplete="off"
inheritFontStyles
autoFocus
onFocus={(event: React.FocusEvent<HTMLInputElement>) => {
if (isDefined(firstInternalValue)) {
event.target.select();
}
setFocusPosition('left');
}}
ref={firstValueInputRef}
placeholder={firstValuePlaceholder}
value={firstInternalValue}
onChange={(text: string) => {
handleChange(
turnIntoEmptyStringIfWhitespacesOnly(text),
secondInternalValue,
);
}}
onPaste={(event: ClipboardEvent<HTMLInputElement>) =>
handleOnPaste(event)
}
onClick={handleClickToPreventParentClickEvents}
/>
</StyledTextInputWrapper>
<StyledTextInputWrapper>
<TextInputV2
autoGrow
sizeVariant={sizeVariant}
autoComplete="off"
inheritFontStyles
onFocus={(event: React.FocusEvent<HTMLInputElement>) => {
if (isDefined(secondInternalValue)) {
event.target.select();
}
setFocusPosition('right');
}}
ref={secondValueInputRef}
placeholder={secondValuePlaceholder}
value={secondInternalValue}
onChange={(text: string) => {
handleChange(
firstInternalValue,
turnIntoEmptyStringIfWhitespacesOnly(text),
);
}}
onClick={handleClickToPreventParentClickEvents}
/>
</StyledTextInputWrapper>
</StyledContainer>
);
};
@@ -0,0 +1,43 @@
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useFullNameFieldDisplay } from '@/object-record/record-field/meta-types/hooks/useFullNameFieldDisplay';
import { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell';
import styled from '@emotion/styled';
import { isNonEmptyString } from '@sniptt/guards';
import { useContext } from 'react';
import { OverflowingTextWithTooltip } from 'twenty-ui';
const StyledDiv = styled.div`
align-items: center;
background: inherit;
border: none;
border-radius: ${({ theme }) => theme.border.radius.sm};
color: ${({ theme }) => theme.font.color.primary};
cursor: pointer;
overflow: hidden;
height: 28px;
line-height: 28px;
:hover {
background: ${({ theme }) => theme.background.transparent.light};
}
`;
export const RecordTitleFullNameFieldDisplay = () => {
const { fieldDefinition } = useContext(FieldContext);
const { openInlineCell } = useInlineCell();
const { fieldValue } = useFullNameFieldDisplay();
const content = [fieldValue?.firstName, fieldValue?.lastName]
.filter(isNonEmptyString)
.join(' ')
.trim();
return (
<StyledDiv onClick={() => openInlineCell()}>
<OverflowingTextWithTooltip
text={isNonEmptyString(content) ? content : fieldDefinition.label}
/>
</StyledDiv>
);
};
@@ -0,0 +1,102 @@
import { useFullNameField } from '@/object-record/record-field/meta-types/hooks/useFullNameField';
import {
FieldInputClickOutsideEvent,
FieldInputEvent,
} from '@/object-record/record-field/meta-types/input/components/DateTimeFieldInput';
import { FIRST_NAME_PLACEHOLDER_WITH_SPECIAL_CHARACTER_TO_AVOID_PASSWORD_MANAGERS } from '@/object-record/record-field/meta-types/input/constants/FirstNamePlaceholder';
import { LAST_NAME_PLACEHOLDER_WITH_SPECIAL_CHARACTER_TO_AVOID_PASSWORD_MANAGERS } from '@/object-record/record-field/meta-types/input/constants/LastNamePlaceholder';
import { isDoubleTextFieldEmpty } from '@/object-record/record-field/meta-types/input/utils/isDoubleTextFieldEmpty';
import { FieldDoubleText } from '@/object-record/record-field/types/FieldDoubleText';
import { RecordTitleDoubleTextInput } from './RecordTitleDoubleTextInput';
type RecordTitleFullNameFieldInputProps = {
onClickOutside?: FieldInputClickOutsideEvent;
onEnter?: FieldInputEvent;
onEscape?: FieldInputEvent;
onTab?: FieldInputEvent;
onShiftTab?: FieldInputEvent;
sizeVariant?: 'sm' | 'md';
};
export const RecordTitleFullNameFieldInput = ({
onEnter,
onEscape,
onClickOutside,
onTab,
onShiftTab,
sizeVariant,
}: RecordTitleFullNameFieldInputProps) => {
const { hotkeyScope, draftValue, setDraftValue, persistFullNameField } =
useFullNameField();
const convertToFullName = (newDoubleText: FieldDoubleText) => {
return {
firstName: newDoubleText.firstValue.trim(),
lastName: newDoubleText.secondValue.trim(),
};
};
const getRequiredDraftValueFromDoubleText = (
newDoubleText: FieldDoubleText,
) => {
return isDoubleTextFieldEmpty(newDoubleText)
? undefined
: convertToFullName(newDoubleText);
};
const handleEnter = (newDoubleText: FieldDoubleText) => {
onEnter?.(() => persistFullNameField(convertToFullName(newDoubleText)));
};
const handleEscape = (newDoubleText: FieldDoubleText) => {
onEscape?.(() => persistFullNameField(convertToFullName(newDoubleText)));
};
const handleClickOutside = (
event: MouseEvent | TouchEvent,
newDoubleText: FieldDoubleText,
) => {
onClickOutside?.(
() => persistFullNameField(convertToFullName(newDoubleText)),
event,
);
};
const handleTab = (newDoubleText: FieldDoubleText) => {
onTab?.(() => persistFullNameField(convertToFullName(newDoubleText)));
};
const handleShiftTab = (newDoubleText: FieldDoubleText) => {
onShiftTab?.(() => persistFullNameField(convertToFullName(newDoubleText)));
};
const handleChange = (newDoubleText: FieldDoubleText) => {
setDraftValue(getRequiredDraftValueFromDoubleText(newDoubleText));
};
const handlePaste = (newDoubleText: FieldDoubleText) => {
setDraftValue(getRequiredDraftValueFromDoubleText(newDoubleText));
};
return (
<RecordTitleDoubleTextInput
firstValue={draftValue?.firstName ?? ''}
secondValue={draftValue?.lastName ?? ''}
firstValuePlaceholder={
FIRST_NAME_PLACEHOLDER_WITH_SPECIAL_CHARACTER_TO_AVOID_PASSWORD_MANAGERS
}
secondValuePlaceholder={
LAST_NAME_PLACEHOLDER_WITH_SPECIAL_CHARACTER_TO_AVOID_PASSWORD_MANAGERS
}
onClickOutside={handleClickOutside}
onEnter={handleEnter}
onEscape={handleEscape}
onShiftTab={handleShiftTab}
onTab={handleTab}
onPaste={handlePaste}
hotkeyScope={hotkeyScope}
onChange={handleChange}
sizeVariant={sizeVariant}
/>
);
};
@@ -0,0 +1,73 @@
import { isInlineCellInEditModeScopedState } from '@/object-record/record-inline-cell/states/isInlineCellInEditModeScopedState';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { useGoBackToPreviousDropdownFocusId } from '@/ui/layout/dropdown/hooks/useGoBackToPreviousDropdownFocusId';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared';
export const useRecordTitleCell = () => {
const { goBackToPreviousDropdownFocusId } =
useGoBackToPreviousDropdownFocusId();
const {
setHotkeyScopeAndMemorizePreviousScope,
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
const closeRecordTitleCell = useRecoilCallback(
({ set }) =>
({
recordId,
fieldMetadataId,
}: {
recordId: string;
fieldMetadataId: string;
}) => {
set(
isInlineCellInEditModeScopedState(recordId + fieldMetadataId),
false,
);
goBackToPreviousHotkeyScope();
goBackToPreviousDropdownFocusId();
},
[goBackToPreviousDropdownFocusId, goBackToPreviousHotkeyScope],
);
const openRecordTitleCell = useRecoilCallback(
({ set }) =>
({
recordId,
fieldMetadataId,
customEditHotkeyScopeForField,
}: {
recordId: string;
fieldMetadataId: string;
customEditHotkeyScopeForField?: HotkeyScope;
}) => {
set(
isInlineCellInEditModeScopedState(recordId + fieldMetadataId),
true,
);
if (isDefined(customEditHotkeyScopeForField)) {
setHotkeyScopeAndMemorizePreviousScope(
customEditHotkeyScopeForField.scope,
customEditHotkeyScopeForField.customScopes,
);
} else {
setHotkeyScopeAndMemorizePreviousScope(
InlineCellHotkeyScope.InlineCell,
);
}
},
[setHotkeyScopeAndMemorizePreviousScope],
);
return {
closeRecordTitleCell,
openRecordTitleCell,
};
};
@@ -1,6 +0,0 @@
import { createState } from 'twenty-ui';
export const isUpdatingRecordEditableNameState = createState<boolean>({
key: 'isUpdatingRecordEditableNameState',
defaultValue: false,
});
@@ -1,10 +1,10 @@
import { InputErrorHelper } from '@/ui/input/components/InputErrorHelper';
import { InputLabel } from '@/ui/input/components/InputLabel';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import {
ChangeEvent,
FocusEventHandler,
ForwardedRef,
InputHTMLAttributes,
forwardRef,
useId,
@@ -19,7 +19,6 @@ import {
} from 'twenty-ui';
import { useCombinedRefs } from '~/hooks/useCombinedRefs';
import { turnIntoEmptyStringIfWhitespacesOnly } from '~/utils/string/turnIntoEmptyStringIfWhitespacesOnly';
import { InputErrorHelper } from '@/ui/input/components/InputErrorHelper';
const StyledContainer = styled.div<
Pick<TextInputV2ComponentProps, 'fullWidth'>
@@ -40,7 +39,12 @@ const StyledInputContainer = styled.div`
const StyledInput = styled.input<
Pick<
TextInputV2ComponentProps,
'LeftIcon' | 'error' | 'sizeVariant' | 'width'
| 'LeftIcon'
| 'error'
| 'sizeVariant'
| 'width'
| 'inheritFontStyles'
| 'autoGrow'
>
>`
background-color: ${({ theme }) => theme.background.transparent.lighter};
@@ -52,17 +56,30 @@ const StyledInput = styled.input<
color: ${({ theme }) => theme.font.color.primary};
display: flex;
flex-grow: 1;
font-family: ${({ theme }) => theme.font.family};
font-weight: ${({ theme }) => theme.font.weight.regular};
font-family: ${({ theme, inheritFontStyles }) =>
inheritFontStyles ? 'inherit' : theme.font.family};
font-size: ${({ theme, inheritFontStyles }) =>
inheritFontStyles ? 'inherit' : theme.font.size.md};
font-weight: ${({ theme, inheritFontStyles }) =>
inheritFontStyles ? 'inherit' : theme.font.weight.regular};
height: ${({ sizeVariant }) =>
sizeVariant === 'sm' ? '20px' : sizeVariant === 'md' ? '28px' : '32px'};
outline: none;
padding: ${({ theme, sizeVariant }) =>
sizeVariant === 'sm' ? `${theme.spacing(2)} 0` : theme.spacing(2)};
padding-left: ${({ theme, LeftIcon }) =>
LeftIcon ? `calc(${theme.spacing(3)} + 16px)` : theme.spacing(2)};
padding: ${({ theme, sizeVariant, autoGrow }) =>
autoGrow
? theme.spacing(1)
: sizeVariant === 'sm'
? `${theme.spacing(2)} 0`
: theme.spacing(2)};
padding-left: ${({ theme, LeftIcon, autoGrow }) =>
autoGrow
? theme.spacing(1)
: LeftIcon
? `calc(${theme.spacing(3)} + 16px)`
: theme.spacing(2)};
width: ${({ theme, width }) =>
width ? `calc(${width}px + ${theme.spacing(5)})` : '100%'};
width ? `calc(${width}px + ${theme.spacing(0.5)})` : '100%'};
max-width: ${({ autoGrow }) => (autoGrow ? '100%' : 'none')};
&::placeholder,
&::-webkit-input-placeholder {
@@ -144,149 +161,180 @@ export type TextInputV2ComponentProps = Omit<
onBlur?: FocusEventHandler<HTMLInputElement>;
dataTestId?: string;
sizeVariant?: TextInputV2Size;
inheritFontStyles?: boolean;
};
type TextInputV2WithAutoGrowWrapperProps = TextInputV2ComponentProps;
const TextInputV2Component = (
{
className,
label,
value,
onChange,
onFocus,
onBlur,
onKeyDown,
fullWidth,
width,
error,
noErrorHelper = false,
required,
type,
autoFocus,
placeholder,
disabled,
tabIndex,
RightIcon,
LeftIcon,
autoComplete,
maxLength,
sizeVariant = 'lg',
dataTestId,
}: TextInputV2ComponentProps,
// eslint-disable-next-line @nx/workspace-component-props-naming
ref: ForwardedRef<HTMLInputElement>,
): JSX.Element => {
const theme = useTheme();
const TextInputV2Component = forwardRef<
HTMLInputElement,
TextInputV2ComponentProps
>(
(
{
className,
label,
value,
onChange,
onFocus,
onBlur,
onKeyDown,
fullWidth,
width,
error,
noErrorHelper = false,
required,
type,
autoFocus,
placeholder,
disabled,
tabIndex,
RightIcon,
LeftIcon,
autoComplete,
maxLength,
sizeVariant = 'md',
inheritFontStyles = false,
dataTestId,
autoGrow = false,
},
ref,
) => {
const theme = useTheme();
const inputRef = useRef<HTMLInputElement>(null);
const combinedRef = useCombinedRefs(ref, inputRef);
const inputRef = useRef<HTMLInputElement>(null);
const combinedRef = useCombinedRefs(ref, inputRef);
const [passwordVisible, setPasswordVisible] = useState(false);
const [isFocused, setIsFocused] = useState(false);
const [passwordVisible, setPasswordVisible] = useState(false);
const [isFocused, setIsFocused] = useState(false);
const handleTogglePasswordVisibility = () => {
setPasswordVisible(!passwordVisible);
};
const handleTogglePasswordVisibility = () => {
setPasswordVisible(!passwordVisible);
};
const handleFocus: FocusEventHandler<HTMLInputElement> = (event) => {
setIsFocused(true);
onFocus?.(event);
};
const handleFocus: FocusEventHandler<HTMLInputElement> = (event) => {
setIsFocused(true);
onFocus?.(event);
};
const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {
setIsFocused(false);
onBlur?.(event);
};
const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {
setIsFocused(false);
onBlur?.(event);
};
const inputId = useId();
const inputId = useId();
return (
<StyledContainer className={className} fullWidth={fullWidth ?? false}>
{label && (
<InputLabel htmlFor={inputId}>
{label + (required ? '*' : '')}
</InputLabel>
)}
<StyledInputContainer>
{!!LeftIcon && (
<StyledLeftIconContainer sizeVariant={sizeVariant}>
<StyledTrailingIcon isFocused={isFocused}>
<LeftIcon size={theme.icon.size.md} />
</StyledTrailingIcon>
</StyledLeftIconContainer>
return (
<StyledContainer className={className} fullWidth={fullWidth ?? false}>
{label && (
<InputLabel htmlFor={inputId}>
{label + (required ? '*' : '')}
</InputLabel>
)}
<StyledInput
id={inputId}
width={width}
data-testid={dataTestId}
autoComplete={autoComplete || 'off'}
ref={combinedRef}
tabIndex={tabIndex ?? 0}
onFocus={handleFocus}
onBlur={handleBlur}
type={passwordVisible ? 'text' : type}
onChange={(event: ChangeEvent<HTMLInputElement>) => {
onChange?.(
turnIntoEmptyStringIfWhitespacesOnly(event.target.value),
);
}}
onKeyDown={onKeyDown}
{...{
autoFocus,
disabled,
placeholder,
required,
value,
LeftIcon,
maxLength,
error,
sizeVariant,
}}
/>
<StyledTrailingIconContainer {...{ error }}>
{!error && type === INPUT_TYPE_PASSWORD && (
<StyledTrailingIcon
onClick={handleTogglePasswordVisibility}
data-testid="reveal-password-button"
>
{passwordVisible ? (
<IconEyeOff size={theme.icon.size.md} />
) : (
<IconEye size={theme.icon.size.md} />
)}
</StyledTrailingIcon>
<StyledInputContainer>
{!!LeftIcon && (
<StyledLeftIconContainer sizeVariant={sizeVariant}>
<StyledTrailingIcon isFocused={isFocused}>
<LeftIcon size={theme.icon.size.md} />
</StyledTrailingIcon>
</StyledLeftIconContainer>
)}
{!error && type !== INPUT_TYPE_PASSWORD && !!RightIcon && (
<StyledTrailingIcon>
<RightIcon size={theme.icon.size.md} />
</StyledTrailingIcon>
)}
</StyledTrailingIconContainer>
</StyledInputContainer>
<InputErrorHelper isVisible={!noErrorHelper}>{error}</InputErrorHelper>
</StyledContainer>
);
};
const TextInputV2WithAutoGrowWrapper = (
props: TextInputV2WithAutoGrowWrapperProps,
) => (
<>
{props.autoGrow ? (
<ComputeNodeDimensions node={props.value || props.placeholder}>
{(nodeDimensions) => (
// eslint-disable-next-line
<TextInputV2Component {...props} width={nodeDimensions?.width} />
)}
</ComputeNodeDimensions>
) : (
// eslint-disable-next-line
<TextInputV2Component {...props} />
)}
</>
<StyledInput
id={inputId}
width={width}
data-testid={dataTestId}
autoComplete={autoComplete || 'off'}
ref={combinedRef}
tabIndex={tabIndex ?? 0}
onFocus={handleFocus}
onBlur={handleBlur}
type={passwordVisible ? 'text' : type}
onChange={(event: ChangeEvent<HTMLInputElement>) => {
onChange?.(
turnIntoEmptyStringIfWhitespacesOnly(event.target.value),
);
}}
onKeyDown={onKeyDown}
{...{
autoFocus,
disabled,
placeholder,
required,
value,
LeftIcon,
maxLength,
error,
sizeVariant,
inheritFontStyles,
autoGrow,
}}
/>
<StyledTrailingIconContainer {...{ error }}>
{!error && type === INPUT_TYPE_PASSWORD && (
<StyledTrailingIcon
onClick={handleTogglePasswordVisibility}
data-testid="reveal-password-button"
>
{passwordVisible ? (
<IconEyeOff size={theme.icon.size.md} />
) : (
<IconEye size={theme.icon.size.md} />
)}
</StyledTrailingIcon>
)}
{!error && type !== INPUT_TYPE_PASSWORD && !!RightIcon && (
<StyledTrailingIcon>
<RightIcon size={theme.icon.size.md} />
</StyledTrailingIcon>
)}
</StyledTrailingIconContainer>
</StyledInputContainer>
<InputErrorHelper isVisible={!noErrorHelper}>{error}</InputErrorHelper>
</StyledContainer>
);
},
);
export const TextInputV2 = forwardRef(TextInputV2WithAutoGrowWrapper);
const StyledComputeNodeDimensions = styled(ComputeNodeDimensions)<{
sizeVariant?: TextInputV2Size;
}>`
border: 1px solid transparent;
height: ${({ sizeVariant }) =>
sizeVariant === 'sm' ? '20px' : sizeVariant === 'md' ? '28px' : '32px'};
padding: 0 ${({ theme }) => theme.spacing(1)};
box-sizing: border-box;
`;
const TextInputV2WithAutoGrowWrapper = forwardRef<
HTMLInputElement,
TextInputV2WithAutoGrowWrapperProps
>((props, ref) => {
return (
<>
{props.autoGrow ? (
<StyledComputeNodeDimensions
sizeVariant={props.sizeVariant}
node={props.value || props.placeholder}
>
{(nodeDimensions) => (
<TextInputV2Component
// eslint-disable-next-line react/jsx-props-no-spreading
{...props}
ref={ref}
width={nodeDimensions?.width}
/>
)}
</StyledComputeNodeDimensions>
) : (
<TextInputV2Component
// eslint-disable-next-line react/jsx-props-no-spreading
{...props}
ref={ref}
/>
)}
</>
);
});
export const TextInputV2 = TextInputV2WithAutoGrowWrapper;
@@ -49,7 +49,7 @@ const StyledLeftContainer = styled.div`
gap: ${({ theme }) => theme.spacing(1)};
padding-left: ${({ theme }) => theme.spacing(1)};
overflow-x: hidden;
width: 100%;
@media (max-width: ${MOBILE_VIEWPORT}px) {
padding-left: ${({ theme }) => theme.spacing(1)};
}
@@ -60,6 +60,8 @@ const StyledTitleContainer = styled.div`
font-size: ${({ theme }) => theme.font.size.md};
font-weight: ${({ theme }) => theme.font.weight.medium};
margin-left: ${({ theme }) => theme.spacing(1)};
width: 100%;
overflow: hidden;
`;
const StyledTopBarIconStyledTitleContainer = styled.div`
@@ -67,6 +69,8 @@ const StyledTopBarIconStyledTitleContainer = styled.div`
display: flex;
gap: ${({ theme }) => theme.spacing(1)};
flex-direction: row;
width: 100%;
overflow: hidden;
`;
const StyledPageActionContainer = styled.div`
@@ -81,10 +85,9 @@ const StyledTopBarButtonContainer = styled.div`
`;
const StyledIconContainer = styled.div`
flex: 1 0 1;
align-items: center;
display: flex;
flex-direction: row;
align-items: center;
`;
type PageHeaderProps = {
@@ -62,7 +62,7 @@ const StyledTitle = styled.div<{ isMobile: boolean }>`
font-size: ${({ theme }) => theme.font.size.xl};
font-weight: ${({ theme }) => theme.font.weight.semiBold};
justify-content: ${({ isMobile }) => (isMobile ? 'flex-start' : 'center')};
max-width: 90%;
width: 90%;
`;
const StyledAvatarWrapper = styled.div<{ isAvatarEditable: boolean }>`
@@ -1,119 +0,0 @@
import { isUpdatingRecordEditableNameState } from '@/object-record/states/isUpdatingRecordEditableName';
import { TextInputV2 } from '@/ui/input/components/TextInputV2';
import { useOpenEditableBreadCrumbItem } from '@/ui/navigation/bread-crumb/hooks/useOpenEditableBreadCrumbItem';
import { EditableBreadcrumbItemHotkeyScope } from '@/ui/navigation/bread-crumb/types/EditableBreadcrumbItemHotkeyScope';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
import styled from '@emotion/styled';
import { useRef, useState } from 'react';
import { useRecoilState } from 'recoil';
import { Key } from 'ts-key-enum';
import { isDefined } from 'twenty-shared';
import { useHotkeyScopeOnMount } from '~/hooks/useHotkeyScopeOnMount';
type EditableBreadcrumbItemProps = {
className?: string;
defaultValue: string;
noValuePlaceholder?: string;
placeholder: string;
onSubmit: (value: string) => void;
hotkeyScope: string;
};
const StyledButton = styled('button')`
align-items: center;
background: inherit;
border: none;
border-radius: ${({ theme }) => theme.border.radius.sm};
box-sizing: content-box;
color: ${({ theme }) => theme.font.color.primary};
cursor: pointer;
display: flex;
font-family: ${({ theme }) => theme.font.family};
font-size: ${({ theme }) => theme.font.size.md};
height: 20px;
overflow: hidden;
text-decoration: none;
text-overflow: ellipsis;
white-space: nowrap;
:hover {
background: ${({ theme }) => theme.background.transparent.light};
}
`;
export const EditableBreadcrumbItem = ({
className,
defaultValue,
noValuePlaceholder,
placeholder,
onSubmit,
}: EditableBreadcrumbItemProps) => {
const inputRef = useRef<HTMLInputElement>(null);
const buttonRef = useRef<HTMLButtonElement>(null);
const [isUpdatingRecordEditableName, setIsUpdatingRecordEditableName] =
useRecoilState(isUpdatingRecordEditableNameState);
// TODO: remove this and set the hokey scopes synchronously on page change inside the useNavigateApp hook
useHotkeyScopeOnMount(
EditableBreadcrumbItemHotkeyScope.EditableBreadcrumbItem,
);
useScopedHotkeys(
[Key.Escape],
() => {
setIsUpdatingRecordEditableName(false);
},
EditableBreadcrumbItemHotkeyScope.EditableBreadcrumbItem,
);
useScopedHotkeys(
[Key.Enter],
() => {
onSubmit(value);
setIsUpdatingRecordEditableName(false);
},
EditableBreadcrumbItemHotkeyScope.EditableBreadcrumbItem,
);
const clickOutsideRefs: Array<React.RefObject<HTMLElement>> = [
inputRef,
buttonRef,
];
useListenClickOutside({
refs: clickOutsideRefs,
callback: () => {
setIsUpdatingRecordEditableName(false);
},
listenerId: 'editable-breadcrumb-item',
});
const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {
if (isDefined(value)) {
event.target.select();
}
};
const [value, setValue] = useState<string>(defaultValue);
const { openEditableBreadCrumbItem } = useOpenEditableBreadCrumbItem();
return isUpdatingRecordEditableName ? (
<TextInputV2
className={className}
autoGrow
sizeVariant="sm"
ref={inputRef}
value={value}
onChange={setValue}
placeholder={placeholder}
onFocus={handleFocus}
autoFocus
/>
) : (
<StyledButton ref={buttonRef} onClick={openEditableBreadCrumbItem}>
{value || noValuePlaceholder}
</StyledButton>
);
};
@@ -1,68 +0,0 @@
import { expect, jest } from '@storybook/jest';
import { Meta, StoryObj } from '@storybook/react';
import { RecoilRoot } from 'recoil';
import { EditableBreadcrumbItemHotkeyScope } from '@/ui/navigation/bread-crumb/types/EditableBreadcrumbItemHotkeyScope';
import { findByText, userEvent } from '@storybook/test';
import { ComponentDecorator } from 'twenty-ui';
import { EditableBreadcrumbItem } from '../EditableBreadcrumbItem';
const onSubmit = jest.fn();
const meta: Meta<typeof EditableBreadcrumbItem> = {
title: 'UI/Navigation/BreadCrumb/EditableBreadcrumbItem',
component: EditableBreadcrumbItem,
decorators: [
(Story) => (
<RecoilRoot>
<Story />
</RecoilRoot>
),
ComponentDecorator,
],
args: {
defaultValue: 'Company Name',
placeholder: 'Enter name',
hotkeyScope: EditableBreadcrumbItemHotkeyScope.EditableBreadcrumbItem,
onSubmit,
},
};
export default meta;
type Story = StoryObj<typeof EditableBreadcrumbItem>;
export const Default: Story = {
args: {},
play: async ({ canvasElement }) => {
const button = await findByText(canvasElement, 'Company Name');
expect(button).toBeInTheDocument();
},
};
export const Editing: Story = {
args: {},
play: async ({ canvasElement }) => {
const button = canvasElement.querySelector('button');
await userEvent.click(button);
await new Promise((resolve) => setTimeout(resolve, 100));
await userEvent.keyboard('New Name');
await userEvent.keyboard('{Enter}');
expect(onSubmit).toHaveBeenCalledWith('New Name');
},
};
export const WithNoValue: Story = {
args: {
defaultValue: '',
noValuePlaceholder: 'Untitled',
},
play: async ({ canvasElement }) => {
const button = await findByText(canvasElement, 'Untitled');
expect(button).toBeInTheDocument();
},
};
@@ -1,19 +0,0 @@
import { isUpdatingRecordEditableNameState } from '@/object-record/states/isUpdatingRecordEditableName';
import { EditableBreadcrumbItemHotkeyScope } from '@/ui/navigation/bread-crumb/types/EditableBreadcrumbItemHotkeyScope';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { useSetRecoilState } from 'recoil';
export const useOpenEditableBreadCrumbItem = () => {
const setIsUpdatingRecordEditableName = useSetRecoilState(
isUpdatingRecordEditableNameState,
);
const setHotkeyScope = useSetHotkeyScope();
const openEditableBreadCrumbItem = () => {
setIsUpdatingRecordEditableName(true);
setHotkeyScope(EditableBreadcrumbItemHotkeyScope.EditableBreadcrumbItem);
};
return { openEditableBreadCrumbItem };
};
@@ -1,3 +0,0 @@
export enum EditableBreadcrumbItemHotkeyScope {
EditableBreadcrumbItem = 'editable-breadcrumb-item',
}
@@ -8,8 +8,8 @@ msgstr ""
"Language: af\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Afrikaans\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Jou spanlid verantwoordelik vir die bestuur van die maatskappy rekening"
@@ -8,8 +8,8 @@ msgstr ""
"Language: ar\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
@@ -1582,7 +1582,9 @@ msgstr "مؤشر التزامن"
#: src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts:269
msgid "Sync Cursor. Used for syncing events from the calendar provider"
msgstr "\n"
msgstr ""
"\n"
""
#: src/modules/messaging/common/standard-objects/message-channel.workspace-entity.ts:291
#: src/modules/messaging/common/standard-objects/message-channel.workspace-entity.ts:292
@@ -2251,4 +2253,3 @@ msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "العضو في فريقك المسئول عن إدارة حساب الشركة"
@@ -8,8 +8,8 @@ msgstr ""
"Language: ca\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "El teu membre de l'equip responsable de la gestió del compte de l'empresa"
@@ -8,8 +8,8 @@ msgstr ""
"Language: cs\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Člen vašeho týmu odpovědný za správu firemního účtu"
@@ -8,8 +8,8 @@ msgstr ""
"Language: da\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -1538,7 +1538,8 @@ msgstr "Køringer"
#: src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts:104
#: src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts:105
msgid "Scopes"
msgstr "R\n"
msgstr ""
"R\n"
"ettigheder"
#: src/engine/metadata-modules/constants/search-vector-field.constants.ts:5
@@ -2252,4 +2253,3 @@ msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Dit teammedlem ansvarlig for at forvalte virksomhedens konto"
@@ -8,8 +8,8 @@ msgstr ""
"Language: de\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Ihr Teammitglied, das für die Verwaltung des Unternehmenskontos verantwortlich ist"
@@ -8,8 +8,8 @@ msgstr ""
"Language: el\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "Χ"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Το μέλος της ομάδας σας υπεύθυνο για τη διαχείριση του λογαριασμού της εταιρείας"
@@ -37,7 +37,7 @@ msgstr "(System) View Sorts"
msgid "(System) Views"
msgstr "(System) Views"
#: src/modules/company/standard-objects/company.workspace-entity.ts:55
#: src/modules/company/standard-objects/company.workspace-entity.ts:56
msgid "A company"
msgstr "A company"
@@ -69,7 +69,7 @@ msgstr "A note"
msgid "A note target"
msgstr "A note target"
#: src/modules/person/standard-objects/person.workspace-entity.ts:59
#: src/modules/person/standard-objects/person.workspace-entity.ts:60
msgid "A person"
msgstr "A person"
@@ -111,7 +111,7 @@ msgstr "Access Token"
#: src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts:114
#: src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts:115
#: src/modules/company/standard-objects/company.workspace-entity.ts:176
#: src/modules/company/standard-objects/company.workspace-entity.ts:178
msgid "Account Owner"
msgstr "Account Owner"
@@ -123,19 +123,19 @@ msgstr "Account owner for companies"
msgid "Account Owner For Companies"
msgstr "Account Owner For Companies"
#: src/modules/company/standard-objects/company.workspace-entity.ts:123
#: src/modules/company/standard-objects/company.workspace-entity.ts:125
msgid "Address"
msgstr "Address"
#: src/modules/company/standard-objects/company.workspace-entity.ts:264
#: src/modules/company/standard-objects/company.workspace-entity.ts:266
msgid "Address (deprecated) "
msgstr "Address (deprecated) "
#: src/modules/company/standard-objects/company.workspace-entity.ts:124
#: src/modules/company/standard-objects/company.workspace-entity.ts:126
msgid "Address of the company"
msgstr "Address of the company"
#: src/modules/company/standard-objects/company.workspace-entity.ts:265
#: src/modules/company/standard-objects/company.workspace-entity.ts:267
msgid "Address of the company - deprecated in favor of new address field"
msgstr "Address of the company - deprecated in favor of new address field"
@@ -172,7 +172,7 @@ msgstr "An event related to user behavior"
msgid "An opportunity"
msgstr "An opportunity"
#: src/modules/company/standard-objects/company.workspace-entity.ts:114
#: src/modules/company/standard-objects/company.workspace-entity.ts:116
msgid "Annual Recurring Revenue: The actual or estimated annual revenue of the company"
msgstr "Annual Recurring Revenue: The actual or estimated annual revenue of the company"
@@ -196,7 +196,7 @@ msgstr "ApiKey name"
msgid "ApiKey revocation date"
msgstr "ApiKey revocation date"
#: src/modules/company/standard-objects/company.workspace-entity.ts:113
#: src/modules/company/standard-objects/company.workspace-entity.ts:115
msgid "ARR"
msgstr "ARR"
@@ -253,10 +253,10 @@ msgid "Attachment type"
msgstr "Attachment type"
#: src/modules/task/standard-objects/task.workspace-entity.ts:156
#: src/modules/person/standard-objects/person.workspace-entity.ts:238
#: src/modules/person/standard-objects/person.workspace-entity.ts:244
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:199
#: src/modules/note/standard-objects/note.workspace-entity.ts:118
#: src/modules/company/standard-objects/company.workspace-entity.ts:239
#: src/modules/company/standard-objects/company.workspace-entity.ts:241
#: src/modules/attachment/standard-objects/attachment.workspace-entity.ts:31
#: src/engine/twenty-orm/custom.workspace-entity.ts:118
msgid "Attachments"
@@ -266,11 +266,11 @@ msgstr "Attachments"
msgid "Attachments created by the workspace member"
msgstr "Attachments created by the workspace member"
#: src/modules/company/standard-objects/company.workspace-entity.ts:240
#: src/modules/company/standard-objects/company.workspace-entity.ts:242
msgid "Attachments linked to the company"
msgstr "Attachments linked to the company"
#: src/modules/person/standard-objects/person.workspace-entity.ts:239
#: src/modules/person/standard-objects/person.workspace-entity.ts:245
msgid "Attachments linked to the contact."
msgstr "Attachments linked to the contact."
@@ -316,7 +316,7 @@ msgstr "Automatically create People records when receiving or sending emails"
msgid "Automatically create records for people you participated with in an event."
msgstr "Automatically create records for people you participated with in an event."
#: src/modules/person/standard-objects/person.workspace-entity.ts:146
#: src/modules/person/standard-objects/person.workspace-entity.ts:152
msgid "Avatar"
msgstr "Avatar"
@@ -396,8 +396,8 @@ msgstr "Calendar event participants"
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:228
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:229
#: src/modules/person/standard-objects/person.workspace-entity.ts:262
#: src/modules/person/standard-objects/person.workspace-entity.ts:263
#: src/modules/person/standard-objects/person.workspace-entity.ts:268
#: src/modules/person/standard-objects/person.workspace-entity.ts:269
msgid "Calendar Event Participants"
msgstr "Calendar Event Participants"
@@ -415,7 +415,7 @@ msgstr "Channel ID"
msgid "Channel Type"
msgstr "Channel Type"
#: src/modules/person/standard-objects/person.workspace-entity.ts:137
#: src/modules/person/standard-objects/person.workspace-entity.ts:143
msgid "City"
msgstr "City"
@@ -431,22 +431,22 @@ msgstr "Color Scheme"
msgid "Compact View"
msgstr "Compact View"
#: src/modules/company/standard-objects/company.workspace-entity.ts:54
#: src/modules/company/standard-objects/company.workspace-entity.ts:55
msgid "Companies"
msgstr "Companies"
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:134
#: src/modules/task/standard-objects/task-target.workspace-entity.ts:65
#: src/modules/person/standard-objects/person.workspace-entity.ts:177
#: src/modules/person/standard-objects/person.workspace-entity.ts:183
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:148
#: src/modules/note/standard-objects/note-target.workspace-entity.ts:65
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:88
#: src/modules/company/standard-objects/company.workspace-entity.ts:53
#: src/modules/company/standard-objects/company.workspace-entity.ts:54
#: src/modules/attachment/standard-objects/attachment.workspace-entity.ts:128
msgid "Company"
msgstr "Company"
#: src/modules/company/standard-objects/company.workspace-entity.ts:144
#: src/modules/company/standard-objects/company.workspace-entity.ts:146
msgid "Company record position"
msgstr "Company record position"
@@ -477,52 +477,57 @@ msgstr "Connected Accounts"
msgid "Contact auto creation policy"
msgstr "Contact auto creation policy"
#: src/modules/person/standard-objects/person.workspace-entity.ts:147
#: src/modules/person/standard-objects/person.workspace-entity.ts:153
msgid "Contacts avatar"
msgstr "Contacts avatar"
#: src/modules/person/standard-objects/person.workspace-entity.ts:138
#: src/modules/person/standard-objects/person.workspace-entity.ts:144
msgid "Contacts city"
msgstr "Contacts city"
#: src/modules/person/standard-objects/person.workspace-entity.ts:178
#: src/modules/person/standard-objects/person.workspace-entity.ts:184
msgid "Contacts company"
msgstr "Contacts company"
#: src/modules/person/standard-objects/person.workspace-entity.ts:80
#: src/modules/person/standard-objects/person.workspace-entity.ts:86
msgid "Contacts Emails"
msgstr "Contacts Emails"
#: src/modules/person/standard-objects/person.workspace-entity.ts:110
#: src/modules/person/standard-objects/person.workspace-entity.ts:116
msgid "Contacts job title"
msgstr "Contacts job title"
#: src/modules/person/standard-objects/person.workspace-entity.ts:90
#: src/modules/person/standard-objects/person.workspace-entity.ts:96
msgid "Contacts Linkedin account"
msgstr "Contacts Linkedin account"
#: src/modules/person/standard-objects/person.workspace-entity.ts:70
#: src/modules/person/standard-objects/person.workspace-entity.ts:76
msgid "Contacts name"
msgstr "Contacts name"
#: src/modules/person/standard-objects/person.workspace-entity.ts:119
#: src/modules/person/standard-objects/person.workspace-entity.ts:125
msgid "Contacts phone number"
msgstr "Contacts phone number"
#: src/modules/person/standard-objects/person.workspace-entity.ts:129
#: src/modules/person/standard-objects/person.workspace-entity.ts:135
msgid "Contacts phone numbers"
msgstr "Contacts phone numbers"
#: src/modules/person/standard-objects/person.workspace-entity.ts:100
#: src/modules/person/standard-objects/person.workspace-entity.ts:106
msgid "Contacts X/Twitter account"
msgstr "Contacts X/Twitter account"
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:146
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:147
msgid "Context"
msgstr "Context"
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:166
#: src/modules/task/standard-objects/task.workspace-entity.ts:136
#: src/modules/person/standard-objects/person.workspace-entity.ts:167
#: src/modules/person/standard-objects/person.workspace-entity.ts:173
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:123
#: src/modules/note/standard-objects/note.workspace-entity.ts:98
#: src/modules/company/standard-objects/company.workspace-entity.ts:154
#: src/modules/company/standard-objects/company.workspace-entity.ts:156
#: src/engine/twenty-orm/custom.workspace-entity.ts:61
msgid "Created by"
msgstr "Created by"
@@ -577,7 +582,7 @@ msgstr "Display Name"
msgid "Display Value"
msgstr "Display Value"
#: src/modules/company/standard-objects/company.workspace-entity.ts:73
#: src/modules/company/standard-objects/company.workspace-entity.ts:75
msgid "Domain Name"
msgstr "Domain Name"
@@ -585,11 +590,11 @@ msgstr "Domain Name"
msgid "Due Date"
msgstr "Due Date"
#: src/modules/person/standard-objects/person.workspace-entity.ts:79
#: src/modules/person/standard-objects/person.workspace-entity.ts:85
msgid "Emails"
msgstr "Emails"
#: src/modules/company/standard-objects/company.workspace-entity.ts:83
#: src/modules/company/standard-objects/company.workspace-entity.ts:85
msgid "Employees"
msgstr "Employees"
@@ -681,11 +686,11 @@ msgid "Event workspace member"
msgstr "Event workspace member"
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:242
#: src/modules/person/standard-objects/person.workspace-entity.ts:276
#: src/modules/person/standard-objects/person.workspace-entity.ts:282
msgid "Events"
msgstr "Events"
#: src/modules/person/standard-objects/person.workspace-entity.ts:277
#: src/modules/person/standard-objects/person.workspace-entity.ts:283
msgid "Events linked to the person"
msgstr "Events linked to the person"
@@ -775,15 +780,15 @@ msgstr "Favorite workspace member"
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:157
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:143
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:154
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:186
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:196
#: src/modules/view/standard-objects/view.workspace-entity.ts:177
#: src/modules/task/standard-objects/task.workspace-entity.ts:197
#: src/modules/person/standard-objects/person.workspace-entity.ts:226
#: src/modules/person/standard-objects/person.workspace-entity.ts:232
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:164
#: src/modules/note/standard-objects/note.workspace-entity.ts:143
#: src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts:52
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:36
#: src/modules/company/standard-objects/company.workspace-entity.ts:226
#: src/modules/company/standard-objects/company.workspace-entity.ts:228
#: src/engine/twenty-orm/custom.workspace-entity.ts:101
msgid "Favorites"
msgstr "Favorites"
@@ -792,11 +797,11 @@ msgstr "Favorites"
msgid "Favorites in this folder"
msgstr "Favorites in this folder"
#: src/modules/company/standard-objects/company.workspace-entity.ts:227
#: src/modules/company/standard-objects/company.workspace-entity.ts:229
msgid "Favorites linked to the company"
msgstr "Favorites linked to the company"
#: src/modules/person/standard-objects/person.workspace-entity.ts:227
#: src/modules/person/standard-objects/person.workspace-entity.ts:233
msgid "Favorites linked to the contact"
msgstr "Favorites linked to the contact"
@@ -820,7 +825,7 @@ msgstr "Favorites linked to the view"
msgid "Favorites linked to the workflow"
msgstr "Favorites linked to the workflow"
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:187
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:197
msgid "Favorites linked to the workflow run"
msgstr "Favorites linked to the workflow run"
@@ -907,7 +912,7 @@ msgstr "iCal UID"
msgid "Icon"
msgstr "Icon"
#: src/modules/company/standard-objects/company.workspace-entity.ts:133
#: src/modules/company/standard-objects/company.workspace-entity.ts:135
msgid "ICP"
msgstr "ICP"
@@ -916,7 +921,7 @@ msgstr "ICP"
msgid "Id"
msgstr "Id"
#: src/modules/company/standard-objects/company.workspace-entity.ts:134
#: src/modules/company/standard-objects/company.workspace-entity.ts:136
msgid "Ideal Customer Profile: Indicates whether the company is the most suitable and valuable customer for you"
msgstr "Ideal Customer Profile: Indicates whether the company is the most suitable and valuable customer for you"
@@ -953,7 +958,7 @@ msgstr "Is Organizer"
msgid "Is Sync Enabled"
msgstr "Is Sync Enabled"
#: src/modules/person/standard-objects/person.workspace-entity.ts:109
#: src/modules/person/standard-objects/person.workspace-entity.ts:115
msgid "Job Title"
msgstr "Job Title"
@@ -1026,7 +1031,7 @@ msgstr "Last update"
msgid "Linked Object Metadata Id"
msgstr "Linked Object Metadata Id"
#: src/modules/person/standard-objects/person.workspace-entity.ts:192
#: src/modules/person/standard-objects/person.workspace-entity.ts:198
msgid "Linked Opportunities"
msgstr "Linked Opportunities"
@@ -1039,12 +1044,12 @@ msgstr "Linked Record cached name"
msgid "Linked Record id"
msgstr "Linked Record id"
#: src/modules/person/standard-objects/person.workspace-entity.ts:89
#: src/modules/company/standard-objects/company.workspace-entity.ts:93
#: src/modules/person/standard-objects/person.workspace-entity.ts:95
#: src/modules/company/standard-objects/company.workspace-entity.ts:95
msgid "Linkedin"
msgstr "Linkedin"
#: src/modules/person/standard-objects/person.workspace-entity.ts:193
#: src/modules/person/standard-objects/person.workspace-entity.ts:199
msgid "List of opportunities for which that person is the point of contact"
msgstr "List of opportunities for which that person is the point of contact"
@@ -1140,8 +1145,8 @@ msgstr "Message Participant"
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:204
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:205
#: src/modules/person/standard-objects/person.workspace-entity.ts:249
#: src/modules/person/standard-objects/person.workspace-entity.ts:250
#: src/modules/person/standard-objects/person.workspace-entity.ts:255
#: src/modules/person/standard-objects/person.workspace-entity.ts:256
#: src/modules/messaging/common/standard-objects/message.workspace-entity.ts:93
#: src/modules/messaging/common/standard-objects/message.workspace-entity.ts:94
#: src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts:26
@@ -1194,11 +1199,11 @@ msgstr "Messaging provider refresh token"
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:62
#: src/modules/workflow/common/standard-objects/workflow-event-listener.workspace-entity.ts:34
#: src/modules/view/standard-objects/view.workspace-entity.ts:43
#: src/modules/person/standard-objects/person.workspace-entity.ts:69
#: src/modules/person/standard-objects/person.workspace-entity.ts:75
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:60
#: src/modules/messaging/common/standard-objects/message-folder.workspace-entity.ts:32
#: src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts:43
#: src/modules/company/standard-objects/company.workspace-entity.ts:64
#: src/modules/company/standard-objects/company.workspace-entity.ts:66
#: src/modules/attachment/standard-objects/attachment.workspace-entity.ts:42
#: src/modules/api-key/standard-objects/api-key.workspace-entity.ts:29
#: src/engine/twenty-orm/custom.workspace-entity.ts:40
@@ -1251,10 +1256,10 @@ msgstr "Note Targets"
msgid "Note title"
msgstr "Note title"
#: src/modules/person/standard-objects/person.workspace-entity.ts:215
#: src/modules/person/standard-objects/person.workspace-entity.ts:221
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:188
#: src/modules/note/standard-objects/note.workspace-entity.ts:45
#: src/modules/company/standard-objects/company.workspace-entity.ts:203
#: src/modules/company/standard-objects/company.workspace-entity.ts:205
#: src/engine/twenty-orm/custom.workspace-entity.ts:69
msgid "Notes"
msgstr "Notes"
@@ -1263,11 +1268,11 @@ msgstr "Notes"
msgid "Notes tied to the {label}"
msgstr "Notes tied to the {label}"
#: src/modules/company/standard-objects/company.workspace-entity.ts:204
#: src/modules/company/standard-objects/company.workspace-entity.ts:206
msgid "Notes tied to the company"
msgstr "Notes tied to the company"
#: src/modules/person/standard-objects/person.workspace-entity.ts:216
#: src/modules/person/standard-objects/person.workspace-entity.ts:222
msgid "Notes tied to the contact"
msgstr "Notes tied to the contact"
@@ -1291,7 +1296,7 @@ msgstr "NoteTarget opportunity"
msgid "NoteTarget person"
msgstr "NoteTarget person"
#: src/modules/company/standard-objects/company.workspace-entity.ts:84
#: src/modules/company/standard-objects/company.workspace-entity.ts:86
msgid "Number of employees in the company"
msgstr "Number of employees in the company"
@@ -1327,11 +1332,11 @@ msgid "Operations"
msgstr "Operations"
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:49
#: src/modules/company/standard-objects/company.workspace-entity.ts:214
#: src/modules/company/standard-objects/company.workspace-entity.ts:216
msgid "Opportunities"
msgstr "Opportunities"
#: src/modules/company/standard-objects/company.workspace-entity.ts:215
#: src/modules/company/standard-objects/company.workspace-entity.ts:217
msgid "Opportunities linked to the company."
msgstr "Opportunities linked to the company."
@@ -1393,18 +1398,18 @@ msgstr "Parent View Filter Group"
msgid "Parent View Filter Group Id"
msgstr "Parent View Filter Group Id"
#: src/modules/person/standard-objects/person.workspace-entity.ts:58
#: src/modules/company/standard-objects/company.workspace-entity.ts:164
#: src/modules/person/standard-objects/person.workspace-entity.ts:59
#: src/modules/company/standard-objects/company.workspace-entity.ts:166
msgid "People"
msgstr "People"
#: src/modules/company/standard-objects/company.workspace-entity.ts:165
#: src/modules/company/standard-objects/company.workspace-entity.ts:167
msgid "People linked to the company."
msgstr "People linked to the company."
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:119
#: src/modules/task/standard-objects/task-target.workspace-entity.ts:50
#: src/modules/person/standard-objects/person.workspace-entity.ts:57
#: src/modules/person/standard-objects/person.workspace-entity.ts:58
#: src/modules/note/standard-objects/note-target.workspace-entity.ts:50
#: src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts:85
#: src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts:86
@@ -1415,15 +1420,15 @@ msgstr "People linked to the company."
msgid "Person"
msgstr "Person"
#: src/modules/person/standard-objects/person.workspace-entity.ts:157
#: src/modules/person/standard-objects/person.workspace-entity.ts:163
msgid "Person record Position"
msgstr "Person record Position"
#: src/modules/person/standard-objects/person.workspace-entity.ts:118
#: src/modules/person/standard-objects/person.workspace-entity.ts:124
msgid "Phone"
msgstr "Phone"
#: src/modules/person/standard-objects/person.workspace-entity.ts:128
#: src/modules/person/standard-objects/person.workspace-entity.ts:134
msgid "Phones"
msgstr "Phones"
@@ -1433,17 +1438,17 @@ msgstr "Point of Contact"
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:98
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:115
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:146
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:156
#: src/modules/view/standard-objects/view.workspace-entity.ts:98
#: src/modules/view/standard-objects/view-group.workspace-entity.ts:59
#: src/modules/view/standard-objects/view-field.workspace-entity.ts:74
#: src/modules/task/standard-objects/task.workspace-entity.ts:57
#: src/modules/person/standard-objects/person.workspace-entity.ts:156
#: src/modules/person/standard-objects/person.workspace-entity.ts:162
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:112
#: src/modules/note/standard-objects/note.workspace-entity.ts:55
#: src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts:32
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:46
#: src/modules/company/standard-objects/company.workspace-entity.ts:143
#: src/modules/company/standard-objects/company.workspace-entity.ts:145
#: src/engine/twenty-orm/custom.workspace-entity.ts:49
#: src/engine/twenty-orm/custom.workspace-entity.ts:50
msgid "Position"
@@ -1648,9 +1653,9 @@ msgid "Task title"
msgstr "Task title"
#: src/modules/task/standard-objects/task.workspace-entity.ts:47
#: src/modules/person/standard-objects/person.workspace-entity.ts:204
#: src/modules/person/standard-objects/person.workspace-entity.ts:210
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:177
#: src/modules/company/standard-objects/company.workspace-entity.ts:192
#: src/modules/company/standard-objects/company.workspace-entity.ts:194
#: src/engine/twenty-orm/custom.workspace-entity.ts:85
msgid "Tasks"
msgstr "Tasks"
@@ -1663,11 +1668,11 @@ msgstr "Tasks assigned to the workspace member"
msgid "Tasks tied to the {label}"
msgstr "Tasks tied to the {label}"
#: src/modules/company/standard-objects/company.workspace-entity.ts:193
#: src/modules/company/standard-objects/company.workspace-entity.ts:195
msgid "Tasks tied to the company"
msgstr "Tasks tied to the company"
#: src/modules/person/standard-objects/person.workspace-entity.ts:205
#: src/modules/person/standard-objects/person.workspace-entity.ts:211
msgid "Tasks tied to the contact"
msgstr "Tasks tied to the contact"
@@ -1704,28 +1709,28 @@ msgstr "The account handle (email, username, phone number, etc.)"
msgid "The account provider"
msgstr "The account provider"
#: src/modules/company/standard-objects/company.workspace-entity.ts:94
#: src/modules/company/standard-objects/company.workspace-entity.ts:96
msgid "The company Linkedin account"
msgstr "The company Linkedin account"
#: src/modules/company/standard-objects/company.workspace-entity.ts:65
#: src/modules/company/standard-objects/company.workspace-entity.ts:67
msgid "The company name"
msgstr "The company name"
#: src/modules/company/standard-objects/company.workspace-entity.ts:104
#: src/modules/company/standard-objects/company.workspace-entity.ts:106
msgid "The company Twitter/X account"
msgstr "The company Twitter/X account"
#: src/modules/company/standard-objects/company.workspace-entity.ts:74
#: src/modules/company/standard-objects/company.workspace-entity.ts:76
msgid "The company website URL. We use this url to fetch the company icon"
msgstr "The company website URL. We use this url to fetch the company icon"
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:168
#: src/modules/task/standard-objects/task.workspace-entity.ts:138
#: src/modules/person/standard-objects/person.workspace-entity.ts:169
#: src/modules/person/standard-objects/person.workspace-entity.ts:175
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:125
#: src/modules/note/standard-objects/note.workspace-entity.ts:100
#: src/modules/company/standard-objects/company.workspace-entity.ts:156
#: src/modules/company/standard-objects/company.workspace-entity.ts:158
#: src/engine/twenty-orm/custom.workspace-entity.ts:63
msgid "The creator of the record"
msgstr "The creator of the record"
@@ -1795,17 +1800,17 @@ msgstr "Time zone"
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:155
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:166
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:198
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:208
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:34
#: src/modules/task/standard-objects/task.workspace-entity.ts:185
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:211
#: src/modules/note/standard-objects/note.workspace-entity.ts:131
#: src/modules/company/standard-objects/company.workspace-entity.ts:251
#: src/modules/company/standard-objects/company.workspace-entity.ts:253
#: src/engine/twenty-orm/custom.workspace-entity.ts:134
msgid "Timeline Activities"
msgstr "Timeline Activities"
#: src/modules/company/standard-objects/company.workspace-entity.ts:252
#: src/modules/company/standard-objects/company.workspace-entity.ts:254
msgid "Timeline Activities linked to the company"
msgstr "Timeline Activities linked to the company"
@@ -1817,7 +1822,7 @@ msgstr "Timeline Activities linked to the note."
msgid "Timeline Activities linked to the opportunity."
msgstr "Timeline Activities linked to the opportunity."
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:199
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:209
msgid "Timeline activities linked to the run"
msgstr "Timeline activities linked to the run"
@@ -2096,7 +2101,7 @@ msgstr "Webhooks"
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:57
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:127
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:172
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:182
#: src/modules/workflow/common/standard-objects/workflow-event-listener.workspace-entity.ts:43
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:194
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:133
@@ -2109,7 +2114,7 @@ msgstr "Workflow"
msgid "Workflow event listeners linked to the workflow."
msgstr "Workflow event listeners linked to the workflow."
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:173
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:183
msgid "Workflow linked to the run."
msgstr "Workflow linked to the run."
@@ -2127,7 +2132,7 @@ msgstr "Workflow Run"
msgid "Workflow run ended at"
msgstr "Workflow run ended at"
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:147
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:157
msgid "Workflow run position"
msgstr "Workflow run position"
@@ -2153,7 +2158,7 @@ msgstr "Workflow runs linked to the version."
msgid "Workflow runs linked to the workflow."
msgstr "Workflow runs linked to the workflow."
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:158
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:168
msgid "Workflow version"
msgstr "Workflow version"
@@ -2161,7 +2166,7 @@ msgstr "Workflow version"
msgid "Workflow Version"
msgstr "Workflow Version"
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:159
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:169
msgid "Workflow version linked to the run."
msgstr "Workflow version linked to the run."
@@ -2232,11 +2237,11 @@ msgstr "Workspace Members"
msgid "WorkspaceMember"
msgstr "WorkspaceMember"
#: src/modules/person/standard-objects/person.workspace-entity.ts:99
#: src/modules/company/standard-objects/company.workspace-entity.ts:103
#: src/modules/person/standard-objects/person.workspace-entity.ts:105
#: src/modules/company/standard-objects/company.workspace-entity.ts:105
msgid "X"
msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:177
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Your team member responsible for managing the company account"
@@ -8,8 +8,8 @@ msgstr ""
"Language: es\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Miembro de su equipo responsable de gestionar la cuenta de la empresa"
@@ -8,8 +8,8 @@ msgstr ""
"Language: fi\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Tiimin jäsen vastuussa yritystilin hallinnasta"
@@ -8,8 +8,8 @@ msgstr ""
"Language: fr\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Le membre de votre équipe responsable de la gestion du compte entreprise"
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -8,8 +8,8 @@ msgstr ""
"Language: he\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "חבר הצוות שלך אחראי על ניהול חשבון החברה"
@@ -8,8 +8,8 @@ msgstr ""
"Language: hu\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Az Ön csapatának megbízott tagja, aki a cégfiókot kezeli"
@@ -8,8 +8,8 @@ msgstr ""
"Language: it\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Il membro del team responsabile della gestione dell'account aziendale"
@@ -8,8 +8,8 @@ msgstr ""
"Language: ja\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "会社のアカウントを管理する責任のあるチームメンバー"
@@ -8,8 +8,8 @@ msgstr ""
"Language: ko\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "회사 계정을 관리하는 팀원"
@@ -8,8 +8,8 @@ msgstr ""
"Language: nl\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Uw teamlid verantwoordelijk voor het beheer van het bedrijfsaccount"
@@ -8,8 +8,8 @@ msgstr ""
"Language: no\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Ditt teammedlem ansvarlig for å administrere bedriftskontoen"
@@ -8,8 +8,8 @@ msgstr ""
"Language: pl\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Twój członek zespołu odpowiedzialny za zarządzanie kontem firmy"
@@ -37,7 +37,7 @@ msgstr ""
msgid "(System) Views"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:55
#: src/modules/company/standard-objects/company.workspace-entity.ts:56
msgid "A company"
msgstr ""
@@ -69,7 +69,7 @@ msgstr ""
msgid "A note target"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:59
#: src/modules/person/standard-objects/person.workspace-entity.ts:60
msgid "A person"
msgstr ""
@@ -111,7 +111,7 @@ msgstr ""
#: src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts:114
#: src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts:115
#: src/modules/company/standard-objects/company.workspace-entity.ts:176
#: src/modules/company/standard-objects/company.workspace-entity.ts:178
msgid "Account Owner"
msgstr ""
@@ -123,19 +123,19 @@ msgstr ""
msgid "Account Owner For Companies"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:123
#: src/modules/company/standard-objects/company.workspace-entity.ts:125
msgid "Address"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:264
#: src/modules/company/standard-objects/company.workspace-entity.ts:266
msgid "Address (deprecated) "
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:124
#: src/modules/company/standard-objects/company.workspace-entity.ts:126
msgid "Address of the company"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:265
#: src/modules/company/standard-objects/company.workspace-entity.ts:267
msgid "Address of the company - deprecated in favor of new address field"
msgstr ""
@@ -172,7 +172,7 @@ msgstr ""
msgid "An opportunity"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:114
#: src/modules/company/standard-objects/company.workspace-entity.ts:116
msgid "Annual Recurring Revenue: The actual or estimated annual revenue of the company"
msgstr ""
@@ -196,7 +196,7 @@ msgstr ""
msgid "ApiKey revocation date"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:113
#: src/modules/company/standard-objects/company.workspace-entity.ts:115
msgid "ARR"
msgstr ""
@@ -253,10 +253,10 @@ msgid "Attachment type"
msgstr ""
#: src/modules/task/standard-objects/task.workspace-entity.ts:156
#: src/modules/person/standard-objects/person.workspace-entity.ts:238
#: src/modules/person/standard-objects/person.workspace-entity.ts:244
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:199
#: src/modules/note/standard-objects/note.workspace-entity.ts:118
#: src/modules/company/standard-objects/company.workspace-entity.ts:239
#: src/modules/company/standard-objects/company.workspace-entity.ts:241
#: src/modules/attachment/standard-objects/attachment.workspace-entity.ts:31
#: src/engine/twenty-orm/custom.workspace-entity.ts:118
msgid "Attachments"
@@ -266,11 +266,11 @@ msgstr ""
msgid "Attachments created by the workspace member"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:240
#: src/modules/company/standard-objects/company.workspace-entity.ts:242
msgid "Attachments linked to the company"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:239
#: src/modules/person/standard-objects/person.workspace-entity.ts:245
msgid "Attachments linked to the contact."
msgstr ""
@@ -316,7 +316,7 @@ msgstr ""
msgid "Automatically create records for people you participated with in an event."
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:146
#: src/modules/person/standard-objects/person.workspace-entity.ts:152
msgid "Avatar"
msgstr ""
@@ -396,8 +396,8 @@ msgstr ""
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:228
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:229
#: src/modules/person/standard-objects/person.workspace-entity.ts:262
#: src/modules/person/standard-objects/person.workspace-entity.ts:263
#: src/modules/person/standard-objects/person.workspace-entity.ts:268
#: src/modules/person/standard-objects/person.workspace-entity.ts:269
msgid "Calendar Event Participants"
msgstr ""
@@ -415,7 +415,7 @@ msgstr ""
msgid "Channel Type"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:137
#: src/modules/person/standard-objects/person.workspace-entity.ts:143
msgid "City"
msgstr ""
@@ -431,22 +431,22 @@ msgstr ""
msgid "Compact View"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:54
#: src/modules/company/standard-objects/company.workspace-entity.ts:55
msgid "Companies"
msgstr ""
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:134
#: src/modules/task/standard-objects/task-target.workspace-entity.ts:65
#: src/modules/person/standard-objects/person.workspace-entity.ts:177
#: src/modules/person/standard-objects/person.workspace-entity.ts:183
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:148
#: src/modules/note/standard-objects/note-target.workspace-entity.ts:65
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:88
#: src/modules/company/standard-objects/company.workspace-entity.ts:53
#: src/modules/company/standard-objects/company.workspace-entity.ts:54
#: src/modules/attachment/standard-objects/attachment.workspace-entity.ts:128
msgid "Company"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:144
#: src/modules/company/standard-objects/company.workspace-entity.ts:146
msgid "Company record position"
msgstr ""
@@ -477,52 +477,57 @@ msgstr ""
msgid "Contact auto creation policy"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:147
#: src/modules/person/standard-objects/person.workspace-entity.ts:153
msgid "Contacts avatar"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:138
#: src/modules/person/standard-objects/person.workspace-entity.ts:144
msgid "Contacts city"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:178
#: src/modules/person/standard-objects/person.workspace-entity.ts:184
msgid "Contacts company"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:80
#: src/modules/person/standard-objects/person.workspace-entity.ts:86
msgid "Contacts Emails"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:110
#: src/modules/person/standard-objects/person.workspace-entity.ts:116
msgid "Contacts job title"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:90
#: src/modules/person/standard-objects/person.workspace-entity.ts:96
msgid "Contacts Linkedin account"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:70
#: src/modules/person/standard-objects/person.workspace-entity.ts:76
msgid "Contacts name"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:119
#: src/modules/person/standard-objects/person.workspace-entity.ts:125
msgid "Contacts phone number"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:129
#: src/modules/person/standard-objects/person.workspace-entity.ts:135
msgid "Contacts phone numbers"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:100
#: src/modules/person/standard-objects/person.workspace-entity.ts:106
msgid "Contacts X/Twitter account"
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:146
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:147
msgid "Context"
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:166
#: src/modules/task/standard-objects/task.workspace-entity.ts:136
#: src/modules/person/standard-objects/person.workspace-entity.ts:167
#: src/modules/person/standard-objects/person.workspace-entity.ts:173
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:123
#: src/modules/note/standard-objects/note.workspace-entity.ts:98
#: src/modules/company/standard-objects/company.workspace-entity.ts:154
#: src/modules/company/standard-objects/company.workspace-entity.ts:156
#: src/engine/twenty-orm/custom.workspace-entity.ts:61
msgid "Created by"
msgstr ""
@@ -577,7 +582,7 @@ msgstr ""
msgid "Display Value"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:73
#: src/modules/company/standard-objects/company.workspace-entity.ts:75
msgid "Domain Name"
msgstr ""
@@ -585,11 +590,11 @@ msgstr ""
msgid "Due Date"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:79
#: src/modules/person/standard-objects/person.workspace-entity.ts:85
msgid "Emails"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:83
#: src/modules/company/standard-objects/company.workspace-entity.ts:85
msgid "Employees"
msgstr ""
@@ -681,11 +686,11 @@ msgid "Event workspace member"
msgstr ""
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:242
#: src/modules/person/standard-objects/person.workspace-entity.ts:276
#: src/modules/person/standard-objects/person.workspace-entity.ts:282
msgid "Events"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:277
#: src/modules/person/standard-objects/person.workspace-entity.ts:283
msgid "Events linked to the person"
msgstr ""
@@ -775,15 +780,15 @@ msgstr ""
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:157
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:143
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:154
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:186
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:196
#: src/modules/view/standard-objects/view.workspace-entity.ts:177
#: src/modules/task/standard-objects/task.workspace-entity.ts:197
#: src/modules/person/standard-objects/person.workspace-entity.ts:226
#: src/modules/person/standard-objects/person.workspace-entity.ts:232
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:164
#: src/modules/note/standard-objects/note.workspace-entity.ts:143
#: src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts:52
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:36
#: src/modules/company/standard-objects/company.workspace-entity.ts:226
#: src/modules/company/standard-objects/company.workspace-entity.ts:228
#: src/engine/twenty-orm/custom.workspace-entity.ts:101
msgid "Favorites"
msgstr ""
@@ -792,11 +797,11 @@ msgstr ""
msgid "Favorites in this folder"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:227
#: src/modules/company/standard-objects/company.workspace-entity.ts:229
msgid "Favorites linked to the company"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:227
#: src/modules/person/standard-objects/person.workspace-entity.ts:233
msgid "Favorites linked to the contact"
msgstr ""
@@ -820,7 +825,7 @@ msgstr ""
msgid "Favorites linked to the workflow"
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:187
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:197
msgid "Favorites linked to the workflow run"
msgstr ""
@@ -907,7 +912,7 @@ msgstr ""
msgid "Icon"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:133
#: src/modules/company/standard-objects/company.workspace-entity.ts:135
msgid "ICP"
msgstr ""
@@ -916,7 +921,7 @@ msgstr ""
msgid "Id"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:134
#: src/modules/company/standard-objects/company.workspace-entity.ts:136
msgid "Ideal Customer Profile: Indicates whether the company is the most suitable and valuable customer for you"
msgstr ""
@@ -953,7 +958,7 @@ msgstr ""
msgid "Is Sync Enabled"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:109
#: src/modules/person/standard-objects/person.workspace-entity.ts:115
msgid "Job Title"
msgstr ""
@@ -1026,7 +1031,7 @@ msgstr ""
msgid "Linked Object Metadata Id"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:192
#: src/modules/person/standard-objects/person.workspace-entity.ts:198
msgid "Linked Opportunities"
msgstr ""
@@ -1039,12 +1044,12 @@ msgstr ""
msgid "Linked Record id"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:89
#: src/modules/company/standard-objects/company.workspace-entity.ts:93
#: src/modules/person/standard-objects/person.workspace-entity.ts:95
#: src/modules/company/standard-objects/company.workspace-entity.ts:95
msgid "Linkedin"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:193
#: src/modules/person/standard-objects/person.workspace-entity.ts:199
msgid "List of opportunities for which that person is the point of contact"
msgstr ""
@@ -1140,8 +1145,8 @@ msgstr ""
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:204
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:205
#: src/modules/person/standard-objects/person.workspace-entity.ts:249
#: src/modules/person/standard-objects/person.workspace-entity.ts:250
#: src/modules/person/standard-objects/person.workspace-entity.ts:255
#: src/modules/person/standard-objects/person.workspace-entity.ts:256
#: src/modules/messaging/common/standard-objects/message.workspace-entity.ts:93
#: src/modules/messaging/common/standard-objects/message.workspace-entity.ts:94
#: src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts:26
@@ -1194,11 +1199,11 @@ msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:62
#: src/modules/workflow/common/standard-objects/workflow-event-listener.workspace-entity.ts:34
#: src/modules/view/standard-objects/view.workspace-entity.ts:43
#: src/modules/person/standard-objects/person.workspace-entity.ts:69
#: src/modules/person/standard-objects/person.workspace-entity.ts:75
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:60
#: src/modules/messaging/common/standard-objects/message-folder.workspace-entity.ts:32
#: src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts:43
#: src/modules/company/standard-objects/company.workspace-entity.ts:64
#: src/modules/company/standard-objects/company.workspace-entity.ts:66
#: src/modules/attachment/standard-objects/attachment.workspace-entity.ts:42
#: src/modules/api-key/standard-objects/api-key.workspace-entity.ts:29
#: src/engine/twenty-orm/custom.workspace-entity.ts:40
@@ -1251,10 +1256,10 @@ msgstr ""
msgid "Note title"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:215
#: src/modules/person/standard-objects/person.workspace-entity.ts:221
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:188
#: src/modules/note/standard-objects/note.workspace-entity.ts:45
#: src/modules/company/standard-objects/company.workspace-entity.ts:203
#: src/modules/company/standard-objects/company.workspace-entity.ts:205
#: src/engine/twenty-orm/custom.workspace-entity.ts:69
msgid "Notes"
msgstr ""
@@ -1263,11 +1268,11 @@ msgstr ""
msgid "Notes tied to the {label}"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:204
#: src/modules/company/standard-objects/company.workspace-entity.ts:206
msgid "Notes tied to the company"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:216
#: src/modules/person/standard-objects/person.workspace-entity.ts:222
msgid "Notes tied to the contact"
msgstr ""
@@ -1291,7 +1296,7 @@ msgstr ""
msgid "NoteTarget person"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:84
#: src/modules/company/standard-objects/company.workspace-entity.ts:86
msgid "Number of employees in the company"
msgstr ""
@@ -1327,11 +1332,11 @@ msgid "Operations"
msgstr ""
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:49
#: src/modules/company/standard-objects/company.workspace-entity.ts:214
#: src/modules/company/standard-objects/company.workspace-entity.ts:216
msgid "Opportunities"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:215
#: src/modules/company/standard-objects/company.workspace-entity.ts:217
msgid "Opportunities linked to the company."
msgstr ""
@@ -1393,18 +1398,18 @@ msgstr ""
msgid "Parent View Filter Group Id"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:58
#: src/modules/company/standard-objects/company.workspace-entity.ts:164
#: src/modules/person/standard-objects/person.workspace-entity.ts:59
#: src/modules/company/standard-objects/company.workspace-entity.ts:166
msgid "People"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:165
#: src/modules/company/standard-objects/company.workspace-entity.ts:167
msgid "People linked to the company."
msgstr ""
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:119
#: src/modules/task/standard-objects/task-target.workspace-entity.ts:50
#: src/modules/person/standard-objects/person.workspace-entity.ts:57
#: src/modules/person/standard-objects/person.workspace-entity.ts:58
#: src/modules/note/standard-objects/note-target.workspace-entity.ts:50
#: src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts:85
#: src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts:86
@@ -1415,15 +1420,15 @@ msgstr ""
msgid "Person"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:157
#: src/modules/person/standard-objects/person.workspace-entity.ts:163
msgid "Person record Position"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:118
#: src/modules/person/standard-objects/person.workspace-entity.ts:124
msgid "Phone"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:128
#: src/modules/person/standard-objects/person.workspace-entity.ts:134
msgid "Phones"
msgstr ""
@@ -1433,17 +1438,17 @@ msgstr ""
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:98
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:115
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:146
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:156
#: src/modules/view/standard-objects/view.workspace-entity.ts:98
#: src/modules/view/standard-objects/view-group.workspace-entity.ts:59
#: src/modules/view/standard-objects/view-field.workspace-entity.ts:74
#: src/modules/task/standard-objects/task.workspace-entity.ts:57
#: src/modules/person/standard-objects/person.workspace-entity.ts:156
#: src/modules/person/standard-objects/person.workspace-entity.ts:162
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:112
#: src/modules/note/standard-objects/note.workspace-entity.ts:55
#: src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts:32
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:46
#: src/modules/company/standard-objects/company.workspace-entity.ts:143
#: src/modules/company/standard-objects/company.workspace-entity.ts:145
#: src/engine/twenty-orm/custom.workspace-entity.ts:49
#: src/engine/twenty-orm/custom.workspace-entity.ts:50
msgid "Position"
@@ -1648,9 +1653,9 @@ msgid "Task title"
msgstr ""
#: src/modules/task/standard-objects/task.workspace-entity.ts:47
#: src/modules/person/standard-objects/person.workspace-entity.ts:204
#: src/modules/person/standard-objects/person.workspace-entity.ts:210
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:177
#: src/modules/company/standard-objects/company.workspace-entity.ts:192
#: src/modules/company/standard-objects/company.workspace-entity.ts:194
#: src/engine/twenty-orm/custom.workspace-entity.ts:85
msgid "Tasks"
msgstr ""
@@ -1663,11 +1668,11 @@ msgstr ""
msgid "Tasks tied to the {label}"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:193
#: src/modules/company/standard-objects/company.workspace-entity.ts:195
msgid "Tasks tied to the company"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:205
#: src/modules/person/standard-objects/person.workspace-entity.ts:211
msgid "Tasks tied to the contact"
msgstr ""
@@ -1704,28 +1709,28 @@ msgstr ""
msgid "The account provider"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:94
#: src/modules/company/standard-objects/company.workspace-entity.ts:96
msgid "The company Linkedin account"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:65
#: src/modules/company/standard-objects/company.workspace-entity.ts:67
msgid "The company name"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:104
#: src/modules/company/standard-objects/company.workspace-entity.ts:106
msgid "The company Twitter/X account"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:74
#: src/modules/company/standard-objects/company.workspace-entity.ts:76
msgid "The company website URL. We use this url to fetch the company icon"
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:168
#: src/modules/task/standard-objects/task.workspace-entity.ts:138
#: src/modules/person/standard-objects/person.workspace-entity.ts:169
#: src/modules/person/standard-objects/person.workspace-entity.ts:175
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:125
#: src/modules/note/standard-objects/note.workspace-entity.ts:100
#: src/modules/company/standard-objects/company.workspace-entity.ts:156
#: src/modules/company/standard-objects/company.workspace-entity.ts:158
#: src/engine/twenty-orm/custom.workspace-entity.ts:63
msgid "The creator of the record"
msgstr ""
@@ -1795,17 +1800,17 @@ msgstr ""
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:155
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:166
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:198
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:208
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:34
#: src/modules/task/standard-objects/task.workspace-entity.ts:185
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:211
#: src/modules/note/standard-objects/note.workspace-entity.ts:131
#: src/modules/company/standard-objects/company.workspace-entity.ts:251
#: src/modules/company/standard-objects/company.workspace-entity.ts:253
#: src/engine/twenty-orm/custom.workspace-entity.ts:134
msgid "Timeline Activities"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:252
#: src/modules/company/standard-objects/company.workspace-entity.ts:254
msgid "Timeline Activities linked to the company"
msgstr ""
@@ -1817,7 +1822,7 @@ msgstr ""
msgid "Timeline Activities linked to the opportunity."
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:199
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:209
msgid "Timeline activities linked to the run"
msgstr ""
@@ -2096,7 +2101,7 @@ msgstr ""
#: src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts:57
#: src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts:127
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:172
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:182
#: src/modules/workflow/common/standard-objects/workflow-event-listener.workspace-entity.ts:43
#: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:194
#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:133
@@ -2109,7 +2114,7 @@ msgstr ""
msgid "Workflow event listeners linked to the workflow."
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:173
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:183
msgid "Workflow linked to the run."
msgstr ""
@@ -2127,7 +2132,7 @@ msgstr ""
msgid "Workflow run ended at"
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:147
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:157
msgid "Workflow run position"
msgstr ""
@@ -2153,7 +2158,7 @@ msgstr ""
msgid "Workflow runs linked to the workflow."
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:158
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:168
msgid "Workflow version"
msgstr ""
@@ -2161,7 +2166,7 @@ msgstr ""
msgid "Workflow Version"
msgstr ""
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:159
#: src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts:169
msgid "Workflow version linked to the run."
msgstr ""
@@ -2232,11 +2237,11 @@ msgstr ""
msgid "WorkspaceMember"
msgstr ""
#: src/modules/person/standard-objects/person.workspace-entity.ts:99
#: src/modules/company/standard-objects/company.workspace-entity.ts:103
#: src/modules/person/standard-objects/person.workspace-entity.ts:105
#: src/modules/company/standard-objects/company.workspace-entity.ts:105
msgid "X"
msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:177
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr ""
@@ -8,8 +8,8 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Seu membro da equipe responsável por gerenciar a conta da empresa"
@@ -8,8 +8,8 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "O membro da sua equipa responsável pela gestão da conta da empresa"
@@ -8,8 +8,8 @@ msgstr ""
"Language: ro\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Membrul echipei dumneavoastră responsabil de gestionarea contului companiei"
@@ -8,8 +8,8 @@ msgstr ""
"Language: ru\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Ваш член команды, ответственный за управление корпоративным аккаунтом"
@@ -8,8 +8,8 @@ msgstr ""
"Language: sr_Cyrl\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Serbian (Cyrillic)\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
@@ -2251,4 +2251,3 @@ msgstr "Х"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Ваш тимски члан задужен за управљање налогом компаније"
@@ -8,8 +8,8 @@ msgstr ""
"Language: sv\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -1479,7 +1479,8 @@ msgstr "F\"or\"aldrade f\"argschema"
#: src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts:108
msgid "Preferred language"
msgstr "F\"or\"aldrat spr\n"
msgstr ""
"F\"or\"aldrat spr\n"
"k"
#: src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts:223
@@ -1583,7 +1584,8 @@ msgstr "Synkkurs"
#: src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts:269
msgid "Sync Cursor. Used for syncing events from the calendar provider"
msgstr "Synkkurs. Anv\"ands f\"or att synkronisera h\"andelser fr\n"
msgstr ""
"Synkkurs. Anv\"ands f\"or att synkronisera h\"andelser fr\n"
"n kalenderleverant\"oren"
#: src/modules/messaging/common/standard-objects/message-channel.workspace-entity.ts:291
@@ -2253,4 +2255,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Ditt teammedlem ansvarig för att hantera företagskontot"
@@ -8,8 +8,8 @@ msgstr ""
"Language: tr\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -2251,4 +2251,3 @@ msgstr ""
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Şirket hesabını yönetmekten sorumlu ekip üyeniz"
@@ -8,8 +8,8 @@ msgstr ""
"Language: uk\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Ukrainian\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
@@ -2251,4 +2251,3 @@ msgstr "Х"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Ваш колега з команди, відповідальний за управління обліковим записом компанії"
@@ -8,8 +8,8 @@ msgstr ""
"Language: vi\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "Thành viên trong nhóm của bạn phụ trách quản lý tài khoản công ty"
@@ -8,8 +8,8 @@ msgstr ""
"Language: zh\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "负责管理公司账户的团队成员"
@@ -8,8 +8,8 @@ msgstr ""
"Language: zh\n"
"Project-Id-Version: cf448e737e0d6d7b78742f963d761c61\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-01 00:00
"
"PO-Revision-Date: 2025-01-01 00:00\n"
": \n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -2251,4 +2251,3 @@ msgstr "X"
#: src/modules/company/standard-objects/company.workspace-entity.ts:179
msgid "Your team member responsible for managing the company account"
msgstr "負責管理公司帳戶的團隊成員"
@@ -7,19 +7,31 @@ type ComputeNodeDimensionsProps = {
dimensions: { height: number; width: number } | undefined,
) => ReactNode;
node?: ReactNode;
className?: string;
};
const StyledNodeWrapper = styled.span`
pointer-events: none;
position: fixed;
visibility: hidden;
`;
const StyledDiv = styled.div`
max-width: 100%;
position: relative;
`;
const StyledChildWrapper = styled.div`
left: 0;
position: absolute;
top: 0;
`;
export const ComputeNodeDimensions = ({
children,
node = children(undefined),
className,
}: ComputeNodeDimensionsProps) => {
const nodeWrapperRef = useRef<HTMLSpanElement>(null);
const nodeWrapperRef = useRef<HTMLDivElement>(null);
const [nodeDimensions, setNodeDimensions] = useState<
| {
width: number;
@@ -45,9 +57,11 @@ export const ComputeNodeDimensions = ({
}, [nodeWrapperRef]);
return (
<>
<StyledNodeWrapper ref={nodeWrapperRef}>{node}</StyledNodeWrapper>
{nodeDimensions && children(nodeDimensions)}
</>
<StyledDiv ref={nodeWrapperRef} className={className}>
<StyledNodeWrapper>{node}</StyledNodeWrapper>
<StyledChildWrapper>
{nodeDimensions && children(nodeDimensions)}
</StyledChildWrapper>
</StyledDiv>
);
};