Skip to content

Commit 4eaae6b

Browse files
authored
Merge pull request #41115 from appsmithorg/release
16/07 Daily Promotion
2 parents f96f581 + 16ea831 commit 4eaae6b

File tree

6 files changed

+99
-39
lines changed

6 files changed

+99
-39
lines changed

app/client/src/ce/entities/FeatureFlag.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export const FEATURE_FLAG = {
6464
"release_jsobjects_onpageunloadactions_enabled",
6565
configure_block_event_tracking_for_anonymous_users:
6666
"configure_block_event_tracking_for_anonymous_users",
67+
release_paid_features_tagging: "release_paid_features_tagging",
6768
} as const;
6869

6970
export type FeatureFlag = keyof typeof FEATURE_FLAG;
@@ -116,6 +117,7 @@ export const DEFAULT_FEATURE_FLAG_VALUE: FeatureFlags = {
116117
license_ai_agent_instance_enabled: false,
117118
release_jsobjects_onpageunloadactions_enabled: false,
118119
configure_block_event_tracking_for_anonymous_users: false,
120+
release_paid_features_tagging: false,
119121
};
120122

121123
export const AB_TESTING_EVENT_KEYS = {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from "react";
2+
import { Icon, Tag } from "@appsmith/ads";
3+
import { VisuallyHidden } from "@react-aria/visually-hidden";
4+
5+
function PremiumFeatureTag() {
6+
return (
7+
<Tag isClosable={false} size="md">
8+
<Icon name="star-line" size="sm" />
9+
<VisuallyHidden>Premium feature</VisuallyHidden>
10+
</Tag>
11+
);
12+
}
13+
14+
export default PremiumFeatureTag;

app/client/src/pages/Editor/DataSidePane/DataSidePane.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
getDatasources,
77
getDatasourcesGroupedByPluginCategory,
88
getPluginImages,
9+
getPlugins,
910
} from "ee/selectors/entitiesSelector";
1011
import history from "utils/history";
1112
import { datasourcesEditorIdURL, integrationEditorURL } from "ee/RouteBuilder";
@@ -29,6 +30,10 @@ import { getHasCreateDatasourcePermission } from "ee/utils/BusinessFeatures/perm
2930
import { EmptyState } from "@appsmith/ads";
3031
import { getAssetUrl } from "ee/utils/airgapHelpers";
3132
import { getCurrentBasePageId } from "selectors/editorSelectors";
33+
import PremiumFeatureTag from "components/editorComponents/PremiumFeatureTag";
34+
import { PluginType } from "entities/Plugin";
35+
import { selectFeatureFlagCheck } from "ee/selectors/featureFlagsSelectors";
36+
import type { Datasource } from "entities/Datasource";
3237

3338
const PaneBody = styled.div`
3439
padding: var(--ads-v2-spaces-3) 0;
@@ -54,7 +59,16 @@ export const DataSidePane = (props: DataSidePaneProps) => {
5459
const datasources = useSelector(getDatasources);
5560
const groupedDatasources = useSelector(getDatasourcesGroupedByPluginCategory);
5661
const pluginImages = useSelector(getPluginImages);
62+
const plugins = useSelector(getPlugins);
5763
const location = useLocation();
64+
65+
const isIntegrationsEnabledForPaid = useSelector((state: DefaultRootState) =>
66+
selectFeatureFlagCheck(
67+
state,
68+
FEATURE_FLAG.license_external_saas_plugins_enabled,
69+
),
70+
);
71+
5872
const goToDatasource = useCallback((id: string) => {
5973
history.push(datasourcesEditorIdURL({ datasourceId: id }));
6074
}, []);
@@ -69,6 +83,9 @@ export const DataSidePane = (props: DataSidePaneProps) => {
6983
);
7084

7185
const isFeatureEnabled = useFeatureFlag(FEATURE_FLAG.license_gac_enabled);
86+
const isPaidFeaturesTaggingEnabled = useFeatureFlag(
87+
FEATURE_FLAG.release_paid_features_tagging,
88+
);
7289

7390
const canCreateDatasource = getHasCreateDatasourcePermission(
7491
isFeatureEnabled,
@@ -94,6 +111,26 @@ export const DataSidePane = (props: DataSidePaneProps) => {
94111
[addButtonClickHandler, canCreateDatasource],
95112
);
96113

114+
const shouldShowPremiumTag = useCallback(
115+
(datasource: Datasource) => {
116+
if (!isPaidFeaturesTaggingEnabled) return false;
117+
118+
const plugin = plugins.find((p) => p.id === datasource.pluginId);
119+
120+
if (!plugin) return false;
121+
122+
if (
123+
plugin.type === PluginType.EXTERNAL_SAAS &&
124+
!isIntegrationsEnabledForPaid
125+
) {
126+
return true;
127+
}
128+
129+
return false;
130+
},
131+
[plugins, isIntegrationsEnabledForPaid, isPaidFeaturesTaggingEnabled],
132+
);
133+
97134
return (
98135
<Flex flexDirection="column" height="100%" width="100%">
99136
<PaneHeader
@@ -131,6 +168,9 @@ export const DataSidePane = (props: DataSidePaneProps) => {
131168
className: "t--datasource",
132169
isSelected: currentSelectedDatasource === data.id,
133170
onClick: () => goToDatasource(data.id),
171+
rightControl: shouldShowPremiumTag(data) && (
172+
<PremiumFeatureTag />
173+
),
134174
};
135175
}),
136176
className: "",

app/client/src/pages/Editor/IntegrationEditor/DatasourceItem.tsx

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
DatasourceImage,
66
DatasourceName,
77
DatasourceNameWrapper,
8+
DatasourceContentWrapper,
9+
DatasourceLeftContent,
810
} from "./IntegrationStyledComponents";
911

1012
interface DatasourceItem {
@@ -40,25 +42,29 @@ export default function DatasourceItem({
4042
data-testid={dataCardTestId}
4143
onClick={handleOnClick}
4244
>
43-
<DatasourceImage
44-
alt={name}
45-
className="content-icon"
46-
data-testid={dataCardImageTestId}
47-
src={icon}
48-
/>
49-
<DatasourceNameWrapper data-testid={dataCardWrapperTestId}>
50-
<DatasourceName
51-
className="t--plugin-name"
52-
data-testid={dataNameTestId}
53-
renderAs="p"
54-
>
55-
{name}
56-
</DatasourceName>
57-
<DatasourceDescription data-testid={dataCardDescriptionTestId}>
58-
{description}
59-
</DatasourceDescription>
60-
</DatasourceNameWrapper>
61-
{rightSibling}
45+
<DatasourceContentWrapper>
46+
<DatasourceLeftContent>
47+
<DatasourceImage
48+
alt={name}
49+
className="content-icon"
50+
data-testid={dataCardImageTestId}
51+
src={icon}
52+
/>
53+
<DatasourceNameWrapper data-testid={dataCardWrapperTestId}>
54+
<DatasourceName
55+
className="t--plugin-name"
56+
data-testid={dataNameTestId}
57+
renderAs="p"
58+
>
59+
{name}
60+
</DatasourceName>
61+
<DatasourceDescription data-testid={dataCardDescriptionTestId}>
62+
{description}
63+
</DatasourceDescription>
64+
</DatasourceNameWrapper>
65+
</DatasourceLeftContent>
66+
{rightSibling}
67+
</DatasourceContentWrapper>
6268
</DatasourceCard>
6369
);
6470
}

app/client/src/pages/Editor/IntegrationEditor/IntegrationStyledComponents.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,18 @@ export const DatasourceDescription = styled.div`
7171
font-weight: var(--ads-v2-font-weight-normal);
7272
line-height: var(--ads-v2-line-height-2);
7373
`;
74+
75+
export const DatasourceContentWrapper = styled.div`
76+
display: flex;
77+
align-items: center;
78+
justify-content: space-between;
79+
width: 100%;
80+
gap: var(--ads-v2-spaces-4);
81+
`;
82+
83+
export const DatasourceLeftContent = styled.div`
84+
display: flex;
85+
align-items: center;
86+
gap: var(--ads-v2-spaces-4);
87+
flex: 1;
88+
`;

app/client/src/pages/Editor/IntegrationEditor/PremiumDatasources/index.tsx

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,17 @@
11
import React, { useState } from "react";
22
import { getAssetUrl } from "ee/utils/airgapHelpers";
3-
import { Modal, ModalContent, Tag } from "@appsmith/ads";
3+
import { Modal, ModalContent } from "@appsmith/ads";
44
import styled from "styled-components";
55
import ContactForm from "./ContactForm";
66
import { handlePremiumDatasourceClick } from "./Helpers";
77
import DatasourceItem from "../DatasourceItem";
8-
import { createMessage } from "ee/constants/messages";
9-
import { PREMIUM_DATASOURCES } from "ee/constants/messages";
108
import type { UpcomingIntegration } from "entities/Plugin";
9+
import PremiumFeatureTag from "components/editorComponents/PremiumFeatureTag";
1110

1211
const ModalContentWrapper = styled(ModalContent)`
1312
max-width: 518px;
1413
`;
1514

16-
const PremiumTag = styled(Tag)`
17-
color: var(--ads-v2-color-purple-700);
18-
background-color: var(--ads-v2-color-purple-100);
19-
border-color: var(--ads-v2-color-purple-300);
20-
padding: var(--ads-v2-spaces-3) var(--ads-v2-spaces-2);
21-
text-transform: uppercase;
22-
> span {
23-
font-weight: 700;
24-
font-size: 10px;
25-
}
26-
`;
27-
2815
export default function PremiumDatasources(props: {
2916
plugins: UpcomingIntegration[];
3017
isIntegrationsEnabledForPaid?: boolean;
@@ -53,11 +40,7 @@ export default function PremiumDatasources(props: {
5340
key={integration.name}
5441
name={integration.name}
5542
rightSibling={
56-
!props.isIntegrationsEnabledForPaid && (
57-
<PremiumTag isClosable={false} kind={"premium"}>
58-
{createMessage(PREMIUM_DATASOURCES.PREMIUM_TAG)}
59-
</PremiumTag>
60-
)
43+
!props.isIntegrationsEnabledForPaid && <PremiumFeatureTag />
6144
}
6245
/>
6346
))}

0 commit comments

Comments
 (0)