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 {connectorName}; + return {connectorName}; }, [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);