diff --git a/libs/designer-ui/src/lib/authentication/index.tsx b/libs/designer-ui/src/lib/authentication/index.tsx
index 4b8a5641ae3..7828c7fb517 100644
--- a/libs/designer-ui/src/lib/authentication/index.tsx
+++ b/libs/designer-ui/src/lib/authentication/index.tsx
@@ -12,7 +12,7 @@ import { MSIAuthentication } from './MSIAuth/MSIAuth';
import { RawAuthentication } from './RawAuth';
import { parseAuthEditor } from './util';
import type { IDropdownOption } from '@fluentui/react/lib/Dropdown';
-import { getIntl, AssertionErrorCode, AssertionException, format } from '@microsoft/logic-apps-shared';
+import { AssertionErrorCode, AssertionException, format, getIntl } from '@microsoft/logic-apps-shared';
import type { ManagedIdentity } from '@microsoft/logic-apps-shared';
import { useUpdateEffect } from '@react-hookz/web';
import { useState } from 'react';
diff --git a/libs/designer-ui/src/lib/connectors/__test__/predicates.spec.tsx b/libs/designer-ui/src/lib/connectors/__test__/predicates.spec.tsx
new file mode 100644
index 00000000000..bf7de6f4fe1
--- /dev/null
+++ b/libs/designer-ui/src/lib/connectors/__test__/predicates.spec.tsx
@@ -0,0 +1,70 @@
+import * as DesignerClientServices from '@microsoft/designer-client-services-logic-apps';
+import type { Connector, OperationApi } from '@microsoft/logic-apps-shared';
+import { isBuiltInConnector } from '../index';
+
+const getMinimalHostService = (): DesignerClientServices.IHostService => ({
+ fetchAndDisplayContent: jest.fn(),
+});
+
+describe('lib/connectors', () => {
+ afterEach(() => {
+ jest.restoreAllMocks();
+ });
+
+ describe('isBuiltInConnector', () => {
+ describe('works with no host service callbacks using', () => {
+ test('string input', () => {
+ jest.spyOn(DesignerClientServices, 'HostService').mockImplementation(getMinimalHostService);
+
+ expect(isBuiltInConnector('/builtin/Terminate')).toBe(true);
+ expect(isBuiltInConnector('/subscriptions/special/builtin/format')).toBe(false);
+ });
+
+ test('Connector input', () => {
+ jest.spyOn(DesignerClientServices, 'HostService').mockImplementation(getMinimalHostService);
+
+ expect(isBuiltInConnector({ id: '/builtin/Terminate' } as Connector)).toBe(true);
+ expect(isBuiltInConnector({ id: '/subscriptions/special/builtin/format' } as Connector)).toBe(false);
+ });
+
+ test('OperationApi input', () => {
+ jest.spyOn(DesignerClientServices, 'HostService').mockImplementation(getMinimalHostService);
+
+ expect(isBuiltInConnector({ id: '/builtin/Terminate' } as OperationApi)).toBe(true);
+ expect(isBuiltInConnector({ id: '/subscriptions/special/builtin/format' } as OperationApi)).toBe(false);
+ });
+ });
+
+ describe('works with host service callback using', () => {
+ test('string input', () => {
+ jest.spyOn(DesignerClientServices, 'HostService').mockImplementation(() => ({
+ ...getMinimalHostService(),
+ isBuiltInConnector: jest.fn().mockImplementation((value: string) => value === '/subscriptions/special/builtin/format'),
+ }));
+
+ expect(isBuiltInConnector('/builtin/Terminate')).toBe(false);
+ expect(isBuiltInConnector('/subscriptions/special/builtin/format')).toBe(true);
+ });
+
+ test('Connector input', () => {
+ jest.spyOn(DesignerClientServices, 'HostService').mockImplementation(() => ({
+ ...getMinimalHostService(),
+ isBuiltInConnector: jest.fn().mockImplementation((value: Connector) => value.id === '/subscriptions/special/builtin/format'),
+ }));
+
+ expect(isBuiltInConnector({ id: '/builtin/Terminate' } as Connector)).toBe(false);
+ expect(isBuiltInConnector({ id: '/subscriptions/special/builtin/format' } as Connector)).toBe(true);
+ });
+
+ test('OperationApi input', () => {
+ jest.spyOn(DesignerClientServices, 'HostService').mockImplementation(() => ({
+ ...getMinimalHostService(),
+ isBuiltInConnector: jest.fn().mockImplementation((value: OperationApi) => value.id === '/subscriptions/special/builtin/format'),
+ }));
+
+ expect(isBuiltInConnector({ id: '/builtin/Terminate' } as OperationApi)).toBe(false);
+ expect(isBuiltInConnector({ id: '/subscriptions/special/builtin/format' } as OperationApi)).toBe(true);
+ });
+ });
+ });
+});
diff --git a/libs/designer-ui/src/lib/connectors/index.ts b/libs/designer-ui/src/lib/connectors/index.ts
new file mode 100644
index 00000000000..42e836b675f
--- /dev/null
+++ b/libs/designer-ui/src/lib/connectors/index.ts
@@ -0,0 +1 @@
+export * from './predicates';
\ No newline at end of file
diff --git a/libs/designer-ui/src/lib/connectors/predicates.ts b/libs/designer-ui/src/lib/connectors/predicates.ts
new file mode 100644
index 00000000000..fdab289fe38
--- /dev/null
+++ b/libs/designer-ui/src/lib/connectors/predicates.ts
@@ -0,0 +1,25 @@
+import { HostService } from '@microsoft/designer-client-services-logic-apps';
+import type { Connector, OperationApi} from '@microsoft/logic-apps-shared';
+import { getAllConnectorProperties, isBuiltInConnectorId, isCustomConnectorId, isString } from '@microsoft/logic-apps-shared';
+
+export const isBuiltInConnector = (connector: Connector | OperationApi | string): boolean => {
+ const hostIsBuiltInConnectorFn = HostService()?.isBuiltInConnector;
+ if (hostIsBuiltInConnectorFn) {
+ const connectorParameter = isString(connector) ? connector : getAllConnectorProperties(connector);
+ return hostIsBuiltInConnectorFn(connectorParameter);
+ }
+
+ const connectorId = isString(connector) ? connector : connector.id;
+ return isBuiltInConnectorId(connectorId);
+};
+
+export const isCustomConnector = (connector: Connector | OperationApi | string): boolean => {
+ const hostIsCustomConnectorFn = HostService()?.isCustomConnector;
+ if (hostIsCustomConnectorFn) {
+ const connectorParameter = isString(connector) ? connector : getAllConnectorProperties(connector);
+ return hostIsCustomConnectorFn(connectorParameter);
+ }
+
+ const connectorId = isString(connector) ? connector : connector.id;
+ return isCustomConnectorId(connectorId);
+};
diff --git a/libs/designer-ui/src/lib/connectorsummarycard/index.tsx b/libs/designer-ui/src/lib/connectorsummarycard/index.tsx
index 7f40f16fb37..9a95ec4bc63 100644
--- a/libs/designer-ui/src/lib/connectorsummarycard/index.tsx
+++ b/libs/designer-ui/src/lib/connectorsummarycard/index.tsx
@@ -1,31 +1,33 @@
-import { InfoDot } from '../infoDot';
import { Text, css } from '@fluentui/react';
-import { fallbackConnectorIconUrl, isBuiltInConnector } from '@microsoft/logic-apps-shared';
+import type { Connector, OperationApi } from '@microsoft/logic-apps-shared';
+import { getDescriptionFromConnector, getDisplayNameFromConnector, getIconUriFromConnector } from '@microsoft/logic-apps-shared';
import { useCallback } from 'react';
+import { isBuiltInConnector } from '../connectors/predicates';
+import { InfoDot } from '../infoDot';
export interface ConnectorSummaryCardProps {
- id: string;
- connectorName: string;
+ connector: Connector | OperationApi;
displayRuntimeInfo: boolean;
- description?: string;
- iconUrl: string;
- brandColor?: string;
category: string;
onClick?: (id: string) => void;
isCard?: boolean;
}
export const ConnectorSummaryCard = (props: ConnectorSummaryCardProps) => {
- const { id, connectorName, description, iconUrl, category, onClick, isCard = true, displayRuntimeInfo } = props;
+ const { connector, category, onClick, isCard = true, displayRuntimeInfo } = props;
+ const { id } = connector;
+
+ const connectorName = getDisplayNameFromConnector(connector);
+ const description = getDescriptionFromConnector(connector);
+ const iconUrl = getIconUriFromConnector(connector);
const handleClick = () => onClick?.(id);
const ConnectorImage = useCallback(() => {
- const src = fallbackConnectorIconUrl(iconUrl);
- return
;
+ return
;
}, [connectorName, iconUrl, isCard]);
- const isBuiltIn = isBuiltInConnector(id);
+ const isBuiltIn = isBuiltInConnector(connector);
const Content = () => (
<>
diff --git a/libs/designer-ui/src/lib/index.ts b/libs/designer-ui/src/lib/index.ts
index 9fe4f1620fd..7d038804466 100644
--- a/libs/designer-ui/src/lib/index.ts
+++ b/libs/designer-ui/src/lib/index.ts
@@ -19,6 +19,7 @@ export * from './checkbox';
// export * from './colorizer'
export * from './code';
export * from './combobox';
+export * from './connectors';
export { default as UIConstants } from './constants';
export * from './html';
// export * from './conditioncontrol';
diff --git a/libs/designer-ui/src/lib/panel/recommendationpanel/browseResults.tsx b/libs/designer-ui/src/lib/panel/recommendationpanel/browseResults.tsx
index 279743b9c80..eb4760349ee 100644
--- a/libs/designer-ui/src/lib/panel/recommendationpanel/browseResults.tsx
+++ b/libs/designer-ui/src/lib/panel/recommendationpanel/browseResults.tsx
@@ -30,19 +30,14 @@ export const BrowseGrid = (props: BrowseGridProps) => {
const onRenderCell = useCallback(
(connector?: Connector, _index?: number) => {
if (!connector) return;
- const { displayName, description, iconUri, brandColor, generalInformation } = connector.properties;
return (
diff --git a/libs/designer-ui/src/lib/panel/recommendationpanel/operationSearchGroup/index.tsx b/libs/designer-ui/src/lib/panel/recommendationpanel/operationSearchGroup/index.tsx
index 752ee4d7cda..4030879c4e0 100644
--- a/libs/designer-ui/src/lib/panel/recommendationpanel/operationSearchGroup/index.tsx
+++ b/libs/designer-ui/src/lib/panel/recommendationpanel/operationSearchGroup/index.tsx
@@ -16,11 +16,11 @@ export interface OperationSearchGroupProps {
export const OperationSearchGroup = (props: OperationSearchGroupProps) => {
const { operationApi, operationActionsData, onConnectorClick, onOperationClick, displayRuntimeInfo } = props;
- const { id, displayName, description, iconUri } = operationApi;
+ const { id } = operationApi;
const intl = useIntl();
- const category = getConnectorCategoryString(id);
+ const category = getConnectorCategoryString(operationApi);
const seeMoreText = intl.formatMessage({
defaultMessage: 'See more',
@@ -29,15 +29,7 @@ export const OperationSearchGroup = (props: OperationSearchGroupProps) => {
return (
-
+
onConnectorClick(id)}>
{seeMoreText}
diff --git a/libs/designer-ui/src/lib/panel/recommendationpanel/searchResult.tsx b/libs/designer-ui/src/lib/panel/recommendationpanel/searchResult.tsx
index be3f2ee305b..05d1e47cf00 100644
--- a/libs/designer-ui/src/lib/panel/recommendationpanel/searchResult.tsx
+++ b/libs/designer-ui/src/lib/panel/recommendationpanel/searchResult.tsx
@@ -1,5 +1,6 @@
import NoResultsSvg from '../../../assets/search/noResults.svg';
import { AriaSearchResultsAlert } from '../../ariaSearchResults/ariaSearchResultsAlert';
+import { isBuiltInConnector } from '../../connectors';
import { getConnectorCategoryString } from '../../utils';
import type { OperationActionData } from './interfaces';
import { OperationSearchCard } from './operationSearchCard';
@@ -7,7 +8,6 @@ import { OperationSearchGroup } from './operationSearchGroup';
import { List, Text } from '@fluentui/react';
import { Spinner } from '@fluentui/react-components';
import type { DiscoveryOpArray, DiscoveryOperation, DiscoveryResultTypes } from '@microsoft/logic-apps-shared';
-import { isBuiltInConnector } from '@microsoft/logic-apps-shared';
import type { PropsWithChildren } from 'react';
import React, { useMemo } from 'react';
import { useIntl } from 'react-intl';
@@ -140,9 +140,9 @@ export const OperationActionDataFromOperation = (operation: DiscoveryOperation(data: Record, filter: (_key: string,
.reduce((res: any, [key, value]: any) => ({ ...res, [key]: value }), {});
};
-export const getConnectorCategoryString = (connectorId: string): string => {
+export const getConnectorCategoryString = (connector: Connector | OperationApi | string): string => {
const intl = getIntl();
const builtInText = intl.formatMessage({
defaultMessage: 'In App',
@@ -362,7 +364,7 @@ export const getConnectorCategoryString = (connectorId: string): string => {
description: 'Custom category name text',
});
- return isBuiltInConnector(connectorId) ? builtInText : isCustomConnector(connectorId) ? customText : azureText;
+ return isBuiltInConnector(connector) ? builtInText : isCustomConnector(connector) ? customText : azureText;
};
export const convertUIElementNameToAutomationId = (uiElementName: string): string => {
diff --git a/libs/designer/src/lib/core/actions/bjsworkflow/add.ts b/libs/designer/src/lib/core/actions/bjsworkflow/add.ts
index b84f8875a05..437276c6f03 100644
--- a/libs/designer/src/lib/core/actions/bjsworkflow/add.ts
+++ b/libs/designer/src/lib/core/actions/bjsworkflow/add.ts
@@ -13,12 +13,12 @@ import { initializeTokensAndVariables } from '../../state/tokens/tokensSlice';
import type { WorkflowState } from '../../state/workflow/workflowInterfaces';
import { addNode, setFocusNode } from '../../state/workflow/workflowSlice';
import type { AppDispatch, RootState } from '../../store';
-import { getBrandColorFromConnector, getBrandColorFromManifest, getIconUriFromConnector, getIconUriFromManifest } from '../../utils/card';
+import { getBrandColorFromManifest, getIconUriFromManifest } from '../../utils/card';
import { getTriggerNodeId, isRootNodeInGraph } from '../../utils/graph';
import { updateDynamicDataInNode } from '../../utils/parameters/helper';
import { getInputParametersFromSwagger, getOutputParametersFromSwagger } from '../../utils/swagger/operation';
-import { getTokenNodeIds, getBuiltInTokens, convertOutputsToTokens } from '../../utils/tokens';
-import { setVariableMetadata, getVariableDeclarations, getAllVariables } from '../../utils/variables';
+import { convertOutputsToTokens, getBuiltInTokens, getTokenNodeIds } from '../../utils/tokens';
+import { getAllVariables, getVariableDeclarations, setVariableMetadata } from '../../utils/variables';
import { isConnectionRequiredForOperation, updateNodeConnection } from './connections';
import {
getInputParametersFromManifest,
@@ -31,14 +31,14 @@ import type { Settings } from './settings';
import { getOperationSettings, getSplitOnValue } from './settings';
import { ConnectionService, OperationManifestService, StaticResultService } from '@microsoft/designer-client-services-logic-apps';
import type {
- SwaggerParser,
Connector,
DiscoveryOperation,
DiscoveryResultTypes,
OperationManifest,
SomeKindOfAzureOperationDiscovery,
+ SwaggerParser,
} from '@microsoft/logic-apps-shared';
-import { ManifestParser, equals, getRecordEntry } from '@microsoft/logic-apps-shared';
+import { ManifestParser, equals, getBrandColorFromConnector, getIconUriFromConnector, getRecordEntry } from '@microsoft/logic-apps-shared';
import type { Dispatch } from '@reduxjs/toolkit';
import { createAsyncThunk } from '@reduxjs/toolkit';
import { batch } from 'react-redux';
diff --git a/libs/designer/src/lib/core/actions/bjsworkflow/initialize.ts b/libs/designer/src/lib/core/actions/bjsworkflow/initialize.ts
index 40694325cf1..ea55ab481ea 100644
--- a/libs/designer/src/lib/core/actions/bjsworkflow/initialize.ts
+++ b/libs/designer/src/lib/core/actions/bjsworkflow/initialize.ts
@@ -11,7 +11,6 @@ import { WorkflowKind } from '../../state/workflow/workflowInterfaces';
import type { WorkflowParameterDefinition } from '../../state/workflowparameters/workflowparametersSlice';
import { initializeParameters } from '../../state/workflowparameters/workflowparametersSlice';
import type { RootState } from '../../store';
-import { getBrandColorFromConnector, getIconUriFromConnector } from '../../utils/card';
import { getTriggerNodeId, isRootNodeInGraph } from '../../utils/graph';
import { getSplitOnOptions, getUpdatedManifestForSchemaDependency, getUpdatedManifestForSplitOn, toOutputInfo } from '../../utils/outputs';
import {
@@ -48,33 +47,35 @@ import {
} from '@microsoft/designer-client-services-logic-apps';
import type { OutputToken, ParameterInfo } from '@microsoft/designer-ui';
import {
+ clone,
+ ConnectionReferenceKeyFormat,
+ CustomSwaggerServiceNames,
+ DynamicSchemaType,
+ equals,
+ getBrandColorFromConnector,
+ getIconUriFromConnector,
getIntl,
+ getObjectPropertyValue,
isDynamicListExtension,
isDynamicPropertiesExtension,
isDynamicSchemaExtension,
isDynamicTreeExtension,
isLegacyDynamicValuesExtension,
isLegacyDynamicValuesTreeExtension,
- DynamicSchemaType,
ManifestParser,
PropertyName,
- CustomSwaggerServiceNames,
- UnsupportedException,
- clone,
- equals,
- ConnectionReferenceKeyFormat,
unmap,
- getObjectPropertyValue,
+ UnsupportedException,
} from '@microsoft/logic-apps-shared';
import type {
- SchemaProperty,
- InputParameter,
- SwaggerParser,
- OutputParameter,
CustomSwaggerServiceDetails,
+ InputParameter,
OperationInfo,
OperationManifest,
OperationManifestProperties,
+ OutputParameter,
+ SchemaProperty,
+ SwaggerParser,
} from '@microsoft/logic-apps-shared';
import type { Dispatch } from '@reduxjs/toolkit';
diff --git a/libs/designer/src/lib/core/index.ts b/libs/designer/src/lib/core/index.ts
index 34f57d9b42d..f9410c439a3 100644
--- a/libs/designer/src/lib/core/index.ts
+++ b/libs/designer/src/lib/core/index.ts
@@ -27,4 +27,4 @@ export { getOutputTokenSections, getExpressionTokenSections } from './utils/toke
export { getTriggerNodeId } from './utils/graph';
export { updateParameterValidation } from './state/operation/operationMetadataSlice';
export { updateWorkflowParameters } from './actions/bjsworkflow/initialize';
-export { getBrandColorFromManifest, getIconUriFromManifest, getBrandColorFromConnector, getIconUriFromConnector } from './utils/card';
+export { getBrandColorFromManifest, getIconUriFromManifest } from './utils/card';
diff --git a/libs/designer/src/lib/core/utils/card.ts b/libs/designer/src/lib/core/utils/card.ts
index 6e45b7de98b..d415fae688f 100644
--- a/libs/designer/src/lib/core/utils/card.ts
+++ b/libs/designer/src/lib/core/utils/card.ts
@@ -1,5 +1,5 @@
-import type { Connector, OperationManifest } from '@microsoft/logic-apps-shared';
-import { fallbackConnectorIconUrl } from '@microsoft/logic-apps-shared';
+import type { OperationManifest } from '@microsoft/logic-apps-shared';
+import { getBrandColorFromConnector, getIconUriFromConnector } from '@microsoft/logic-apps-shared';
export function getBrandColorFromManifest(manifest: OperationManifest): string {
return manifest.properties?.brandColor ?? getBrandColorFromConnector(manifest.properties?.connector);
@@ -8,19 +8,3 @@ export function getBrandColorFromManifest(manifest: OperationManifest): string {
export function getIconUriFromManifest(manifest: OperationManifest): string {
return manifest.properties?.iconUri ?? getIconUriFromConnector(manifest.properties?.connector);
}
-
-export function getBrandColorFromConnector(connector: Connector | undefined): string {
- if (!connector) return '#000000';
- const {
- properties: { brandColor, metadata },
- } = connector;
- return brandColor ?? metadata?.brandColor ?? '#000000';
-}
-
-export function getIconUriFromConnector(connector: Connector | undefined): string {
- if (!connector) return '';
- const {
- properties: { iconUrl, iconUri, generalInformation },
- } = connector;
- return fallbackConnectorIconUrl(iconUrl ?? iconUri ?? generalInformation?.iconUrl);
-}
diff --git a/libs/designer/src/lib/core/utils/outputs.ts b/libs/designer/src/lib/core/utils/outputs.ts
index 4ad66cd3b4a..70849296c8d 100644
--- a/libs/designer/src/lib/core/utils/outputs.ts
+++ b/libs/designer/src/lib/core/utils/outputs.ts
@@ -7,15 +7,14 @@ import { getOperationManifest } from '../queries/operation';
import type { DependencyInfo, NodeInputs, NodeOperation, NodeOutputs, OutputInfo } from '../state/operation/operationMetadataSlice';
import {
ErrorLevel,
- updateErrorDetails,
- clearDynamicOutputs,
addDynamicOutputs,
+ clearDynamicOutputs,
+ updateErrorDetails,
updateExisitingInputTokenTitles,
} from '../state/operation/operationMetadataSlice';
import { addDynamicTokens } from '../state/tokens/tokensSlice';
import type { WorkflowKind } from '../state/workflow/workflowInterfaces';
import type { WorkflowParameterDefinition } from '../state/workflowparameters/workflowparametersSlice';
-import { getBrandColorFromConnector, getIconUriFromConnector } from './card';
import { getTokenExpressionValueForManifestBasedOperation } from './loops';
import { getDynamicOutputsFromSchema, getDynamicSchema } from './parameters/dynamicdata';
import {
@@ -26,36 +25,38 @@ import {
} from './parameters/helper';
import { convertOutputsToTokens, getTokenTitle } from './tokens';
import { OperationManifestService } from '@microsoft/designer-client-services-logic-apps';
-import { generateSchemaFromJsonString, ValueSegmentType } from '@microsoft/designer-ui';
+import { ValueSegmentType, generateSchemaFromJsonString } from '@microsoft/designer-ui';
+import type {
+ Expression,
+ ExpressionFunction,
+ ExpressionLiteral,
+ OpenAPIV2,
+ OpenApiSchema,
+ OperationManifest,
+ OutputParameter,
+ OutputParameters,
+} from '@microsoft/logic-apps-shared';
import {
- getIntl,
- create,
- OutputKeys,
- OutputSource,
+ AssertionErrorCode,
+ AssertionException,
+ ConnectionReferenceKeyFormat,
ExpressionParser,
ExtensionProperties,
- isTemplateExpression,
+ OutputKeys,
+ OutputSource,
+ clone,
+ create,
+ equals,
+ getBrandColorFromConnector,
+ getIconUriFromConnector,
+ getIntl,
+ getObjectPropertyValue,
isFunction,
isStringLiteral,
- ConnectionReferenceKeyFormat,
- getObjectPropertyValue,
+ isTemplateExpression,
+ parseErrorMessage,
safeSetObjectPropertyValue,
unmap,
- AssertionErrorCode,
- AssertionException,
- clone,
- equals,
- parseErrorMessage,
-} from '@microsoft/logic-apps-shared';
-import type {
- Expression,
- ExpressionFunction,
- ExpressionLiteral,
- OutputParameter,
- OutputParameters,
- OpenApiSchema,
- OpenAPIV2,
- OperationManifest,
} from '@microsoft/logic-apps-shared';
import type { Dispatch } from '@reduxjs/toolkit';
diff --git a/libs/designer/src/lib/core/utils/swagger/operation.ts b/libs/designer/src/lib/core/utils/swagger/operation.ts
index 68aa2bbf06c..32894ca9f88 100644
--- a/libs/designer/src/lib/core/utils/swagger/operation.ts
+++ b/libs/designer/src/lib/core/utils/swagger/operation.ts
@@ -13,34 +13,35 @@ import type {
import { getOperationSettings } from '../../actions/bjsworkflow/settings';
import { getConnectorWithSwagger } from '../../queries/connections';
import type { DependencyInfo, NodeInputs, NodeOperation, OutputInfo } from '../../state/operation/operationMetadataSlice';
-import { ErrorLevel, updateErrorDetails, DynamicLoadStatus, initializeOperationInfo } from '../../state/operation/operationMetadataSlice';
+import { DynamicLoadStatus, ErrorLevel, initializeOperationInfo, updateErrorDetails } from '../../state/operation/operationMetadataSlice';
import { addResultSchema } from '../../state/staticresultschema/staticresultsSlice';
import type { WorkflowKind } from '../../state/workflow/workflowInterfaces';
-import { getBrandColorFromConnector, getIconUriFromConnector } from '../card';
import { toOutputInfo, updateOutputsForBatchingTrigger } from '../outputs';
import {
+ ParameterGroupKeys,
addRecurrenceParametersInGroup,
getDependentParameters,
getParametersSortedByVisibility,
loadParameterValuesFromDefault,
- ParameterGroupKeys,
toParameterInfoMap,
updateParameterWithValues,
} from '../parameters/helper';
import { loadInputValuesFromDefinition } from './inputsbuilder';
import { LogEntryLevel, LoggerService, StaticResultService } from '@microsoft/designer-client-services-logic-apps';
-import type { LAOperation, OutputParameter, SwaggerParser, LogicAppsV2, OperationInfo } from '@microsoft/logic-apps-shared';
+import type { LAOperation, LogicAppsV2, OperationInfo, OutputParameter, SwaggerParser } from '@microsoft/logic-apps-shared';
import {
+ ParameterLocations,
+ RecurrenceType,
+ copyArray,
create,
+ equals,
+ getBrandColorFromConnector,
+ getIconUriFromConnector,
isDynamicSchemaExtension,
- ParameterLocations,
- removeConnectionPrefix,
isTemplateExpression,
- copyArray,
map,
- RecurrenceType,
- equals,
parsePathnameAndQueryKeyFromUri,
+ removeConnectionPrefix,
startsWith,
unmap,
} from '@microsoft/logic-apps-shared';
diff --git a/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/allConnections.tsx b/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/allConnections.tsx
index 5622fb7751a..7bfca49e6e0 100644
--- a/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/allConnections.tsx
+++ b/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/allConnections.tsx
@@ -1,10 +1,4 @@
-import {
- type RootState,
- useConnectionMapping,
- useConnectionRefs,
- getIconUriFromConnector,
- getBrandColorFromConnector,
-} from '../../../../core';
+import { useConnectionMapping, useConnectionRefs, type RootState } from '../../../../core';
import { useConnector } from '../../../../core/state/connection/connectionSelector';
import { ConnectorConnectionsCard } from './connectorConnectionsCard';
import { Accordion, AccordionItem, type AccordionToggleEventHandler } from '@fluentui/react-components';
@@ -93,9 +87,7 @@ const ConnectorCardWrapper = ({ apiId, connectionRefs, disconnectedNodes }: Conn
diff --git a/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/connectorConnectionsCard.tsx b/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/connectorConnectionsCard.tsx
index 5fc323eb880..dfb8a1d3dd3 100644
--- a/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/connectorConnectionsCard.tsx
+++ b/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/connectorConnectionsCard.tsx
@@ -1,15 +1,19 @@
import { useAllConnectionErrors } from '../../../../core';
import { ConnectionEntry } from './connectionEntry';
-import { Text, AccordionHeader, AccordionPanel, Spinner, Badge } from '@fluentui/react-components';
-import { getConnectorCategoryString } from '@microsoft/designer-ui';
-import { fallbackConnectorIconUrl, isBuiltInConnector } from '@microsoft/logic-apps-shared';
+import { AccordionHeader, AccordionPanel, Badge, Spinner, Text } from '@fluentui/react-components';
+import { getConnectorCategoryString, isBuiltInConnector } from '@microsoft/designer-ui';
+import type { Connector } from '@microsoft/logic-apps-shared';
+import {
+ fallbackConnectorIconUrl,
+ getBrandColorFromConnector,
+ getDisplayNameFromConnector,
+ getIconUriFromConnector,
+} from '@microsoft/logic-apps-shared';
import { useMemo } from 'react';
export interface ConnectorConnectionsCardProps {
connectorId: string;
- title: string;
- brandColor?: string;
- iconUri?: string;
+ connector: Connector | undefined;
connectionRefs?: Record;
disconnectedNodes?: string[];
isLoading?: boolean;
@@ -17,15 +21,17 @@ export interface ConnectorConnectionsCardProps {
export const ConnectorConnectionsCard: React.FC = ({
connectorId,
- title,
- brandColor,
- iconUri,
+ connector,
connectionRefs = {},
disconnectedNodes = [],
isLoading = false,
}) => {
- const isBuiltIn = isBuiltInConnector(connectorId);
- const category = getConnectorCategoryString(connectorId);
+ const title = getDisplayNameFromConnector(connector) ?? connectorId;
+ const iconUri = getIconUriFromConnector(connector);
+ const brandColor = getBrandColorFromConnector(connector);
+
+ const isBuiltIn = isBuiltInConnector(connector ?? connectorId);
+ const category = getConnectorCategoryString(connector ?? connectorId);
const allErrors = useAllConnectionErrors();
const hasErrors = useMemo(() => {
diff --git a/libs/designer/src/lib/ui/panel/connectionsPanel/createConnection/createConnectionWrapper.tsx b/libs/designer/src/lib/ui/panel/connectionsPanel/createConnection/createConnectionWrapper.tsx
index d9c2b2f6bc1..3c07756ecc9 100644
--- a/libs/designer/src/lib/ui/panel/connectionsPanel/createConnection/createConnectionWrapper.tsx
+++ b/libs/designer/src/lib/ui/panel/connectionsPanel/createConnection/createConnectionWrapper.tsx
@@ -1,13 +1,13 @@
import constants from '../../../../common/constants';
import type { AppDispatch, RootState } from '../../../../core';
-import { getIconUriFromConnector, useOperationInfo, useSelectedNodeId, useSelectedNodeIds } from '../../../../core';
+import { useOperationInfo, useSelectedNodeId, useSelectedNodeIds } from '../../../../core';
import type { ConnectionPayload } from '../../../../core/actions/bjsworkflow/connections';
import {
+ getApiHubAuthentication,
getConnectionMetadata,
getConnectionProperties,
- getApiHubAuthentication,
- updateNodeConnection,
needsOAuth,
+ updateNodeConnection,
} from '../../../../core/actions/bjsworkflow/connections';
import { getUniqueConnectionName } from '../../../../core/queries/connections';
import {
@@ -30,6 +30,7 @@ import { Spinner } from '@fluentui/react-components';
import type { ConnectionCreationInfo, ConnectionParametersMetadata } from '@microsoft/designer-client-services-logic-apps';
import { ConnectionService, LogEntryLevel, LoggerService, WorkflowService } from '@microsoft/designer-client-services-logic-apps';
import {
+ getIconUriFromConnector,
getRecordEntry,
safeSetObjectPropertyValue,
type Connection,
diff --git a/libs/designer/src/lib/ui/panel/connectionsPanel/selectConnection/selectConnection.tsx b/libs/designer/src/lib/ui/panel/connectionsPanel/selectConnection/selectConnection.tsx
index 6202304d05e..8313648aea8 100644
--- a/libs/designer/src/lib/ui/panel/connectionsPanel/selectConnection/selectConnection.tsx
+++ b/libs/designer/src/lib/ui/panel/connectionsPanel/selectConnection/selectConnection.tsx
@@ -1,7 +1,7 @@
-import { type AppDispatch, getIconUriFromConnector } from '../../../../core';
+import { type AppDispatch } from '../../../../core';
import { updateNodeConnection } from '../../../../core/actions/bjsworkflow/connections';
import { useConnectionsForConnector } from '../../../../core/queries/connections';
-import { useNodeConnectionId, useConnectorByNodeId } from '../../../../core/state/connection/connectionSelector';
+import { useConnectorByNodeId, useNodeConnectionId } from '../../../../core/state/connection/connectionSelector';
import { useIsXrmConnectionReferenceMode } from '../../../../core/state/designerOptions/designerOptionsSelectors';
import { useReferencePanelMode, useSelectedNodeIds } from '../../../../core/state/panel/panelSelectors';
import { openPanel, setIsCreatingConnection } from '../../../../core/state/panel/panelSlice';
@@ -10,7 +10,7 @@ import { ConnectionTable } from './connectionTable';
import { MessageBar, MessageBarType } from '@fluentui/react';
import { Body1Strong, Button, Divider, Spinner } from '@fluentui/react-components';
import { ConnectionService } from '@microsoft/designer-client-services-logic-apps';
-import { type Connection, type Connector } from '@microsoft/logic-apps-shared';
+import { getIconUriFromConnector, type Connection, type Connector } from '@microsoft/logic-apps-shared';
import { useCallback, useEffect, useMemo } from 'react';
import { useIntl } from 'react-intl';
import { useDispatch } from 'react-redux';
diff --git a/libs/designer/src/lib/ui/panel/recommendation/browseView.tsx b/libs/designer/src/lib/ui/panel/recommendation/browseView.tsx
index c9fa25ab77b..dfb7f442885 100644
--- a/libs/designer/src/lib/ui/panel/recommendation/browseView.tsx
+++ b/libs/designer/src/lib/ui/panel/recommendation/browseView.tsx
@@ -1,15 +1,15 @@
-import { useAllApiIdsWithActions, useAllApiIdsWithTriggers, useAllConnectors } from '../../../core/queries/browse';
-import { selectOperationGroupId } from '../../../core/state/panel/panelSlice';
import { SearchService } from '@microsoft/designer-client-services-logic-apps';
-import { BrowseGrid } from '@microsoft/designer-ui';
-import { isBuiltInConnector, type Connector, isCustomConnector, cleanConnectorId } from '@microsoft/logic-apps-shared';
+import { BrowseGrid, isBuiltInConnector, isCustomConnector } from '@microsoft/designer-ui';
+import { cleanConnectorId, type Connector } from '@microsoft/logic-apps-shared';
import { useCallback, useMemo } from 'react';
import { useDispatch } from 'react-redux';
+import { useAllApiIdsWithActions, useAllApiIdsWithTriggers, useAllConnectors } from '../../../core/queries/browse';
+import { selectOperationGroupId } from '../../../core/state/panel/panelSlice';
const defaultFilterConnector = (connector: Connector, runtimeFilter: string): boolean => {
- if (runtimeFilter === 'inapp' && !isBuiltInConnector(connector.id)) return false;
- else if (runtimeFilter === 'custom' && !isCustomConnector(connector.id)) return false;
- else if (runtimeFilter === 'shared') if (isBuiltInConnector(connector.id) || isCustomConnector(connector.id)) return false;
+ if (runtimeFilter === 'inapp' && !isBuiltInConnector(connector)) return false;
+ else if (runtimeFilter === 'custom' && !isCustomConnector(connector)) return false;
+ else if (runtimeFilter === 'shared') if (isBuiltInConnector(connector) || isCustomConnector(connector)) return false;
return true;
};
diff --git a/libs/designer/src/lib/ui/panel/recommendation/searchView.tsx b/libs/designer/src/lib/ui/panel/recommendation/searchView.tsx
index 23d969e613d..08af3b0a610 100644
--- a/libs/designer/src/lib/ui/panel/recommendation/searchView.tsx
+++ b/libs/designer/src/lib/ui/panel/recommendation/searchView.tsx
@@ -1,9 +1,8 @@
import type { AppDispatch } from '../../../core';
import { selectOperationGroupId } from '../../../core/state/panel/panelSlice';
import { SearchService, type ISearchService } from '@microsoft/designer-client-services-logic-apps';
-import { SearchResultsGrid } from '@microsoft/designer-ui';
+import { SearchResultsGrid, isBuiltInConnector, isCustomConnector } from '@microsoft/designer-ui';
import type { DiscoveryOpArray, DiscoveryOperation, DiscoveryResultTypes } from '@microsoft/logic-apps-shared';
-import { isBuiltInConnector, isCustomConnector } from '@microsoft/logic-apps-shared';
import { useDebouncedEffect } from '@react-hookz/web';
import Fuse from 'fuse.js';
import React, { useEffect, useState } from 'react';
@@ -127,11 +126,10 @@ class DefaultSearchOperationsService implements Pick {
if (runtimeFilter) {
- if (runtimeFilter === 'inapp' && !isBuiltInConnector(searchResult.item.properties.api.id)) return false;
- else if (runtimeFilter === 'custom' && !isCustomConnector(searchResult.item.properties.api.id)) return false;
+ if (runtimeFilter === 'inapp' && !isBuiltInConnector(searchResult.item.properties.api)) return false;
+ else if (runtimeFilter === 'custom' && !isCustomConnector(searchResult.item.properties.api)) return false;
else if (runtimeFilter === 'shared')
- if (isBuiltInConnector(searchResult.item.properties.api.id) || isCustomConnector(searchResult.item.properties.api.id))
- return false;
+ if (isBuiltInConnector(searchResult.item.properties.api) || isCustomConnector(searchResult.item.properties.api)) return false;
}
if (actionType) {
diff --git a/libs/logic-apps-shared/src/utils/src/lib/helpers/__test__/connectors.spec.tsx b/libs/logic-apps-shared/src/utils/src/lib/helpers/__test__/connectors.spec.tsx
new file mode 100644
index 00000000000..c1a450959a4
--- /dev/null
+++ b/libs/logic-apps-shared/src/utils/src/lib/helpers/__test__/connectors.spec.tsx
@@ -0,0 +1,213 @@
+import type { Connector, OperationApi } from '../../models';
+import {
+ getAllConnectorProperties,
+ getBrandColorFromConnector,
+ getDescriptionFromConnector,
+ getDisplayNameFromConnector,
+ getIconUriFromConnector,
+} from '../index';
+
+describe('utils/src/lib/helpers/connectors', () => {
+ describe('getAllConnectorProperties', () => {
+ test('works for a Connector', () => {
+ const connector = {
+ id: '/connector/id',
+ properties: {
+ brandColor: 'red',
+ },
+ } as Connector;
+ expect(getAllConnectorProperties(connector)).toEqual({
+ brandColor: 'red',
+ id: '/connector/id',
+ });
+ });
+
+ test('works for an OperationApi', () => {
+ const connector = {
+ brandColor: 'red',
+ id: '/connector/id',
+ } as OperationApi;
+ expect(getAllConnectorProperties(connector)).toEqual({
+ brandColor: 'red',
+ id: '/connector/id',
+ });
+ });
+
+ test('works for undefined', () => {
+ expect(getAllConnectorProperties(undefined)).toEqual({});
+ });
+ });
+
+ describe('getBrandColorFromConnector', () => {
+ describe('works for a Connector with', () => {
+ test('standard field only', () => {
+ const connector = {
+ properties: {
+ brandColor: 'red',
+ },
+ } as Connector;
+ expect(getBrandColorFromConnector(connector)).toBe('red');
+ });
+
+ test('metadata field only', () => {
+ const connector = {
+ properties: {
+ metadata: {
+ brandColor: 'red',
+ },
+ },
+ } as Connector;
+ expect(getBrandColorFromConnector(connector)).toBe('red');
+ });
+
+ test('standard field and metadata field', () => {
+ const connector = {
+ properties: {
+ brandColor: 'red',
+ metadata: {
+ brandColor: 'blue',
+ },
+ },
+ } as Connector;
+ expect(getBrandColorFromConnector(connector)).toBe('red');
+ });
+ });
+
+ test('works for an OperationApi', () => {
+ const connector = {
+ brandColor: 'red',
+ } as OperationApi;
+ expect(getBrandColorFromConnector(connector)).toBe('red');
+ });
+
+ test('works for undefined', () => {
+ expect(getBrandColorFromConnector(undefined)).toBe('#000000');
+ });
+ });
+
+ describe('getDescriptionFromConnector', () => {
+ describe('works for a Connector with', () => {
+ test('standard field only', () => {
+ const connector = {
+ properties: {
+ description: 'My connector',
+ },
+ } as Connector;
+ expect(getDescriptionFromConnector(connector)).toBe('My connector');
+ });
+
+ test('general information only', () => {
+ const connector = {
+ properties: {
+ generalInformation: {
+ description: 'My connector',
+ },
+ },
+ } as Connector;
+ expect(getDescriptionFromConnector(connector)).toBe('My connector');
+ });
+
+ test('general information and standard field', () => {
+ const connector = {
+ properties: {
+ description: 'My connector 1',
+ generalInformation: {
+ description: 'My connector 2',
+ },
+ },
+ } as Connector;
+ expect(getDescriptionFromConnector(connector)).toBe('My connector 1');
+ });
+ });
+
+ test('works for an OperationApi', () => {
+ const connector = {
+ description: 'My connector',
+ } as OperationApi;
+ expect(getDescriptionFromConnector(connector)).toBe('My connector');
+ });
+
+ test('works for undefined', () => {
+ expect(getDescriptionFromConnector(undefined)).toBe('');
+ });
+ });
+
+ describe('getDisplayNameFromConnector', () => {
+ test('works for a Connector', () => {
+ const connector = {
+ properties: {
+ displayName: 'My connector',
+ },
+ } as Connector;
+ expect(getDisplayNameFromConnector(connector)).toBe('My connector');
+ });
+
+ test('works for an OperationApi', () => {
+ const connector = {
+ displayName: 'My connector',
+ } as OperationApi;
+ expect(getDisplayNameFromConnector(connector)).toBe('My connector');
+ });
+
+ test('works for undefined', () => {
+ expect(getDisplayNameFromConnector(undefined)).toBe('');
+ });
+ });
+
+ describe('getIconUriFromConnector', () => {
+ describe('works for a Connector with', () => {
+ test('standard iconUrl field only', () => {
+ const connector = {
+ properties: {
+ iconUrl: 'https://example.com/icon.png',
+ },
+ } as Connector;
+ expect(getIconUriFromConnector(connector)).toBe('https://example.com/icon.png');
+ });
+
+ test('standard iconUri only', () => {
+ const connector = {
+ properties: {
+ iconUri: 'https://example.com/icon.png',
+ },
+ } as Connector;
+ expect(getIconUriFromConnector(connector)).toBe('https://example.com/icon.png');
+ });
+
+ test('general information only', () => {
+ const connector = {
+ properties: {
+ generalInformation: {
+ iconUrl: 'https://example.com/icon.png',
+ },
+ },
+ } as Connector;
+ expect(getIconUriFromConnector(connector)).toBe('https://example.com/icon.png');
+ });
+
+ test('general information and standard fields', () => {
+ const connector = {
+ properties: {
+ iconUri: 'https://example.com/icon1.png',
+ iconUrl: 'https://example.com/icon2.png',
+ generalInformation: {
+ iconUrl: 'https://example.com/icon3.png',
+ },
+ },
+ } as Connector;
+ expect(getIconUriFromConnector(connector)).toBe('https://example.com/icon2.png');
+ });
+ });
+
+ test('works for an OperationApi', () => {
+ const connector = {
+ description: 'https://example.com/icon.png',
+ } as OperationApi;
+ expect(getDescriptionFromConnector(connector)).toBe('https://example.com/icon.png');
+ });
+
+ test('works for undefined', () => {
+ expect(getDescriptionFromConnector(undefined)).toBe('');
+ });
+ });
+});
diff --git a/libs/logic-apps-shared/src/utils/src/lib/helpers/connections.ts b/libs/logic-apps-shared/src/utils/src/lib/helpers/connections.ts
index 15c9b5a9d65..246c638346e 100644
--- a/libs/logic-apps-shared/src/utils/src/lib/helpers/connections.ts
+++ b/libs/logic-apps-shared/src/utils/src/lib/helpers/connections.ts
@@ -1,7 +1,7 @@
import type { Connection, ConnectionStatus, ManagedIdentity } from '../models';
import { ResourceIdentityType } from '../models';
+import type { ConnectionParameter, Connector } from '../models/connector';
import { ConnectionParameterTypes } from '../models/connector';
-import type { Connector, ConnectionParameter } from '../models/connector';
import { equals, hasProperty } from './functions';
import type { IntlShape } from 'react-intl';
@@ -11,14 +11,14 @@ export function isArmResourceId(resourceId: string): boolean {
return resourceId ? resourceId.startsWith('/subscriptions/') : false;
}
-export const isBuiltInConnector = (connectorId: string) => {
+export const isBuiltInConnectorId = (connectorId: string) => {
if (connectorsShownAsAzure.includes(connectorId)) return false;
return !isArmResourceId(connectorId);
};
export const getConnectorName = (connectorId: string): string => connectorId?.split('/').at(-1) ?? '';
-export const isCustomConnector = (connectorId: string) => {
+export const isCustomConnectorId = (connectorId: string) => {
// Note: connectorId format: /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Web/customApis/{connector}
const fields = connectorId.split('/');
if (fields.length !== 9) return false;
@@ -32,7 +32,7 @@ export const isCustomConnector = (connectorId: string) => {
return true;
};
-export const isManagedConnector = (connectorId: string) => {
+export const isManagedConnectorId = (connectorId: string) => {
// Note: connectorId format: /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Logic/integrationServiceEnvironments/{ise}/managedApis/{connector}
const fields = connectorId.split('/');
if (fields.length !== 11) return false;
@@ -47,7 +47,7 @@ export const isManagedConnector = (connectorId: string) => {
return true;
};
-export const isSharedManagedConnector = (connectorId: string) => {
+export const isSharedManagedConnectorId = (connectorId: string) => {
// Note: connectorId format: /subscriptions/{sub}/providers/Microsoft.Web/locations/{location}/managedApis/{connector}
const fields = connectorId.split('/');
if (fields.length !== 9) return false;
@@ -61,7 +61,7 @@ export const isSharedManagedConnector = (connectorId: string) => {
return true;
};
-export const isSharedManagedConnectorFromPApps = (connectorId: string) => {
+export const isSharedManagedConnectorIdFromPApps = (connectorId: string) => {
// Note: connectorId format: /providers/Microsoft.PowerApps/apis/{connector}
const fields = connectorId.split('/');
if (fields.length !== 5) return false;
diff --git a/libs/logic-apps-shared/src/utils/src/lib/helpers/connectors.ts b/libs/logic-apps-shared/src/utils/src/lib/helpers/connectors.ts
new file mode 100644
index 00000000000..21dfb5e97e7
--- /dev/null
+++ b/libs/logic-apps-shared/src/utils/src/lib/helpers/connectors.ts
@@ -0,0 +1,34 @@
+import type { Connector, ConnectorProperty, OperationApi } from '../models';
+import { fallbackConnectorIconUrl } from './connections';
+
+export const getAllConnectorProperties = (connector: Connector | OperationApi | undefined): Partial => {
+ if (!connector) {
+ return {};
+ }
+
+ if ('properties' in connector) {
+ return { id: connector.id, ...connector.properties };
+ }
+
+ return connector;
+};
+
+export const getBrandColorFromConnector = (connector: Connector | OperationApi | undefined): string => {
+ const connectorData = getAllConnectorProperties(connector);
+ return connectorData?.brandColor ?? connectorData.metadata?.brandColor ?? '#000000';
+};
+
+export const getDescriptionFromConnector = (connector: Connector | OperationApi | undefined): string => {
+ const connectorData = getAllConnectorProperties(connector);
+ return connectorData.description ?? connectorData.generalInformation?.description ?? '';
+};
+
+export const getDisplayNameFromConnector = (connector: Connector | OperationApi | undefined): string => {
+ return getAllConnectorProperties(connector)?.displayName ?? '';
+};
+
+export const getIconUriFromConnector = (connector: Connector | OperationApi | undefined): string => {
+ const connectorData = getAllConnectorProperties(connector);
+ const iconUrl = connectorData.iconUrl ?? connectorData.iconUri ?? connectorData.generalInformation?.iconUrl;
+ return fallbackConnectorIconUrl(iconUrl);
+};
diff --git a/libs/logic-apps-shared/src/utils/src/lib/helpers/index.ts b/libs/logic-apps-shared/src/utils/src/lib/helpers/index.ts
index ee2da4548da..17f110289b3 100644
--- a/libs/logic-apps-shared/src/utils/src/lib/helpers/index.ts
+++ b/libs/logic-apps-shared/src/utils/src/lib/helpers/index.ts
@@ -1,5 +1,6 @@
export * from './color';
export * from './connections';
+export * from './connectors';
export * from './functions';
export * from './guid';
export * from './stringFunctions';
diff --git a/libs/logic-apps-shared/src/utils/src/lib/models/operationDiscoveryResults.ts b/libs/logic-apps-shared/src/utils/src/lib/models/operationDiscoveryResults.ts
index 36d1c5bde8a..a301bd909d9 100644
--- a/libs/logic-apps-shared/src/utils/src/lib/models/operationDiscoveryResults.ts
+++ b/libs/logic-apps-shared/src/utils/src/lib/models/operationDiscoveryResults.ts
@@ -10,6 +10,8 @@ export interface OperationApi {
iconUri: string;
category?: 'Standard'; // could be consumption too
id: string;
+ isBuiltIn?: boolean;
+ isCustomApi?: boolean;
location?: string;
name?: string;
tier?: string;
diff --git a/libs/services/designer-client-services/src/lib/base/connection.ts b/libs/services/designer-client-services/src/lib/base/connection.ts
index aadd9f2c2a5..b26889529dc 100644
--- a/libs/services/designer-client-services/src/lib/base/connection.ts
+++ b/libs/services/designer-client-services/src/lib/base/connection.ts
@@ -3,22 +3,22 @@ import type { HttpResponse } from '../common/exceptions/service';
import type {
ConnectionCreationInfo,
ConnectionParametersMetadata,
+ ConnectorWithSwagger,
CreateConnectionResult,
IConnectionService,
- ConnectorWithSwagger,
} from '../connection';
import type { HttpRequestOptions, IHttpClient, QueryParameters } from '../httpClient';
-import { SwaggerParser } from '@microsoft/logic-apps-shared';
import type { Connection, Connector, OpenAPIV2 } from '@microsoft/logic-apps-shared';
import {
- isCustomConnector,
- getUniqueName,
+ ArgumentException,
HTTP_METHODS,
+ SwaggerParser,
UserErrorCode,
UserException,
- isArmResourceId,
- ArgumentException,
equals,
+ getUniqueName,
+ isArmResourceId,
+ isCustomConnectorId,
} from '@microsoft/logic-apps-shared';
export interface ApiHubServiceDetails {
@@ -252,7 +252,7 @@ export abstract class BaseConnectionService implements IConnectionService {
protected async getConnectionsForConnector(connectorId: string): Promise {
if (isArmResourceId(connectorId)) {
// Right now there isn't a name $filter for custom connections, so we need to filter them manually
- if (isCustomConnector(connectorId)) {
+ if (isCustomConnectorId(connectorId)) {
const { location, apiVersion, httpClient } = this.options;
const response = await httpClient.get({
uri: `${this._subscriptionResourceGroupWebUrl}/connections`,
diff --git a/libs/services/designer-client-services/src/lib/host.ts b/libs/services/designer-client-services/src/lib/host.ts
index abb947b0e78..18c19125fc7 100644
--- a/libs/services/designer-client-services/src/lib/host.ts
+++ b/libs/services/designer-client-services/src/lib/host.ts
@@ -1,3 +1,4 @@
+import type { ConnectorProperty, OperationApi } from '@microsoft/logic-apps-shared';
import { AssertionErrorCode, AssertionException } from '@microsoft/logic-apps-shared';
export const ContentType = {
@@ -6,8 +7,12 @@ export const ContentType = {
} as const;
export type ContentType = (typeof ContentType)[keyof typeof ContentType];
+type IsConnectorFn = (connector: Partial | string) => boolean;
+
export interface IHostService {
fetchAndDisplayContent(title: string, url: string, type: ContentType): void;
+ isBuiltInConnector?: IsConnectorFn;
+ isCustomConnector?: IsConnectorFn;
openWorkflowParametersBlade?(): void;
openConnectionResource?(connectionId: string): void;
}
diff --git a/libs/services/designer-client-services/src/lib/staticresultschema/index.ts b/libs/services/designer-client-services/src/lib/staticresultschema/index.ts
index c735f5c2555..15ace5d7276 100644
--- a/libs/services/designer-client-services/src/lib/staticresultschema/index.ts
+++ b/libs/services/designer-client-services/src/lib/staticresultschema/index.ts
@@ -22,10 +22,10 @@ import { ParseJsonStaticResultSchema } from './schemas/parseJson';
import { QueryStaticResultSchema } from './schemas/query';
import type { ManifestParser, SwaggerParser } from '@microsoft/logic-apps-shared';
import {
- isCustomConnector,
- isManagedConnector,
- isSharedManagedConnectorFromPApps,
- isSharedManagedConnector,
+ isCustomConnectorId,
+ isManagedConnectorId,
+ isSharedManagedConnectorId,
+ isSharedManagedConnectorIdFromPApps,
} from '@microsoft/logic-apps-shared';
/**
@@ -76,10 +76,10 @@ export class StaticResultSchemaService implements IStaticResultSchemaService {
break;
default:
if (
- (isSharedManagedConnector(connectorId) ||
- isSharedManagedConnectorFromPApps(connectorId) ||
- isCustomConnector(connectorId) ||
- isManagedConnector(connectorId)) &&
+ (isSharedManagedConnectorId(connectorId) ||
+ isSharedManagedConnectorIdFromPApps(connectorId) ||
+ isCustomConnectorId(connectorId) ||
+ isManagedConnectorId(connectorId)) &&
parser
) {
return getStaticResultSchemaForAPIConnector(operationId, parser);