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 13:33:18 +01:00
committed by GitHub
parent a4a085392d
commit 80c55b4462
85 changed files with 1415 additions and 757 deletions

View File

@ -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>
);
};

View File

@ -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} />

View File

@ -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 }) =>

View File

@ -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>
);
};

View File

@ -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}</>;
};

View File

@ -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);

View File

@ -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}
</>
);
};

View File

@ -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>
);
};

View File

@ -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>
);
};

View File

@ -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
/>
);
};

View File

@ -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>
);
};

View File

@ -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>
);
};

View File

@ -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}
/>
);
};

View File

@ -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,
};
};

View File

@ -1,6 +0,0 @@
import { createState } from 'twenty-ui';
export const isUpdatingRecordEditableNameState = createState<boolean>({
key: 'isUpdatingRecordEditableNameState',
defaultValue: false,
});

View File

@ -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;

View File

@ -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 = {

View File

@ -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 }>`

View File

@ -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>
);
};

View File

@ -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();
},
};

View File

@ -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 };
};

View File

@ -1,3 +0,0 @@
export enum EditableBreadcrumbItemHotkeyScope {
EditableBreadcrumbItem = 'editable-breadcrumb-item',
}

View File

@ -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"

View File

@ -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 "العضو في فريقك المسئول عن إدارة حساب الشركة"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "Το μέλος της ομάδας σας υπεύθυνο για τη διαχείριση του λογαριασμού της εταιρείας"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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

View File

@ -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 "חבר הצוות שלך אחראי על ניהול חשבון החברה"

View File

@ -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"

View File

@ -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"

View File

@ -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 "会社のアカウントを管理する責任のあるチームメンバー"

View File

@ -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 "회사 계정을 관리하는 팀원"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "Ваш член команды, ответственный за управление корпоративным аккаунтом"

View File

@ -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 "Ваш тимски члан задужен за управљање налогом компаније"

View File

@ -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"

View File

@ -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"

View File

@ -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 "Ваш колега з команди, відповідальний за управління обліковим записом компанії"

View File

@ -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"

View File

@ -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 "负责管理公司账户的团队成员"

View File

@ -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 "負責管理公司帳戶的團隊成員"

View File

@ -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>
);
};