Skip to content

Commit

Permalink
fix(designer): Fix issue where characters later in a token name would…
Browse files Browse the repository at this point in the history
… carry less relevence in a search (#4736)

* fix(designer): Fix issue where characters later in a token name would carry less relevence in a search

* Add test for regression

* name of test

* Fix serialization test
  • Loading branch information
hartra344 committed Apr 30, 2024
1 parent 912f540 commit 2dfc193
Show file tree
Hide file tree
Showing 11 changed files with 70 additions and 12 deletions.
31 changes: 24 additions & 7 deletions __mocks__/workflows/Panel.json
Expand Up @@ -50,12 +50,18 @@
"type": "string"
}
},
"required": ["document", "min", "policy"]
"required": [
"document",
"min",
"policy"
]
}
}
},
"runAfter": {
"Initialize_ArrayVariable": ["SUCCEEDED"]
"Initialize_ArrayVariable": [
"SUCCEEDED"
]
}
},
"Filter_array": {
Expand All @@ -65,7 +71,9 @@
"where": "@not(contains(length(split(item(), '|')?[0]),length(split(item(), '|')?[0])))"
},
"runAfter": {
"Parse_JSON": ["SUCCEEDED"]
"Parse_JSON": [
"SUCCEEDED"
]
}
},
"HTTP": {
Expand All @@ -76,7 +84,9 @@
"body": "@variables('ArrayVariable')"
},
"runAfter": {
"Filter_array": ["SUCCEEDED"]
"Filter_array": [
"SUCCEEDED"
]
},
"runtimeConfiguration": {
"contentTransfer": {
Expand Down Expand Up @@ -104,7 +114,9 @@
"type": "string"
}
},
"required": ["item1"]
"required": [
"item1"
]
}
},
"string": {
Expand All @@ -120,5 +132,10 @@
}
},
"connectionReferences": {},
"parameters": {}
}
"parameters": {
"EILCO Admin Nominations-OCSA List (cr773_EILCOAdminNominations_OCSA_L2)": {
"type": "String",
"value": "test"
}
}
}
Expand Up @@ -154,6 +154,7 @@ const connectionParameterEditorService = new CustomConnectionParameterEditorServ
export const LocalDesigner = () => {
const {
workflowDefinition,
parameters,
isReadOnly,
isMonitoringView,
isDarkMode,
Expand Down Expand Up @@ -201,7 +202,7 @@ export const LocalDesigner = () => {
workflow={{
definition: workflowDefinition,
connectionReferences: connections,
parameters: workflowDefinition.parameters,
parameters: parameters,
kind: workflowKind,
}}
runInstance={runInstance}
Expand Down
10 changes: 8 additions & 2 deletions apps/Standalone/src/designer/state/workflowLoadingSlice.ts
@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-empty-function */
import { getStateHistory, setStateHistory } from './historyHelpers';
import type { RootState } from './store';
import type { ConnectionReferences } from '@microsoft/logic-apps-designer';
import type { ConnectionReferences, WorkflowParameter } from '@microsoft/logic-apps-designer';
import type { LogicAppsV2 } from '@microsoft/logic-apps-shared';
import type { PayloadAction } from '@reduxjs/toolkit';
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
Expand All @@ -20,6 +20,7 @@ export interface WorkflowLoadingState {
isConsumption: boolean;
isLocal: boolean;
showChatBot?: boolean;
parameters: Record<string, WorkflowParameter>;
showConnectionsPanel?: boolean;
workflowKind?: string;
language: string;
Expand All @@ -35,6 +36,7 @@ export interface WorkflowLoadingState {
const initialState: WorkflowLoadingState = {
appId: undefined,
workflowDefinition: null,
parameters: {},
runInstance: null,
connections: {},
resourcePath: '',
Expand All @@ -58,6 +60,7 @@ const initialState: WorkflowLoadingState = {
type WorkflowPayload = {
workflowDefinition: LogicAppsV2.WorkflowDefinition;
connectionReferences: ConnectionReferences;
parameters: Record<string, WorkflowParameter>;
};

type RunPayload = {
Expand All @@ -70,7 +73,8 @@ export const loadWorkflow = createAsyncThunk('workflowLoadingState/loadWorkflow'
const wf = await import(`../../../../../__mocks__/workflows/${currentState.workflowLoader.resourcePath?.split('.')[0]}.json`);
return {
workflowDefinition: wf.definition as LogicAppsV2.WorkflowDefinition,
connectionReferences: {},
connectionReferences: wf.connections as ConnectionReferences,
parameters: wf.parameters ?? {},
} as WorkflowPayload;
});

Expand Down Expand Up @@ -182,9 +186,11 @@ export const workflowLoadingSlice = createSlice({
}
state.workflowDefinition = action.payload?.workflowDefinition;
state.connections = action.payload?.connectionReferences ?? {};
state.parameters = action.payload?.parameters ?? {};
});
builder.addCase(loadWorkflow.rejected, (state) => {
state.workflowDefinition = null;
state.parameters = {};
});
builder.addCase(loadRun.fulfilled, (state, action: PayloadAction<RunPayload | null>) => {
if (!action.payload) {
Expand Down
29 changes: 29 additions & 0 deletions e2e/designer/TokenPicker.spec.ts
@@ -0,0 +1,29 @@
import test, { expect } from '@playwright/test';
import { GoToMockWorkflow } from './utils/GoToWorkflow';

test.describe(
'Token Picker Tests',
{
tag: '@mock',
},
async () => {
test('Token picker search should have robust name matching', async ({ page }) => {
await page.goto('/');

await GoToMockWorkflow(page, 'Panel');
await page.getByLabel('Parse JSON operation, Data').click();
await page.getByLabel('Content').click();
await page.locator('button').filter({ hasText: '' }).click();
await expect(page.getByRole('button', { name: 'EILCO Admin Nominations-OCSA' })).toBeVisible();
await page.getByPlaceholder('Search').click();
await page.getByPlaceholder('Search').fill('OCSA');
await expect(page.getByRole('button', { name: 'EILCO Admin Nominations-OCSA' })).toBeVisible();
await page.getByPlaceholder('Search').click();
await page.getByPlaceholder('Search').fill('_L2');
await expect(page.getByRole('button', { name: 'EILCO Admin Nominations-OCSA' })).toBeVisible();
await page.getByPlaceholder('Search').click();
await page.getByPlaceholder('Search').fill('OCSR');
await expect(page.getByRole('button', { name: 'EILCO Admin Nominations-OCSA' })).toBeVisible();
});
}
);
2 changes: 1 addition & 1 deletion e2e/designer/serialization.spec.ts
Expand Up @@ -18,7 +18,7 @@ test.describe(
assert: { type: 'json' },
});

expect({ connectionReferences: {}, parameters: {}, definition: mock.default.definition }).toEqual(serialized as any);
expect({ connectionReferences: mock.default.connectionReferences, parameters: mock.default.parameters, definition: mock.default.definition }).toEqual(serialized as any);
});

test('Should serialize the workflow after deserializing it and match with a switch statement', async ({ page }) => {
Expand Down
Expand Up @@ -30,6 +30,7 @@ const fuseFunctionSearchOptions: Fuse.IFuseOptions<FunctionData> = {
minMatchCharLength: 2,
includeMatches: true,
threshold: 0.4,
ignoreLocation: true,
keys: ['key', 'functionName', 'displayName', 'category'],
};

Expand Down
1 change: 1 addition & 0 deletions libs/data-mapper/src/lib/utils/Schema.Utils.ts
Expand Up @@ -194,6 +194,7 @@ export const searchSchemaTreeFromRoot = (
includeScore: true,
minMatchCharLength: 2,
includeMatches: true,
ignoreLocation: true,
threshold: 0.4,
keys: ['qName'],
};
Expand Down
1 change: 1 addition & 0 deletions libs/designer-ui/src/lib/azureResourcePicker/index.tsx
Expand Up @@ -30,6 +30,7 @@ const fuseOptions: Fuse.IFuseOptions<{ id: string; text: string }> = {
includeScore: true,
minMatchCharLength: 2,
includeMatches: true,
ignoreLocation: true,
threshold: 0.4,
keys: ['text'],
};
Expand Down
Expand Up @@ -54,7 +54,7 @@ export const TokenPickerOptions = ({
let tokens: Token[];
if (searchQuery) {
const query = searchQuery.trim();
const fuse = new Fuse(section.tokens, { keys: ['description', 'title'], threshold: 0.2 });
const fuse = new Fuse(section.tokens, { keys: ['description', 'title'], threshold: 0.4, ignoreLocation: true });
tokens = fuse.search(query).map((token) => token.item);
setFilteredTokens(tokens);
}
Expand Down
Expand Up @@ -20,6 +20,7 @@ const fuseOptions: Fuse.IFuseOptions<{ id: string; text: string }> = {
includeScore: true,
minMatchCharLength: 2,
includeMatches: true,
ignoreLocation: true,
threshold: 0.4,
keys: ['text'],
};
Expand Down
Expand Up @@ -114,6 +114,7 @@ class DefaultSearchOperationsService implements Pick<ISearchService, 'searchOper
return {
includeScore: true,
threshold: 0.4,
ignoreLocation: true,
keys: [
{
name: 'properties.summary', // Operation 'name'
Expand Down

0 comments on commit 2dfc193

Please sign in to comment.