Added option to prevent sending requests to twenty-icons (#16723)
Solution for #15891 https://github.com/user-attachments/assets/82ce5c4b-0a78-45a8-8196-413473887820 --------- Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
@@ -25,7 +25,7 @@ const pagesCoverage = {
|
||||
};
|
||||
|
||||
const performanceCoverage = {
|
||||
branches: 35,
|
||||
branches: 33,
|
||||
statements: 60,
|
||||
lines: 60,
|
||||
functions: 45,
|
||||
|
||||
+7
@@ -16,6 +16,7 @@ import { recordStoreFamilyState } from '@/object-record/record-store/states/reco
|
||||
import { dateLocaleState } from '~/localization/states/dateLocaleState';
|
||||
import { beautifyPastDateRelativeToNow } from '~/utils/date-utils';
|
||||
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
const StyledTimelineItemContainer = styled.div`
|
||||
color: ${({ theme }) => theme.font.color.primary};
|
||||
@@ -92,6 +93,11 @@ export const EventRow = ({
|
||||
mainObjectMetadataItem,
|
||||
}: EventRowProps) => {
|
||||
const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState);
|
||||
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const { localeCatalog } = useRecoilValue(dateLocaleState);
|
||||
|
||||
const { recordId } = useContext(TimelineActivityContext);
|
||||
@@ -120,6 +126,7 @@ export const EventRow = ({
|
||||
const labelIdentifier = getObjectRecordIdentifier({
|
||||
objectMetadataItem: mainObjectMetadataItem,
|
||||
record: recordFromStore,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
|
||||
const authorFullName = getTimelineActivityAuthorFullName(
|
||||
|
||||
@@ -29,6 +29,7 @@ import { useCallback } from 'react';
|
||||
import { useRecoilState, useSetRecoilState } from 'recoil';
|
||||
import { clientConfigApiStatusState } from '@/client-config/states/clientConfigApiStatusState';
|
||||
import { getClientConfig } from '@/client-config/utils/getClientConfig';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
type UseClientConfigResult = {
|
||||
data: { clientConfig: ClientConfig } | undefined;
|
||||
@@ -110,6 +111,11 @@ export const useClientConfig = (): UseClientConfigResult => {
|
||||
const setIsEmailingDomainsEnabled = useSetRecoilState(
|
||||
isEmailingDomainsEnabledState,
|
||||
);
|
||||
|
||||
const setAllowRequestsToTwentyIcons = useSetRecoilState(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const setIsCloudflareIntegrationEnabled = useSetRecoilState(
|
||||
isCloudflareIntegrationEnabledState,
|
||||
);
|
||||
@@ -188,6 +194,7 @@ export const useClientConfig = (): UseClientConfigResult => {
|
||||
setCalendarBookingPageId(clientConfig?.calendarBookingPageId ?? null);
|
||||
setIsImapSmtpCaldavEnabled(clientConfig?.isImapSmtpCaldavEnabled);
|
||||
setIsEmailingDomainsEnabled(clientConfig?.isEmailingDomainsEnabled);
|
||||
setAllowRequestsToTwentyIcons(clientConfig?.allowRequestsToTwentyIcons);
|
||||
setIsCloudflareIntegrationEnabled(
|
||||
clientConfig?.isCloudflareIntegrationEnabled,
|
||||
);
|
||||
@@ -230,6 +237,7 @@ export const useClientConfig = (): UseClientConfigResult => {
|
||||
setMicrosoftMessagingEnabled,
|
||||
setSentryConfig,
|
||||
setSupportChat,
|
||||
setAllowRequestsToTwentyIcons,
|
||||
]);
|
||||
|
||||
return {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
import { createState } from 'twenty-ui/utilities';
|
||||
|
||||
export const allowRequestsToTwentyIconsState = createState<boolean>({
|
||||
key: 'allowRequestsToTwentyIcons',
|
||||
defaultValue: true,
|
||||
});
|
||||
@@ -38,4 +38,5 @@ export type ClientConfig = {
|
||||
signInPrefilled: boolean;
|
||||
support: Support;
|
||||
isTwoFactorAuthenticationEnabled: boolean;
|
||||
allowRequestsToTwentyIcons: boolean;
|
||||
};
|
||||
|
||||
+6
@@ -3,6 +3,8 @@ import { CommandMenuContextRecordChipAvatars } from '@/command-menu/components/C
|
||||
import { getSelectedRecordsContextText } from '@/command-menu/utils/getRecordContextText';
|
||||
import { useFindManyRecordsSelectedInContextStore } from '@/context-store/hooks/useFindManyRecordsSelectedInContextStore';
|
||||
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
export const CommandMenuContextRecordsChip = ({
|
||||
objectMetadataItemId,
|
||||
@@ -14,6 +16,9 @@ export const CommandMenuContextRecordsChip = ({
|
||||
const { objectMetadataItem } = useObjectMetadataItemById({
|
||||
objectId: objectMetadataItemId,
|
||||
});
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const { records, loading, totalCount } =
|
||||
useFindManyRecordsSelectedInContextStore({
|
||||
@@ -39,6 +44,7 @@ export const CommandMenuContextRecordsChip = ({
|
||||
objectMetadataItem,
|
||||
records,
|
||||
totalCount,
|
||||
allowRequestsToTwentyIcons,
|
||||
)}
|
||||
Icons={Avatars}
|
||||
/>
|
||||
|
||||
@@ -19,6 +19,7 @@ import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import { dateLocaleState } from '~/localization/states/dateLocaleState';
|
||||
import { beautifyPastDateRelativeToNow } from '~/utils/date-utils';
|
||||
import { CommandMenuPageInfoLayout } from './CommandMenuPageInfoLayout';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
export const CommandMenuRecordInfo = ({
|
||||
commandMenuPageInstanceId,
|
||||
@@ -29,6 +30,9 @@ export const CommandMenuRecordInfo = ({
|
||||
viewableRecordNameSingularComponentState,
|
||||
commandMenuPageInstanceId,
|
||||
);
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const viewableRecordId = useRecoilComponentValue(
|
||||
viewableRecordIdComponentState,
|
||||
@@ -50,6 +54,7 @@ export const CommandMenuRecordInfo = ({
|
||||
const recordIdentifier = useRecoilValue(
|
||||
recordStoreIdentifierFamilySelector({
|
||||
recordId: objectRecordId,
|
||||
allowRequestsToTwentyIcons,
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import styled from '@emotion/styled';
|
||||
import { useMemo } from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
const StyledIconWrapper = styled.div`
|
||||
background: ${({ theme }) => theme.background.primary};
|
||||
@@ -25,6 +26,10 @@ export const useCommandMenuContextChips = () => {
|
||||
commandMenuNavigationStackState,
|
||||
);
|
||||
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
const { navigateCommandMenuHistory } = useCommandMenuHistory();
|
||||
@@ -44,6 +49,7 @@ export const useCommandMenuContextChips = () => {
|
||||
const recordIdentifiers = useRecoilValue(
|
||||
recordStoreIdentifiersFamilySelector({
|
||||
recordIds: allRecordIds,
|
||||
allowRequestsToTwentyIcons,
|
||||
}),
|
||||
);
|
||||
const records = useRecoilValue(
|
||||
|
||||
@@ -6,8 +6,13 @@ export const getSelectedRecordsContextText = (
|
||||
objectMetadataItem: ObjectMetadataItem,
|
||||
records: ObjectRecord[],
|
||||
totalCount: number,
|
||||
allowRequestsToTwentyIcons: boolean,
|
||||
) => {
|
||||
return totalCount === 1
|
||||
? getObjectRecordIdentifier({ objectMetadataItem, record: records[0] }).name
|
||||
? getObjectRecordIdentifier({
|
||||
objectMetadataItem,
|
||||
record: records[0],
|
||||
allowRequestsToTwentyIcons,
|
||||
}).name
|
||||
: `${totalCount} ${objectMetadataItem.labelPlural}`;
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@ import { useMemo } from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import { usePrefetchedFavoritesData } from './usePrefetchedFavoritesData';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
export const useFavorites = () => {
|
||||
const { favorites } = usePrefetchedFavoritesData();
|
||||
@@ -19,8 +20,11 @@ export const useFavorites = () => {
|
||||
useObjectMetadataItem({
|
||||
objectNameSingular: CoreObjectNameSingular.Favorite,
|
||||
});
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
const getObjectRecordIdentifierByNameSingular =
|
||||
useGetObjectRecordIdentifierByNameSingular();
|
||||
useGetObjectRecordIdentifierByNameSingular(allowRequestsToTwentyIcons);
|
||||
|
||||
const favoriteRelationFieldMetadataItems = useMemo(
|
||||
() =>
|
||||
|
||||
@@ -4,11 +4,15 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
export const useFavoritesMetadata = () => {
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
const getObjectRecordIdentifierByNameSingular =
|
||||
useGetObjectRecordIdentifierByNameSingular();
|
||||
useGetObjectRecordIdentifierByNameSingular(allowRequestsToTwentyIcons);
|
||||
|
||||
const { objectMetadataItem: favoriteObjectMetadataItem } =
|
||||
useObjectMetadataItem({
|
||||
|
||||
@@ -10,6 +10,7 @@ import { useMemo } from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import { usePrefetchedFavoritesData } from './usePrefetchedFavoritesData';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
export const useWorkspaceFavorites = () => {
|
||||
const { workspaceFavorites } = usePrefetchedFavoritesData();
|
||||
@@ -19,8 +20,11 @@ export const useWorkspaceFavorites = () => {
|
||||
useObjectMetadataItem({
|
||||
objectNameSingular: CoreObjectNameSingular.Favorite,
|
||||
});
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
const getObjectRecordIdentifierByNameSingular =
|
||||
useGetObjectRecordIdentifierByNameSingular();
|
||||
useGetObjectRecordIdentifierByNameSingular(allowRequestsToTwentyIcons);
|
||||
|
||||
const favoriteRelationFieldMetadataItems = useMemo(
|
||||
() =>
|
||||
|
||||
+9
-3
@@ -4,16 +4,22 @@ import { useRecoilValue } from 'recoil';
|
||||
import { PreComputedChipGeneratorsContext } from '@/object-metadata/contexts/PreComputedChipGeneratorsContext';
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { getRecordChipGenerators } from '@/object-record/utils/getRecordChipGenerators';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
export const PreComputedChipGeneratorsProvider = ({
|
||||
children,
|
||||
}: React.PropsWithChildren) => {
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
const { chipGeneratorPerObjectPerField, identifierChipGeneratorPerObject } =
|
||||
useMemo(() => {
|
||||
return getRecordChipGenerators(objectMetadataItems);
|
||||
}, [objectMetadataItems]);
|
||||
return getRecordChipGenerators(
|
||||
objectMetadataItems,
|
||||
allowRequestsToTwentyIcons,
|
||||
);
|
||||
}, [allowRequestsToTwentyIcons, objectMetadataItems]);
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ describe('useGetObjectRecordIdentifierByNameSingular', () => {
|
||||
|
||||
setMetadataItems(generatedMockObjectMetadataItems);
|
||||
|
||||
return useGetObjectRecordIdentifierByNameSingular()(
|
||||
return useGetObjectRecordIdentifierByNameSingular(true)(
|
||||
record,
|
||||
objectNameSingular,
|
||||
);
|
||||
|
||||
+1
@@ -13,6 +13,7 @@ describe('useMapToObjectRecordIdentifier', () => {
|
||||
() => {
|
||||
const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
|
||||
objectNameSingular: 'person',
|
||||
allowRequestsToTwentyIcons: true,
|
||||
});
|
||||
|
||||
return mapToObjectRecordIdentifier({
|
||||
|
||||
+4
-1
@@ -4,7 +4,9 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat
|
||||
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
|
||||
import { type ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
|
||||
|
||||
export const useGetObjectRecordIdentifierByNameSingular = () => {
|
||||
export const useGetObjectRecordIdentifierByNameSingular = (
|
||||
allowRequestsToTwentyIcons: boolean,
|
||||
) => {
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
return (record: any, objectNameSingular: string): ObjectRecordIdentifier => {
|
||||
@@ -21,6 +23,7 @@ export const useGetObjectRecordIdentifierByNameSingular = () => {
|
||||
return getObjectRecordIdentifier({
|
||||
objectMetadataItem,
|
||||
record,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
+7
-1
@@ -4,15 +4,21 @@ import { type ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||
|
||||
export const useMapToObjectRecordIdentifier = ({
|
||||
objectNameSingular,
|
||||
allowRequestsToTwentyIcons,
|
||||
}: {
|
||||
objectNameSingular: string;
|
||||
allowRequestsToTwentyIcons: boolean;
|
||||
}) => {
|
||||
const { objectMetadataItem } = useObjectMetadataItem({
|
||||
objectNameSingular,
|
||||
});
|
||||
|
||||
const mapToObjectRecordIdentifier = (record: ObjectRecord) => {
|
||||
return getObjectRecordIdentifier({ objectMetadataItem, record });
|
||||
return getObjectRecordIdentifier({
|
||||
objectMetadataItem,
|
||||
record,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
};
|
||||
|
||||
return { mapToObjectRecordIdentifier };
|
||||
|
||||
@@ -15,12 +15,16 @@ export const getAvatarUrl = (
|
||||
objectNameSingular: string,
|
||||
record: ObjectRecord,
|
||||
imageIdentifierFieldMetadataItem: FieldMetadataItem | undefined,
|
||||
allowRequestsToTwentyIcons?: boolean | undefined,
|
||||
) => {
|
||||
if (objectNameSingular === CoreObjectNameSingular.WorkspaceMember) {
|
||||
return record.avatarUrl ?? undefined;
|
||||
}
|
||||
|
||||
if (objectNameSingular === CoreObjectNameSingular.Company) {
|
||||
if (
|
||||
objectNameSingular === CoreObjectNameSingular.Company &&
|
||||
allowRequestsToTwentyIcons === true
|
||||
) {
|
||||
return getLogoUrlFromDomainName(
|
||||
getCompanyDomainName(record as Company) ?? '',
|
||||
);
|
||||
|
||||
@@ -11,6 +11,7 @@ import { getLinkToShowPage } from './getLinkToShowPage';
|
||||
export const getObjectRecordIdentifier = ({
|
||||
objectMetadataItem,
|
||||
record,
|
||||
allowRequestsToTwentyIcons,
|
||||
}: {
|
||||
objectMetadataItem: Pick<
|
||||
ObjectMetadataItem,
|
||||
@@ -20,6 +21,7 @@ export const getObjectRecordIdentifier = ({
|
||||
| 'imageIdentifierFieldMetadataId'
|
||||
>;
|
||||
record: ObjectRecord;
|
||||
allowRequestsToTwentyIcons: boolean;
|
||||
}): ObjectRecordIdentifier => {
|
||||
const labelIdentifierFieldMetadataItem =
|
||||
getLabelIdentifierFieldMetadataItem(objectMetadataItem);
|
||||
@@ -40,6 +42,7 @@ export const getObjectRecordIdentifier = ({
|
||||
objectMetadataItem.nameSingular,
|
||||
record,
|
||||
imageIdentifierFieldMetadata,
|
||||
allowRequestsToTwentyIcons,
|
||||
);
|
||||
|
||||
const linkToShowPage = getLinkToShowPage(
|
||||
|
||||
+7
@@ -20,6 +20,8 @@ import {
|
||||
jsonRelationFilterValueSchema,
|
||||
} from 'twenty-shared/utils';
|
||||
import { IconUserCircle } from 'twenty-ui/display';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
export const EMPTY_FILTER_VALUE: string = JSON.stringify({
|
||||
isCurrentWorkspaceMemberSelected: false,
|
||||
@@ -41,6 +43,10 @@ export const ObjectFilterDropdownRecordSelect = ({
|
||||
fieldMetadataItemUsedInDropdownComponentSelector,
|
||||
);
|
||||
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const { objectFilterDropdownFilterValue } =
|
||||
useObjectFilterDropdownFilterValue();
|
||||
|
||||
@@ -120,6 +126,7 @@ export const ObjectFilterDropdownRecordSelect = ({
|
||||
selectedIds: selectedRecordIds,
|
||||
objectNameSingular,
|
||||
limit: 10,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
|
||||
const currentWorkspaceMemberSelectableItem: SelectableItem = {
|
||||
|
||||
@@ -14,6 +14,7 @@ import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
type SummaryCardProps = {
|
||||
objectNameSingular: string;
|
||||
@@ -37,6 +38,9 @@ export const SummaryCard = ({
|
||||
fieldName: 'createdAt',
|
||||
}),
|
||||
);
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const { onUploadPicture, useUpdateOneObjectRecordMutation } =
|
||||
useRecordShowContainerActions({
|
||||
@@ -49,6 +53,7 @@ export const SummaryCard = ({
|
||||
const recordIdentifier = useRecoilValue(
|
||||
recordStoreIdentifierFamilySelector({
|
||||
recordId: objectRecordId,
|
||||
allowRequestsToTwentyIcons,
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
+8
-1
@@ -8,7 +8,13 @@ import { uncapitalize } from 'twenty-shared/utils';
|
||||
export const recordStoreIdentifierFamilySelector = selectorFamily({
|
||||
key: 'recordStoreIdentifierFamilySelector',
|
||||
get:
|
||||
({ recordId }: { recordId: string }) =>
|
||||
({
|
||||
recordId,
|
||||
allowRequestsToTwentyIcons,
|
||||
}: {
|
||||
recordId: string;
|
||||
allowRequestsToTwentyIcons: boolean;
|
||||
}) =>
|
||||
({ get }) => {
|
||||
const recordFromStore = get(recordStoreFamilyState(recordId));
|
||||
const objectNameSingular = uncapitalize(
|
||||
@@ -28,6 +34,7 @@ export const recordStoreIdentifierFamilySelector = selectorFamily({
|
||||
return getObjectRecordIdentifier({
|
||||
objectMetadataItem: objectMetadataItem,
|
||||
record: recordFromStore,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
+8
-1
@@ -8,7 +8,13 @@ import { isDefined, uncapitalize } from 'twenty-shared/utils';
|
||||
export const recordStoreIdentifiersFamilySelector = selectorFamily({
|
||||
key: 'recordStoreIdentifiersFamilySelector',
|
||||
get:
|
||||
({ recordIds }: { recordIds: string[] }) =>
|
||||
({
|
||||
recordIds,
|
||||
allowRequestsToTwentyIcons,
|
||||
}: {
|
||||
recordIds: string[];
|
||||
allowRequestsToTwentyIcons: boolean;
|
||||
}) =>
|
||||
({ get }) => {
|
||||
const objectMetadataItems = get(objectMetadataItemsState);
|
||||
|
||||
@@ -30,6 +36,7 @@ export const recordStoreIdentifiersFamilySelector = selectorFamily({
|
||||
return getObjectRecordIdentifier({
|
||||
objectMetadataItem: objectMetadataItem,
|
||||
record: recordFromStore,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
})
|
||||
.filter(isDefined);
|
||||
|
||||
@@ -18,6 +18,7 @@ export const useRecordsForSelect = ({
|
||||
limit,
|
||||
excludedRecordIds = [],
|
||||
objectNameSingular,
|
||||
allowRequestsToTwentyIcons,
|
||||
}: {
|
||||
searchFilterText: string;
|
||||
sortOrder?: OrderBy;
|
||||
@@ -25,9 +26,11 @@ export const useRecordsForSelect = ({
|
||||
limit?: number;
|
||||
excludedRecordIds?: string[];
|
||||
objectNameSingular: string;
|
||||
allowRequestsToTwentyIcons: boolean;
|
||||
}) => {
|
||||
const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
|
||||
objectNameSingular,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
|
||||
const filters = [
|
||||
|
||||
@@ -16,6 +16,7 @@ import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
|
||||
export const getRecordChipGenerators = (
|
||||
objectMetadataItems: ObjectMetadataItem[],
|
||||
allowRequestsToTwentyIcons?: boolean,
|
||||
) => {
|
||||
const chipGeneratorPerObjectPerField: ChipGeneratorPerObjectNameSingularPerFieldName =
|
||||
{};
|
||||
@@ -92,6 +93,7 @@ export const getRecordChipGenerators = (
|
||||
objectMetadataItemToUse.nameSingular,
|
||||
record,
|
||||
imageIdentifierFieldMetadataToUse,
|
||||
allowRequestsToTwentyIcons,
|
||||
),
|
||||
avatarType,
|
||||
isLabelIdentifier,
|
||||
|
||||
+7
@@ -12,6 +12,8 @@ import {
|
||||
isDefined,
|
||||
jsonRelationFilterValueSchema,
|
||||
} from 'twenty-shared/utils';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
|
||||
|
||||
type ObjectFilterDropdownRecordSelectProps = {
|
||||
recordFilter: RecordFilter;
|
||||
@@ -21,6 +23,10 @@ type ObjectFilterDropdownRecordSelectProps = {
|
||||
export const useComputeRecordRelationFilterLabelValue = ({
|
||||
recordFilter,
|
||||
}: ObjectFilterDropdownRecordSelectProps) => {
|
||||
const allowRequestsToTwentyIcons = useRecoilValue(
|
||||
allowRequestsToTwentyIconsState,
|
||||
);
|
||||
|
||||
const { objectMetadataItems } = useObjectMetadataItems();
|
||||
|
||||
const { getRecordFilterChipLabelValue } = useGetRecordFilterChipLabelValue();
|
||||
@@ -69,6 +75,7 @@ export const useComputeRecordRelationFilterLabelValue = ({
|
||||
selectedIds: selectedRecordIds,
|
||||
objectNameSingular: relationObjectMetadataNameSingular,
|
||||
limit: 10,
|
||||
allowRequestsToTwentyIcons,
|
||||
});
|
||||
|
||||
if (loading) {
|
||||
|
||||
@@ -56,5 +56,6 @@ export const mockedClientConfig: ClientConfig = {
|
||||
isImapSmtpCaldavEnabled: false,
|
||||
isTwoFactorAuthenticationEnabled: false,
|
||||
isEmailingDomainsEnabled: false,
|
||||
allowRequestsToTwentyIcons: true,
|
||||
isCloudflareIntegrationEnabled: false,
|
||||
};
|
||||
|
||||
@@ -83,3 +83,4 @@ FRONTEND_URL=http://localhost:3001
|
||||
# ANALYTICS_ENABLED=
|
||||
# CLICKHOUSE_URL=http://default:clickhousePassword@localhost:8123/twenty
|
||||
# HTTP_TOOL_SAFE_MODE_ENABLED=true
|
||||
# ALLOW_REQUESTS_TO_TWENTY_ICONS=true
|
||||
|
||||
+1
@@ -98,6 +98,7 @@ describe('ClientConfigController', () => {
|
||||
isImapSmtpCaldavEnabled: false,
|
||||
calendarBookingPageId: undefined,
|
||||
isTwoFactorAuthenticationEnabled: false,
|
||||
allowRequestsToTwentyIcons: true,
|
||||
isCloudflareIntegrationEnabled: false,
|
||||
};
|
||||
|
||||
|
||||
@@ -195,6 +195,9 @@ export class ClientConfig {
|
||||
@Field(() => Boolean)
|
||||
isImapSmtpCaldavEnabled: boolean;
|
||||
|
||||
@Field(() => Boolean)
|
||||
allowRequestsToTwentyIcons: boolean;
|
||||
|
||||
@Field(() => String, { nullable: true })
|
||||
calendarBookingPageId?: string;
|
||||
|
||||
|
||||
+3
@@ -195,6 +195,9 @@ export class ClientConfigService {
|
||||
isImapSmtpCaldavEnabled: this.twentyConfigService.get(
|
||||
'IS_IMAP_SMTP_CALDAV_ENABLED',
|
||||
),
|
||||
allowRequestsToTwentyIcons: this.twentyConfigService.get(
|
||||
'ALLOW_REQUESTS_TO_TWENTY_ICONS',
|
||||
),
|
||||
calendarBookingPageId: isNonEmptyString(calendarBookingPageId)
|
||||
? calendarBookingPageId
|
||||
: undefined,
|
||||
|
||||
+2
-2
@@ -7,8 +7,8 @@ import {
|
||||
} from 'src/engine/core-modules/__mocks__/mockFlatObjectMetadatas';
|
||||
import { FileService } from 'src/engine/core-modules/file/services/file.service';
|
||||
import { SearchService } from 'src/engine/core-modules/search/services/search.service';
|
||||
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
|
||||
import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager';
|
||||
import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service';
|
||||
|
||||
describe('SearchService', () => {
|
||||
let service: SearchService;
|
||||
@@ -18,8 +18,8 @@ describe('SearchService', () => {
|
||||
providers: [
|
||||
SearchService,
|
||||
{ provide: GlobalWorkspaceOrmManager, useValue: {} },
|
||||
{ provide: WorkspaceCacheStorageService, useValue: {} },
|
||||
{ provide: FileService, useValue: {} },
|
||||
{ provide: TwentyConfigService, useValue: { get: () => false } },
|
||||
],
|
||||
}).compile();
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-me
|
||||
import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager';
|
||||
import { type WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
|
||||
import { type RolePermissionConfig } from 'src/engine/twenty-orm/types/role-permission-config';
|
||||
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
|
||||
|
||||
type LastRanks = { tsRankCD: number; tsRank: number };
|
||||
|
||||
@@ -48,6 +49,7 @@ export class SearchService {
|
||||
constructor(
|
||||
private readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager,
|
||||
private readonly fileService: FileService,
|
||||
private readonly twentyConfigService: TwentyConfigService,
|
||||
) {}
|
||||
|
||||
async getAllRecordsWithObjectMetadataItems({
|
||||
@@ -383,7 +385,10 @@ export class SearchService {
|
||||
flatFieldMetadataMaps,
|
||||
);
|
||||
|
||||
if (flatObjectMetadata.nameSingular === 'company') {
|
||||
if (
|
||||
flatObjectMetadata.nameSingular === 'company' &&
|
||||
this.twentyConfigService.get('ALLOW_REQUESTS_TO_TWENTY_ICONS')
|
||||
) {
|
||||
return getLogoUrlFromDomainName(record.domainNamePrimaryLinkUrl) || '';
|
||||
}
|
||||
|
||||
|
||||
@@ -161,6 +161,14 @@ export class ConfigVariables {
|
||||
})
|
||||
IS_IMAP_SMTP_CALDAV_ENABLED = true;
|
||||
|
||||
@ConfigVariablesMetadata({
|
||||
group: ConfigVariablesGroup.OTHER,
|
||||
description:
|
||||
"Enable or disable requests to twenty-icons to get companies' icons",
|
||||
type: ConfigVariableType.BOOLEAN,
|
||||
})
|
||||
ALLOW_REQUESTS_TO_TWENTY_ICONS = true;
|
||||
|
||||
@ConfigVariablesMetadata({
|
||||
group: ConfigVariablesGroup.MICROSOFT_AUTH,
|
||||
description: 'Enable or disable Microsoft authentication',
|
||||
|
||||
Reference in New Issue
Block a user