Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .github/workflows/server-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,27 @@ on:
type: string
default: "false"

workflow_dispatch:
inputs:
pr:
description: "PR number for the workflow"
required: false
type: number
skip-tests:
description: "Skip tests flag"
required: false
type: string
default: "false"
branch:
description: "Branch for the build"
required: false
type: string
is-pg-build:
description: "Flag for PG build"
required: false
type: string
default: "false"

# Change the working directory for all the jobs in this workflow
defaults:
run:
Expand Down
1 change: 1 addition & 0 deletions app/client/packages/dsl/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ export type {
export { migrateDSL, LATEST_DSL_VERSION } from "./migrate";

export type { DSLWidget } from "./migrate/types";
export { isDynamicValue } from "./migrate/utils";
1 change: 1 addition & 0 deletions app/client/src/PluginActionEditor/hooks/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export { useActionSettingsConfig } from "ee/PluginActionEditor/hooks/useActionSettingsConfig";
export { useHandleDeleteClick } from "ee/PluginActionEditor/hooks/useHandleDeleteClick";
export { useHandleDuplicateClick } from "./useHandleDuplicateClick";
export { useHandleRunClick } from "ee/PluginActionEditor/hooks/useHandleRunClick";
export { useBlockExecution } from "ee/PluginActionEditor/hooks/useBlockExecution";
export { useAnalyticsOnRunClick } from "ee/PluginActionEditor/hooks/useAnalyticsOnRunClick";
26 changes: 26 additions & 0 deletions app/client/src/PluginActionEditor/hooks/useHandleDuplicateClick.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { copyActionRequest } from "actions/pluginActionActions";
import { usePluginActionContext } from "PluginActionEditor/PluginActionContext";
import { useCallback } from "react";
import { useDispatch } from "react-redux";

function useHandleDuplicateClick() {
const { action } = usePluginActionContext();
const dispatch = useDispatch();

const handleDuplicateClick = useCallback(
(destinationEntityId: string) => {
dispatch(
copyActionRequest({
id: action.id,
destinationEntityId,
name: action.name,
}),
);
},
[action.id, action.name, dispatch],
);

return { handleDuplicateClick };
}

export { useHandleDuplicateClick };
7 changes: 4 additions & 3 deletions app/client/src/actions/datasourceActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ export const createDatasourceFromForm = (
};
};

export const createTempDatasourceFromForm = (
payload: CreateDatasourceConfig | Datasource,
) => {
export const createTempDatasourceFromForm = (payload: {
pluginId: string;
type: PluginType;
}) => {
return {
type: ReduxActionTypes.CREATE_TEMP_DATASOURCE_FROM_FORM_SUCCESS,
payload,
Expand Down
5 changes: 3 additions & 2 deletions app/client/src/actions/pluginActionActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import type { ApiResponse } from "api/ApiResponses";
import type { JSCollection } from "entities/JSCollection";
import type { ErrorActionPayload } from "sagas/ErrorSagas";
import type { EventLocation } from "ee/utils/analyticsUtilTypes";
import type { GenerateDestinationIdInfoReturnType } from "ee/sagas/helpers";

export const createActionRequest = (payload: Partial<Action>) => {
return {
Expand Down Expand Up @@ -225,7 +226,7 @@ export const moveActionError = (

export const copyActionRequest = (payload: {
id: string;
destinationPageId: string;
destinationEntityId: string;
name: string;
}) => {
return {
Expand All @@ -244,7 +245,7 @@ export const copyActionSuccess = (payload: Action) => {
export const copyActionError = (
payload: {
id: string;
destinationPageId: string;
destinationEntityIdInfo: GenerateDestinationIdInfoReturnType;
} & ErrorActionPayload,
) => {
return {
Expand Down
3 changes: 2 additions & 1 deletion app/client/src/ce/constants/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ export const ACTION_MOVE_SUCCESS = (actionName: string, pageName: string) =>
export const ERROR_ACTION_MOVE_FAIL = (actionName: string) =>
`Error while moving action ${actionName}`;
export const ACTION_COPY_SUCCESS = (actionName: string, pageName: string) =>
`${actionName} action copied to page ${pageName} successfully`;
`${actionName} action copied ${pageName.length > 0 ? "to page " + pageName : ""} successfully`;
export const ERROR_ACTION_COPY_FAIL = (actionName: string) =>
`Error while copying action ${actionName}`;
export const ERROR_ACTION_RENAME_FAIL = (actionName: string) =>
Expand Down Expand Up @@ -1731,6 +1731,7 @@ export const CONTEXT_RENAME = () => "Rename";
export const CONTEXT_SHOW_BINDING = () => "Show bindings";
export const CONTEXT_MOVE = () => "Move to page";
export const CONTEXT_COPY = () => "Copy to page";
export const CONTEXT_DUPLICATE = () => "Duplicate";
export const CONTEXT_DELETE = () => "Delete";
export const CONFIRM_CONTEXT_DELETE = () => "Are you sure?";
export const CONFIRM_CONTEXT_DELETING = () => "Deleting";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const Copy = () => {
dispatch(
copyActionRequest({
id: action.id,
destinationPageId: pageId,
destinationEntityId: pageId,
name: action.name,
}),
),
Expand Down
17 changes: 17 additions & 0 deletions app/client/src/ce/sagas/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,23 @@ export interface ResolveParentEntityMetadataReturnType {
parentEntityKey?: CreateNewActionKeyInterface;
}

// This function is extended in EE. Please check the EE implementation before any modification.
export interface GenerateDestinationIdInfoReturnType {
pageId?: string;
}

// This function is extended in EE. Please check the EE implementation before any modification.
export function generateDestinationIdInfoForQueryDuplication(
destinationEntityId: string,
parentEntityKey: CreateNewActionKeyInterface,
): GenerateDestinationIdInfoReturnType {
if (parentEntityKey === CreateNewActionKey.PAGE) {
return { pageId: destinationEntityId };
}

return {};
}

// This function is extended in EE. Please check the EE implementation before any modification.
export const resolveParentEntityMetadata = (
action: Partial<Action>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export enum DROPDOWN_VARIANT {
CONNECT_TO_DATASOURCE = "Connect to datasource",
CREATE_OR_EDIT_RECORDS = "Create or edit records",
CONNECT_TO_QUERY = "Connect to query",
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
getCurrentActions,
getCurrentPageWidgets,
getPluginIdPackageNamesMap,
getPlugins,
getQueryModuleInstances,
} from "ee/selectors/entitiesSelector";
import WidgetFactory from "WidgetProvider/factory";
Expand All @@ -25,6 +26,7 @@ import type {
import type { Module } from "ee/constants/ModuleConstants";
import { getAllModules } from "ee/selectors/modulesSelector";
import { getModuleIcon } from "pages/Editor/utils";
import { isDynamicValue } from "@shared/dsl";

enum SortingWeights {
alphabetical = 1,
Expand Down Expand Up @@ -74,20 +76,26 @@ export function sortQueries(
});
}

export const getDefaultQueryBindingValue = (
query: ActionData | ModuleInstanceData,
) => `{{${query.config.name}.data}}`;

export function getBindingValue(
widget: WidgetProps,
query: ActionData | ModuleInstanceData,
getQueryBindingValue: (
query: ActionData | ModuleInstanceData,
) => string = getDefaultQueryBindingValue,
) {
const defaultBindingValue = `{{${query.config.name}.data}}`;
const querySuggestedWidgets = query.data?.suggestedWidgets;

if (!querySuggestedWidgets) return defaultBindingValue;
if (!querySuggestedWidgets) return getQueryBindingValue(query);

const suggestedWidget = querySuggestedWidgets.find(
(suggestedWidget) => suggestedWidget.type === widget.type,
);

if (!suggestedWidget) return defaultBindingValue;
if (!suggestedWidget) return getQueryBindingValue(query);

return `{{${query.config.name}.${suggestedWidget.bindingQuery}}}`;
}
Expand Down Expand Up @@ -157,14 +165,17 @@ export const getAnalyticsInfo = (
function useConnectToOptions(props: ConnectToOptionsProps) {
const {
addBinding,
allowedDatasourceTypes,
expectedType,
getQueryBindingValue,
isConnectableToWidget,
propertyName,
updateConfig,
} = useContext(WidgetQueryGeneratorFormContext);

const queries = useSelector(getCurrentActions);
const pluginsPackageNamesMap = useSelector(getPluginIdPackageNamesMap);
const plugins = useSelector(getPlugins);

const { pluginImages, widget } = props;

Expand All @@ -182,6 +193,19 @@ function useConnectToOptions(props: ConnectToOptionsProps) {
});
}

// filter query based on allowedDatasourceType
if (allowedDatasourceTypes) {
const allowedPluginIds = plugins
.filter((plugin) => allowedDatasourceTypes.includes(plugin.name))
.map((plugin) => plugin.id);

if (allowedPluginIds.length) {
filteredQueries = filteredQueries.filter((query) =>
allowedPluginIds.includes(query.config.pluginId),
);
}
}

filteredQueries = [...filteredQueries, ...queryModuleInstances] as
| ActionDataState
| ModuleInstanceDataState;
Expand All @@ -190,10 +214,12 @@ function useConnectToOptions(props: ConnectToOptionsProps) {
return sortQueries(filteredQueries, expectedType).map((query) => ({
id: query.config.id,
label: query.config.name,
value: getBindingValue(widget, query),
value: getBindingValue(widget, query, getQueryBindingValue),
icon: getQueryIcon(query, pluginImages, modules),
onSelect: function (value?: string, valueOption?: DropdownOptionType) {
addBinding(valueOption?.value, true);
onSelect: function (value: string, valueOption?: DropdownOptionType) {
const isDynamic = isDynamicValue(value);

addBinding(valueOption?.value, isDynamic);

updateConfig({
datasource: "",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,16 @@ import type { WidgetProps } from "widgets/BaseWidget";
import { WidgetQueryGeneratorFormContext } from "components/editorComponents/WidgetQueryGeneratorForm/index";
import { getAssetUrl } from "ee/utils/airgapHelpers";
import { getDatasourceConnectionMode } from "components/editorComponents/WidgetQueryGeneratorForm/utils";
import { DROPDOWN_VARIANT } from "../types";

interface DatasourceOptionsProps {
widget: WidgetProps;
pluginImages: Record<string, string>;
}

function useDatasourceOptions(props: DatasourceOptionsProps) {
const { config, propertyName, updateConfig } = useContext(
WidgetQueryGeneratorFormContext,
);
const { config, datasourceDropdownVariant, propertyName, updateConfig } =
useContext(WidgetQueryGeneratorFormContext);
const { pluginImages, widget } = props;
const dispatch = useDispatch();
const datasources: Datasource[] = useSelector(getDatasources);
Expand All @@ -58,6 +58,11 @@ function useDatasourceOptions(props: DatasourceOptionsProps) {
useState(false);

const [actualDatasourceOptions, mockDatasourceOptions] = useMemo(() => {
// we don't want to show the datasource options for connect to query variant
if (datasourceDropdownVariant === DROPDOWN_VARIANT.CONNECT_TO_QUERY) {
return [[], []];
}

const availableDatasources = datasources.filter(({ pluginId }) =>
WidgetQueryGeneratorRegistry.has(pluginsPackageNamesMap[pluginId]),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,35 +35,39 @@ function useOtherOptions(props: OtherOptionsProps) {
datasourceDropdownVariant === DROPDOWN_VARIANT.CREATE_OR_EDIT_RECORDS;
const { widget } = props;
const otherOptions = useMemo(() => {
const options = [
{
icon: <Icon name="plus" size="md" />,
id: "Connect new datasource",
label: "Connect new datasource",
value: "Connect new datasource",
onSelect: () => {
history.push(
integrationEditorURL({
basePageId,
selectedTab: INTEGRATION_TABS.NEW,
}),
);
// we don't want to show the options for connect to query variant
if (datasourceDropdownVariant === DROPDOWN_VARIANT.CONNECT_TO_QUERY)
return [];

AnalyticsUtil.logEvent("BIND_OTHER_ACTIONS", {
widgetName: widget.widgetName,
widgetType: widget.type,
propertyName: propertyName,
selectedAction: "Connect new datasource",
});
const options = [];

const entryPoint = DatasourceCreateEntryPoints.ONE_CLICK_BINDING;
options.push({
icon: <Icon name="plus" size="md" />,
id: "Connect new datasource",
label: "Connect new datasource",
value: "Connect new datasource",
onSelect: () => {
history.push(
integrationEditorURL({
basePageId,
selectedTab: INTEGRATION_TABS.NEW,
}),
);

AnalyticsUtil.logEvent("NAVIGATE_TO_CREATE_NEW_DATASOURCE_PAGE", {
entryPoint,
});
},
AnalyticsUtil.logEvent("BIND_OTHER_ACTIONS", {
widgetName: widget.widgetName,
widgetType: widget.type,
propertyName: propertyName,
selectedAction: "Connect new datasource",
});

const entryPoint = DatasourceCreateEntryPoints.ONE_CLICK_BINDING;

AnalyticsUtil.logEvent("NAVIGATE_TO_CREATE_NEW_DATASOURCE_PAGE", {
entryPoint,
});
},
];
});

if (sampleData) {
options.push({
Expand Down
Loading