fix: Remove private widgets from autocompletion (#10535)

This commit is contained in:
Favour Ohanekwu 2022-01-21 04:08:40 -08:00 committed by GitHub
parent 6bc1bdd5e1
commit 1b858bcf5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 207 additions and 3 deletions

View File

@ -3,6 +3,7 @@ import { DataTree } from "entities/DataTree/dataTreeFactory";
import {
DataTreeDiff,
DataTreeDiffEvent,
getDataTreeWithoutPrivateWidgets,
getEntityNameAndPropertyPath,
isAction,
isJSAction,
@ -367,7 +368,13 @@ export function* updateTernDefinitions(
}
if (shouldUpdate) {
const start = performance.now();
const { def, entityInfo } = dataTreeTypeDefCreator(dataTree);
// remove private widgets from dataTree used for autocompletion
const treeWithoutPrivateWidgets = getDataTreeWithoutPrivateWidgets(
dataTree,
);
const { def, entityInfo } = dataTreeTypeDefCreator(
treeWithoutPrivateWidgets,
);
TernServer.updateDef("DATA_TREE", def, entityInfo);
const end = performance.now();
log.debug("Tern", { updates });

View File

@ -225,6 +225,7 @@ const BASE_WIDGET: DataTreeWidget = {
triggerPaths: {},
validationPaths: {},
ENTITY_TYPE: ENTITY_TYPE.WIDGET,
privateWidgets: {},
};
const BASE_ACTION: DataTreeAction = {
@ -247,6 +248,7 @@ const BASE_ACTION: DataTreeAction = {
data: EvaluationSubstitutionType.TEMPLATE,
},
dependencyMap: {},
datasourceUrl: "",
};
describe("DataTreeEvaluator", () => {

View File

@ -1,5 +1,106 @@
import { PrivateWidgets } from "entities/DataTree/dataTreeFactory";
import { getAllPaths, isPrivateEntityPath } from "./evaluationUtils";
import { RenderModes } from "constants/WidgetConstants";
import { ValidationTypes } from "constants/WidgetValidation";
import {
DataTreeWidget,
ENTITY_TYPE,
EvaluationSubstitutionType,
PrivateWidgets,
} from "entities/DataTree/dataTreeFactory";
import {
getAllPaths,
getAllPrivateWidgetsInDataTree,
getDataTreeWithoutPrivateWidgets,
isPrivateEntityPath,
} from "./evaluationUtils";
const BASE_WIDGET: DataTreeWidget = {
logBlackList: {},
widgetId: "randomID",
widgetName: "randomWidgetName",
bottomRow: 0,
isLoading: false,
leftColumn: 0,
parentColumnSpace: 0,
parentRowSpace: 0,
renderMode: RenderModes.CANVAS,
rightColumn: 0,
topRow: 0,
type: "SKELETON_WIDGET",
parentId: "0",
version: 1,
bindingPaths: {},
triggerPaths: {},
validationPaths: {},
ENTITY_TYPE: ENTITY_TYPE.WIDGET,
privateWidgets: {},
};
const testDataTree: Record<string, DataTreeWidget> = {
Text1: {
...BASE_WIDGET,
widgetName: "Text1",
text: "Label",
type: "TEXT_WIDGET",
bindingPaths: {
text: EvaluationSubstitutionType.TEMPLATE,
},
validationPaths: {
text: { type: ValidationTypes.TEXT },
},
},
Text2: {
...BASE_WIDGET,
widgetName: "Text2",
text: "{{Text1.text}}",
dynamicBindingPathList: [{ key: "text" }],
type: "TEXT_WIDGET",
bindingPaths: {
text: EvaluationSubstitutionType.TEMPLATE,
},
validationPaths: {
text: { type: ValidationTypes.TEXT },
},
},
Text3: {
...BASE_WIDGET,
widgetName: "Text3",
text: "{{Text1.text}}",
dynamicBindingPathList: [{ key: "text" }],
type: "TEXT_WIDGET",
bindingPaths: {
text: EvaluationSubstitutionType.TEMPLATE,
},
validationPaths: {
text: { type: ValidationTypes.TEXT },
},
},
Text4: {
...BASE_WIDGET,
widgetName: "Text4",
text: "{{Text1.text}}",
dynamicBindingPathList: [{ key: "text" }],
type: "TEXT_WIDGET",
bindingPaths: {
text: EvaluationSubstitutionType.TEMPLATE,
},
validationPaths: {
text: { type: ValidationTypes.TEXT },
},
},
List1: {
...BASE_WIDGET,
privateWidgets: {
Text2: true,
},
},
List2: {
...BASE_WIDGET,
privateWidgets: {
Text3: true,
},
},
};
describe("Correctly handle paths", () => {
it("getsAllPaths", () => {
@ -39,7 +140,9 @@ describe("Correctly handle paths", () => {
const actual = getAllPaths(myTree);
expect(actual).toStrictEqual(result);
});
});
describe("privateWidgets", () => {
it("correctly checks if path is a PrivateEntityPath", () => {
const privateWidgets: PrivateWidgets = {
Button1: true,
@ -57,4 +160,72 @@ describe("Correctly handle paths", () => {
).toBeFalsy();
expect(isPrivateEntityPath(privateWidgets, "Image2.data")).toBeTruthy();
});
it("Returns list of all privateWidgets", () => {
const expectedPrivateWidgetsList = {
Text2: true,
Text3: true,
};
const actualPrivateWidgetsList = getAllPrivateWidgetsInDataTree(
testDataTree,
);
expect(expectedPrivateWidgetsList).toStrictEqual(actualPrivateWidgetsList);
});
it("Returns data tree without privateWidgets", () => {
const expectedDataTreeWithoutPrivateWidgets: Record<
string,
DataTreeWidget
> = {
Text1: {
...BASE_WIDGET,
widgetName: "Text1",
text: "Label",
type: "TEXT_WIDGET",
bindingPaths: {
text: EvaluationSubstitutionType.TEMPLATE,
},
validationPaths: {
text: { type: ValidationTypes.TEXT },
},
},
Text4: {
...BASE_WIDGET,
widgetName: "Text4",
text: "{{Text1.text}}",
dynamicBindingPathList: [{ key: "text" }],
type: "TEXT_WIDGET",
bindingPaths: {
text: EvaluationSubstitutionType.TEMPLATE,
},
validationPaths: {
text: { type: ValidationTypes.TEXT },
},
},
List1: {
...BASE_WIDGET,
privateWidgets: {
Text2: true,
},
},
List2: {
...BASE_WIDGET,
privateWidgets: {
Text3: true,
},
},
};
const actualDataTreeWithoutPrivateWidgets = getDataTreeWithoutPrivateWidgets(
testDataTree,
);
expect(expectedDataTreeWithoutPrivateWidgets).toStrictEqual(
actualDataTreeWithoutPrivateWidgets,
);
});
});

View File

@ -722,3 +722,27 @@ export const isPrivateEntityPath = (
}
return false;
};
export const getAllPrivateWidgetsInDataTree = (
dataTree: DataTree,
): PrivateWidgets => {
let privateWidgets: PrivateWidgets = {};
Object.keys(dataTree).forEach((entityName) => {
const entity = dataTree[entityName];
if (isWidget(entity) && !_.isEmpty(entity.privateWidgets)) {
privateWidgets = { ...privateWidgets, ...entity.privateWidgets };
}
});
return privateWidgets;
};
export const getDataTreeWithoutPrivateWidgets = (
dataTree: DataTree,
): DataTree => {
const privateWidgets = getAllPrivateWidgetsInDataTree(dataTree);
const privateWidgetNames = Object.keys(privateWidgets);
const treeWithoutPrivateWidgets = _.omit(dataTree, privateWidgetNames);
return treeWithoutPrivateWidgets;
};