@adaptabletools/adaptable 22.0.11 → 22.1.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.css +19 -1
- package/index.css.map +1 -1
- package/package.json +3 -4
- package/src/AdaptableOptions/DashboardOptions.d.ts +2 -2
- package/src/AdaptableState/Common/AdaptablePredicate.js +1 -1
- package/src/AdaptableState/InitialState.d.ts +2 -2
- package/src/AdaptableState/LayoutState.d.ts +44 -0
- package/src/Api/CalendarApi.d.ts +15 -0
- package/src/Api/ColumnScopeApi.d.ts +5 -0
- package/src/Api/Implementation/CalendarApiImpl.d.ts +3 -0
- package/src/Api/Implementation/CalendarApiImpl.js +10 -0
- package/src/Api/Implementation/ColumnApiImpl.d.ts +1 -0
- package/src/Api/Implementation/ColumnApiImpl.js +14 -0
- package/src/Api/Implementation/ColumnScopeApiImpl.d.ts +1 -0
- package/src/Api/Implementation/ColumnScopeApiImpl.js +12 -0
- package/src/Api/Implementation/LayoutHelpers.js +12 -0
- package/src/Api/Internal/AlertInternalApi.js +4 -1
- package/src/Api/Internal/FormatColumnInternalApi.js +3 -3
- package/src/Strategy/FlashingCellModule.js +1 -0
- package/src/Strategy/PlusMinusModule.js +3 -3
- package/src/Strategy/SmartEditModule.js +1 -1
- package/src/Utilities/Constants/GeneralConstants.js +2 -1
- package/src/Utilities/ExpressionFunctions/booleanExpressionFunctions.d.ts +1 -1
- package/src/Utilities/ExpressionFunctions/booleanExpressionFunctions.js +41 -2
- package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.d.ts +1 -1
- package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +31 -2
- package/src/Utilities/Helpers/AdaptableHelper.js +30 -4
- package/src/Utilities/Services/Interface/IQueryLanguageService.d.ts +1 -0
- package/src/Utilities/Services/MetamodelService.js +18 -18
- package/src/Utilities/Services/QueryLanguageService.d.ts +2 -0
- package/src/Utilities/Services/QueryLanguageService.js +20 -8
- package/src/Utilities/Services/ValidationService.js +3 -1
- package/src/View/Components/EntityRulesEditor/index.js +1 -1
- package/src/View/Components/ModuleValueSelector/index.js +9 -1
- package/src/View/Components/ReorderDraggable/index.js +22 -36
- package/src/View/Components/ValueSelector/index.js +46 -50
- package/src/View/Dashboard/PinnedToolbarsSelector.js +1 -1
- package/src/View/Layout/Wizard/LayoutWizard.js +16 -1
- package/src/View/Layout/Wizard/sections/ColumnsSection.js +31 -19
- package/src/View/Layout/Wizard/sections/RowGroupingSection.js +1 -1
- package/src/View/Layout/Wizard/sections/RowSelectionSection.d.ts +8 -0
- package/src/View/Layout/Wizard/sections/RowSelectionSection.js +140 -0
- package/src/View/NamedQuery/Wizard/NamedQuerySettingsWizardSection.js +0 -1
- package/src/agGrid/AdaptableAgGrid.js +10 -0
- package/src/components/Dashboard/Dashboard.js +1 -1
- package/src/components/DragAndDropContext/ModuleManager.d.ts +1 -0
- package/src/components/DragAndDropContext/ModuleManager.js +12 -37
- package/src/components/DragAndDropContext/TabList.d.ts +11 -6
- package/src/components/DragAndDropContext/TabList.js +78 -36
- package/src/components/DragAndDropContext/UnusedPanel.js +10 -21
- package/src/components/ExpressionEditor/BaseEditorInput.d.ts +2 -0
- package/src/components/ExpressionEditor/BaseEditorInput.js +4 -0
- package/src/components/ExpressionEditor/EditorInput.d.ts +3 -1
- package/src/components/ExpressionEditor/EditorInput.js +20 -9
- package/src/components/ExpressionEditor/QueryBuilder/QueryBuilder.d.ts +2 -1
- package/src/components/ExpressionEditor/QueryBuilder/QueryBuilder.js +3 -12
- package/src/components/ExpressionEditor/QueryBuilder/QueryPredicateBuilder.js +17 -19
- package/src/components/ExpressionEditor/index.d.ts +2 -1
- package/src/components/ExpressionEditor/index.js +1 -1
- package/src/components/Tree/TreeDropdown/index.js +38 -27
- package/src/components/dnd/index.d.ts +3 -13
- package/src/components/dnd/index.js +4 -55
- package/src/env.js +2 -2
- package/src/layout-manager/src/LayoutManagerModel.d.ts +2 -1
- package/src/layout-manager/src/index.d.ts +10 -0
- package/src/layout-manager/src/index.js +156 -4
- package/src/layout-manager/src/normalizeLayoutModel.js +8 -0
- package/src/layout-manager/src/simplifyLayoutModel.js +6 -0
- package/src/metamodel/adaptable-metamodel-model.d.ts +22 -13
- package/src/metamodel/adaptable.metamodel.d.ts +3792 -5143
- package/src/metamodel/adaptable.metamodel.js +1 -1
- package/src/parser/src/parser.js +55 -1218
- package/src/parser/src/types.d.ts +5 -0
- package/src/types.d.ts +1 -1
- package/tsconfig.esm.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { DragDropProvider } from '../dnd';
|
|
3
3
|
import { DragAndDropContext } from './DragAndDropContext';
|
|
4
4
|
import { TabList } from './TabList';
|
|
5
5
|
import { UnusedPanel } from './UnusedPanel';
|
|
@@ -14,7 +14,6 @@ export const ModuleManager = (props) => {
|
|
|
14
14
|
editTabName: true,
|
|
15
15
|
dragAndDropTab: true,
|
|
16
16
|
deleteTab: true,
|
|
17
|
-
// override default permitted actions
|
|
18
17
|
...permittedActions,
|
|
19
18
|
};
|
|
20
19
|
return {
|
|
@@ -22,34 +21,15 @@ export const ModuleManager = (props) => {
|
|
|
22
21
|
availableItems: props.availableItems,
|
|
23
22
|
};
|
|
24
23
|
}, [props.availableItems, props.permittedActions]);
|
|
25
|
-
const
|
|
26
|
-
.map((t) => t.Id)
|
|
27
|
-
.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const { source, destination, draggableId } = result;
|
|
32
|
-
if (!source || !destination) {
|
|
33
|
-
return;
|
|
24
|
+
const allowedItems = React.useMemo(() => {
|
|
25
|
+
let result = availableItems.map((t) => t.Id);
|
|
26
|
+
if (props.filterOutSelectedItems) {
|
|
27
|
+
result = result.filter((item) => {
|
|
28
|
+
return !tabs.some((tab) => tab.Items?.includes(item));
|
|
29
|
+
});
|
|
34
30
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
sourceTabToolbars.splice(source.index, 1);
|
|
38
|
-
}
|
|
39
|
-
if (destination.droppableId !== 'UNUSED') {
|
|
40
|
-
const destinationTabToolbars = tabs[Number(destination.droppableId)].Items;
|
|
41
|
-
destinationTabToolbars.splice(destination.index, 0, draggableId);
|
|
42
|
-
}
|
|
43
|
-
onTabsChange([...tabs]);
|
|
44
|
-
};
|
|
45
|
-
const handleTabDragEnd = (result) => {
|
|
46
|
-
const { source, destination } = result;
|
|
47
|
-
if (!source || !destination)
|
|
48
|
-
return;
|
|
49
|
-
const [removed] = tabs.splice(source.index, 1);
|
|
50
|
-
tabs.splice(destination.index, 0, removed);
|
|
51
|
-
onTabsChange([...tabs]);
|
|
52
|
-
};
|
|
31
|
+
return result;
|
|
32
|
+
}, [tabs, availableItems]);
|
|
53
33
|
const handleRemoveTab = (tabIndex) => {
|
|
54
34
|
onTabsChange(tabs.filter((_, index) => index !== tabIndex));
|
|
55
35
|
};
|
|
@@ -76,17 +56,12 @@ export const ModuleManager = (props) => {
|
|
|
76
56
|
};
|
|
77
57
|
}));
|
|
78
58
|
};
|
|
79
|
-
return (React.createElement(
|
|
80
|
-
if (result.type === 'TAB')
|
|
81
|
-
handleTabDragEnd(result);
|
|
82
|
-
if (result.type === 'TOOLBAR')
|
|
83
|
-
handleToolbarDragEnd(result);
|
|
84
|
-
} },
|
|
59
|
+
return (React.createElement(DragDropProvider, null,
|
|
85
60
|
React.createElement(DragAndDropContext.Provider, { value: contextValue },
|
|
86
61
|
React.createElement(Flex, { flexDirection: "column", className: clsx('ab-ModuleSelector twa:flex-1', className) },
|
|
87
|
-
React.createElement(UnusedPanel, { title: unusedPanelTitle, disabled: disabled, items:
|
|
62
|
+
React.createElement(UnusedPanel, { title: unusedPanelTitle, disabled: disabled, items: allowedItems, dragItemText: dragItemText }),
|
|
88
63
|
React.createElement(Card, { className: "twa:flex-1 twa:m-2 ab-ModuleSelector-UsedPanel" },
|
|
89
64
|
React.createElement(Card.Title, { border: false }, tabsTitle),
|
|
90
65
|
React.createElement(Card.Body, { className: "twa:px-2" },
|
|
91
|
-
React.createElement(TabList, { disabled: disabled, tabs: tabs, onRemoveTab: handleRemoveTab, onRemoveToolbar: handleRemoveToolbar, onChangeTabName: handleChangeTabName, onNewTab: contextValue.permittedActions.createTab ? handleTabAdd : undefined })))))));
|
|
66
|
+
React.createElement(TabList, { disabled: disabled, tabs: tabs, onTabsChange: onTabsChange, onRemoveTab: handleRemoveTab, onRemoveToolbar: handleRemoveToolbar, onChangeTabName: handleChangeTabName, onNewTab: contextValue.permittedActions.createTab ? handleTabAdd : undefined })))))));
|
|
92
67
|
};
|
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { BaseModuleTab } from './types';
|
|
3
|
-
export declare function TabList({ tabs, onRemoveTab, onRemoveToolbar, onChangeTabName, disabled, onNewTab, }: {
|
|
3
|
+
export declare function TabList({ tabs, onTabsChange, onRemoveTab, onRemoveToolbar, onChangeTabName, disabled, onNewTab, }: {
|
|
4
4
|
disabled: boolean;
|
|
5
5
|
tabs: BaseModuleTab[];
|
|
6
|
+
onTabsChange: (tabs: BaseModuleTab[]) => void;
|
|
6
7
|
onRemoveTab: (tabIndex: number) => void;
|
|
7
8
|
onRemoveToolbar: (tabIndex: number, toolbarIndex: number) => void;
|
|
8
9
|
onChangeTabName: (tabIndex: number, tabName: string) => void;
|
|
9
10
|
onNewTab?: () => void;
|
|
10
11
|
}): React.JSX.Element;
|
|
11
|
-
export declare function TabItem({ tab, tabIndex, onRemove, onRemoveToolbar, onChangeTabName, disabled, }: {
|
|
12
|
+
export declare function TabItem({ tab, tabId, tabIndex, tabs, onTabsChange, onRemove, onRemoveToolbar, onChangeTabName, disabled, }: {
|
|
12
13
|
tab: BaseModuleTab;
|
|
14
|
+
tabId: string;
|
|
13
15
|
tabIndex: number;
|
|
16
|
+
tabs: BaseModuleTab[];
|
|
17
|
+
onTabsChange: (tabs: BaseModuleTab[]) => void;
|
|
14
18
|
disabled: boolean;
|
|
15
19
|
onRemove: () => void;
|
|
16
20
|
onRemoveToolbar: (toolbarIndex: number) => void;
|
|
17
21
|
onChangeTabName: (tabName: string) => void;
|
|
18
22
|
}): React.JSX.Element;
|
|
19
|
-
export declare function ToolbarList({ toolbars,
|
|
23
|
+
export declare function ToolbarList({ toolbars, tabIndex, tabs, onTabsChange, onRemove, disabled, }: {
|
|
20
24
|
toolbars: string[];
|
|
21
|
-
|
|
25
|
+
tabIndex: number;
|
|
26
|
+
tabs: BaseModuleTab[];
|
|
27
|
+
onTabsChange: (tabs: BaseModuleTab[]) => void;
|
|
22
28
|
disabled: boolean;
|
|
23
29
|
onRemove: (toolbarIndex: number) => void;
|
|
24
30
|
}): React.JSX.Element;
|
|
25
|
-
export declare function ToolbarItem({ toolbar,
|
|
31
|
+
export declare function ToolbarItem({ toolbar, onRemove, disabled, }: {
|
|
26
32
|
disabled: boolean;
|
|
27
33
|
toolbar: string;
|
|
28
|
-
toolbarIndex: number;
|
|
29
34
|
onRemove: () => void;
|
|
30
35
|
}): React.JSX.Element;
|
|
@@ -1,65 +1,107 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { defaultDragProxyMove, DragList } from '../dnd';
|
|
3
3
|
import { Icon } from '../icons';
|
|
4
4
|
import SimpleButton from '../SimpleButton';
|
|
5
5
|
import { DragAndDropContext } from './DragAndDropContext';
|
|
6
6
|
import { Box, Flex } from '../Flex';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
import clsx from 'clsx';
|
|
8
|
+
export function TabList({ tabs, onTabsChange, onRemoveTab, onRemoveToolbar, onChangeTabName, disabled, onNewTab, }) {
|
|
9
|
+
const tabIdsRef = React.useRef(new WeakMap());
|
|
10
|
+
const nextTabIdRef = React.useRef(0);
|
|
11
|
+
const getTabStableId = React.useCallback((tab) => {
|
|
12
|
+
const existingId = tabIdsRef.current.get(tab);
|
|
13
|
+
if (existingId) {
|
|
14
|
+
return existingId;
|
|
15
|
+
}
|
|
16
|
+
const newId = `dashboard-tab-${String(nextTabIdRef.current++)}`;
|
|
17
|
+
tabIdsRef.current.set(tab, newId);
|
|
18
|
+
return newId;
|
|
19
|
+
}, []);
|
|
20
|
+
return (React.createElement(DragList, { dragListId: "TABS", orientation: "horizontal", dragStrategy: "proxy", preserveDragSpace: true, onDragProxyMove: defaultDragProxyMove, onDrop: (sortedIndexes) => {
|
|
21
|
+
const newTabs = sortedIndexes.map((i) => tabs[i]);
|
|
22
|
+
onTabsChange(newTabs);
|
|
23
|
+
} }, (listDomProps) => (React.createElement("div", { ...listDomProps, className: clsx('ab-ModuleSelector__TabList twa:flex twa:flex-1 twa:overflow-auto', listDomProps.className), "data-name": "dashboard-tabs" },
|
|
24
|
+
tabs.map((tab, tabIndex) => {
|
|
25
|
+
const tabId = getTabStableId(tab);
|
|
26
|
+
return (React.createElement(TabItem, { disabled: disabled, key: tabIndex, tabId: tabId, tabIndex: tabIndex, tabs: tabs, onTabsChange: onTabsChange, tab: tab, onRemove: () => onRemoveTab(tabIndex), onRemoveToolbar: (toolbarIndex) => onRemoveToolbar(tabIndex, toolbarIndex), onChangeTabName: (tabName) => onChangeTabName(tabIndex, tabName) }));
|
|
27
|
+
}),
|
|
10
28
|
!disabled && onNewTab ? (React.createElement(Flex, { alignItems: "center", justifyContent: "center", className: "ab-ModuleSelector__TabItem twa:min-w-32 twa:border-dashed twa:cursor-pointer twa:bg-primarylight twa:text-primary-foreground twa:hover:bg-primary", onClick: onNewTab },
|
|
11
29
|
React.createElement("div", { className: "twa:text-8 twa:flex twa:flex-col twa:gap-4 twa:items-center twa:italic" },
|
|
12
30
|
React.createElement(Icon, { name: "plus", size: 32 }),
|
|
13
|
-
"Click to add tab"))) : null
|
|
14
|
-
provided.placeholder))));
|
|
31
|
+
"Click to add tab"))) : null))));
|
|
15
32
|
}
|
|
16
|
-
export function TabItem({ tab, tabIndex, onRemove, onRemoveToolbar, onChangeTabName, disabled, }) {
|
|
33
|
+
export function TabItem({ tab, tabId, tabIndex, tabs, onTabsChange, onRemove, onRemoveToolbar, onChangeTabName, disabled, }) {
|
|
17
34
|
const context = React.useContext(DragAndDropContext);
|
|
18
35
|
const isDragDisabled = disabled || !context.permittedActions.dragAndDropTab;
|
|
19
|
-
return (React.createElement(
|
|
36
|
+
return (React.createElement(DragList.DraggableItem, { dragListId: "TABS", id: tabId }, (itemDomProps) => {
|
|
37
|
+
const { onPointerDown, ...restDomProps } = itemDomProps;
|
|
20
38
|
let showHeader = true;
|
|
21
39
|
if (tab.Name === '' &&
|
|
22
40
|
!context.permittedActions.editTabName &&
|
|
23
41
|
!context.permittedActions.deleteTab) {
|
|
24
42
|
showHeader = false;
|
|
25
43
|
}
|
|
26
|
-
return (React.createElement("div", { className:
|
|
27
|
-
...(isDragDisabled ? {} : provided.draggableProps.style),
|
|
28
|
-
} },
|
|
44
|
+
return (React.createElement("div", { ...restDomProps, className: clsx('twa:bg-defaultbackground', 'twa:select-none', 'ab-ModuleSelector__TabItem twa:min-w-32', restDomProps.className), "data-name": "dashboard-tab" },
|
|
29
45
|
showHeader ? (React.createElement("div", { className: "ab-ModuleSelector__TabItem__header" },
|
|
30
|
-
React.createElement("div", { ...(
|
|
31
|
-
? {}
|
|
32
|
-
: {
|
|
33
|
-
display: 'none',
|
|
34
|
-
} },
|
|
46
|
+
React.createElement("div", { ...(!isDragDisabled ? { onPointerDown } : {}), style: context.permittedActions.dragAndDropTab ? {} : { display: 'none' } },
|
|
35
47
|
React.createElement(Icon, { name: "drag" })),
|
|
36
48
|
context.permittedActions.editTabName ? (React.createElement("input", { className: "ab-ModuleSelector__TabItem__header-input", type: "text", disabled: disabled, value: tab.Name, onChange: (event) => {
|
|
37
49
|
onChangeTabName(event.target.value);
|
|
38
50
|
} })) : (tab.Name),
|
|
39
51
|
context.permittedActions.deleteTab && (React.createElement(SimpleButton, { disabled: disabled, icon: "delete", variant: "text", onClick: onRemove })))) : null,
|
|
40
|
-
React.createElement(ToolbarList, { disabled: disabled, toolbars: tab.Items,
|
|
52
|
+
React.createElement(ToolbarList, { disabled: disabled, toolbars: tab.Items, tabIndex: tabIndex, tabs: tabs, onTabsChange: onTabsChange, onRemove: onRemoveToolbar })));
|
|
41
53
|
}));
|
|
42
54
|
}
|
|
43
|
-
export function ToolbarList({ toolbars,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
export function ToolbarList({ toolbars, tabIndex, tabs, onTabsChange, onRemove, disabled, }) {
|
|
56
|
+
const acceptDropsFrom = React.useMemo(() => {
|
|
57
|
+
const sources = ['UNUSED'];
|
|
58
|
+
tabs.forEach((_, i) => {
|
|
59
|
+
if (i !== tabIndex)
|
|
60
|
+
sources.push(String(i));
|
|
61
|
+
});
|
|
62
|
+
return sources;
|
|
63
|
+
}, [tabIndex, tabs]);
|
|
64
|
+
return (React.createElement(DragList, { dragListId: String(tabIndex), orientation: "vertical", acceptDropsFrom: [...acceptDropsFrom, String(tabIndex)], onDragProxyMove: defaultDragProxyMove,
|
|
65
|
+
// this is called when reordering inside the same list
|
|
66
|
+
onDrop: (sortedIndexes) => {
|
|
67
|
+
const newItems = sortedIndexes.map((i) => toolbars[i]);
|
|
68
|
+
onTabsChange(tabs.map((t, i) => (i === tabIndex ? { ...t, Items: newItems } : t)));
|
|
69
|
+
}, shouldAcceptDrop: ({ dragItem, dragSourceListId }) => {
|
|
70
|
+
const dragItemId = dragItem.id;
|
|
71
|
+
// if the tab contains an item with the same id, don't accept the drop
|
|
72
|
+
if (dragSourceListId != String(tabIndex) && tabs[tabIndex].Items.includes(dragItemId)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
// this is called when dropping an item from a different list
|
|
78
|
+
onAcceptDrop: ({ dragItemId, dragSourceListId, dropIndex }) => {
|
|
79
|
+
const newTabs = tabs.map((tab, i) => {
|
|
80
|
+
let items = [...tab.Items];
|
|
81
|
+
if (dragSourceListId !== 'UNUSED' && i === Number(dragSourceListId)) {
|
|
82
|
+
items = items.filter((item) => item !== dragItemId);
|
|
83
|
+
}
|
|
84
|
+
if (i === tabIndex) {
|
|
85
|
+
items.splice(dropIndex, 0, dragItemId);
|
|
86
|
+
}
|
|
87
|
+
return { ...tab, Items: items };
|
|
88
|
+
});
|
|
89
|
+
onTabsChange(newTabs);
|
|
90
|
+
} }, (listDomProps, context) => (React.createElement(Box, { ...listDomProps, className: clsx('ab-ModuleSelector__ToolbarList', listDomProps.className, {
|
|
91
|
+
'twa:bg-(--ab-dashboard-tab-drop-target__background) ab-ModuleSelector__ToolbarList--accent-drop': context.dropTargetListId === String(tabIndex) && context.status === 'accepted',
|
|
92
|
+
'twa:bg-error/30 ab-ModuleSelector__ToolbarList--reject-drop': context.dropTargetListId === String(tabIndex) && context.status === 'rejected',
|
|
93
|
+
}), "data-name": "dashboard-toolbar-drop-target" },
|
|
94
|
+
toolbars?.map((toolbar, toolbarIndex) => (React.createElement(ToolbarItem, { disabled: disabled, key: toolbar, toolbar: toolbar, onRemove: () => onRemove(toolbarIndex) }))),
|
|
95
|
+
toolbars.length === 0 ? (React.createElement("div", { className: "ab-ModuleSelector__ToolbarList__placeholder twa:flex twa:items-center twa:justify-center twa:h-full twa:italic twa:text-center" }, "Drag and drop toolbar here")) : null))));
|
|
52
96
|
}
|
|
53
|
-
export function ToolbarItem({ toolbar,
|
|
97
|
+
export function ToolbarItem({ toolbar, onRemove, disabled, }) {
|
|
54
98
|
const { availableItems } = React.useContext(DragAndDropContext);
|
|
55
|
-
|
|
99
|
+
const currentItem = availableItems.find((t) => t.Id === toolbar);
|
|
56
100
|
const title = currentItem ? currentItem.Title : toolbar;
|
|
57
|
-
return (React.createElement(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
React.createElement("div", { className: "twa:flex-1" }, title),
|
|
64
|
-
React.createElement(SimpleButton, { disabled: disabled, icon: "close", variant: "text", className: "twa:p-1", onClick: onRemove })))));
|
|
101
|
+
return (React.createElement(DragList.DraggableItem, { id: toolbar }, (itemDomProps) => {
|
|
102
|
+
const { onPointerDown, ...restDomProps } = itemDomProps;
|
|
103
|
+
return (React.createElement(Flex, { ...restDomProps, ...(disabled ? {} : { onPointerDown }), className: clsx('ab-ModuleSelector__ToolbarItem twa:mb-1 twa:pl-1 twa:text-3', 'twa:bg-primarylight', restDomProps.className), alignItems: "center" },
|
|
104
|
+
React.createElement("div", { className: "twa:flex-1" }, title),
|
|
105
|
+
React.createElement(SimpleButton, { disabled: disabled, icon: "close", variant: "text", className: "twa:p-1", onClick: onRemove })));
|
|
106
|
+
}));
|
|
65
107
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { defaultDragProxyMove, DragList } from '../dnd';
|
|
3
3
|
import { DragAndDropContext } from './DragAndDropContext';
|
|
4
4
|
import { Box } from '../Flex';
|
|
5
5
|
import clsx from 'clsx';
|
|
@@ -12,29 +12,18 @@ export function UnusedPanel({ items, disabled, title, dragItemText, }) {
|
|
|
12
12
|
")"),
|
|
13
13
|
React.createElement(UnusedItemList, { disabled: disabled, items: items })));
|
|
14
14
|
}
|
|
15
|
+
const EMPTY_ARRAY = [];
|
|
15
16
|
function UnusedItemList({ items, disabled }) {
|
|
16
|
-
return (React.createElement(
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
return (React.createElement(DragList, { dragStrategy: "proxy", preserveDragSpace: true, dragListId: "UNUSED", orientation: "horizontal", onDragProxyMove: defaultDragProxyMove, acceptDropsFrom: EMPTY_ARRAY, onDragProxySetup: ({ proxyElement }) => {
|
|
18
|
+
proxyElement.classList.add('twa:shadow-md');
|
|
19
|
+
}, onDrop: () => { } }, (listDomProps) => (React.createElement("div", { ...listDomProps, "data-name": "unusedpanel-items-list", className: clsx('twa:px-2 twa:flex-wrap twa:flex twa:flex-row twa:gap-1', listDomProps.className) }, items.map((unusedItem) => (React.createElement(UnusedItem, { disabled: disabled, key: unusedItem, unusedItem: unusedItem })))))));
|
|
19
20
|
}
|
|
20
|
-
function UnusedItem({ unusedItem,
|
|
21
|
+
function UnusedItem({ unusedItem, disabled }) {
|
|
21
22
|
const { availableItems } = React.useContext(DragAndDropContext);
|
|
22
|
-
|
|
23
|
+
const currentItem = availableItems.find((t) => t.Id === unusedItem);
|
|
23
24
|
const title = currentItem ? currentItem.Title : unusedItem;
|
|
24
|
-
return (React.createElement(
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
: {
|
|
28
|
-
...provided.draggableProps,
|
|
29
|
-
...provided.dragHandleProps,
|
|
30
|
-
};
|
|
31
|
-
const dragStyle = disabled ? {} : provided.draggableProps.style;
|
|
32
|
-
return (React.createElement("div", { "data-name": "unused-item", ref: provided.innerRef, ...eventHandlers, className: clsx('twa:rounded-md twa:text-sm twa:text-text-on-primary twa:p-2'), style: {
|
|
33
|
-
...dragStyle,
|
|
34
|
-
border: '1px solid var(--ab-color-primary)',
|
|
35
|
-
backgroundColor: snapshot.isDragging
|
|
36
|
-
? 'var(--ab-dashboard-toolbar-drag__background)'
|
|
37
|
-
: 'var(--ab-color-primary)',
|
|
38
|
-
} }, title));
|
|
25
|
+
return (React.createElement(DragList.DraggableItem, { id: unusedItem }, (itemDomProps) => {
|
|
26
|
+
const { onPointerDown, ...restDomProps } = itemDomProps;
|
|
27
|
+
return (React.createElement("div", { "data-name": "unused-item", ...restDomProps, ...(disabled ? {} : { onPointerDown }), className: clsx('twa:rounded-md twa:text-sm twa:text-text-on-primary twa:p-2 twa:select-none', 'twa:bg-primary', restDomProps.className) }, title));
|
|
39
28
|
}));
|
|
40
29
|
}
|
|
@@ -2,6 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { ExpressionFunction, ExpressionFunctionMap } from '../../parser/src/types';
|
|
3
3
|
import { AdaptableApi } from '../../Api/AdaptableApi';
|
|
4
4
|
import { CSSProperties } from 'react';
|
|
5
|
+
import { ColumnScope } from '../../types';
|
|
5
6
|
interface BaseEditorInputProps {
|
|
6
7
|
type: 'main' | 'secondary';
|
|
7
8
|
value: string;
|
|
@@ -16,6 +17,7 @@ interface BaseEditorInputProps {
|
|
|
16
17
|
hideResultPreview?: boolean;
|
|
17
18
|
api: AdaptableApi;
|
|
18
19
|
style?: CSSProperties;
|
|
20
|
+
columnScope?: ColumnScope;
|
|
19
21
|
}
|
|
20
22
|
export interface OperatorEditorButton {
|
|
21
23
|
functionName: string;
|
|
@@ -202,6 +202,9 @@ export function BaseEditorInput(props) {
|
|
|
202
202
|
// clone the class instance to still keep the prototype methods
|
|
203
203
|
return Object.assign(Object.create(Object.getPrototypeOf(firstRowNode)), firstRowNode);
|
|
204
204
|
}, []);
|
|
205
|
+
const scopeColumnId = useMemo(() => {
|
|
206
|
+
return props.api.columnScopeApi.getAnyColumnIdForScope(props.columnScope);
|
|
207
|
+
}, [props.columnScope]);
|
|
205
208
|
try {
|
|
206
209
|
// explicitly parsing & evaluating the expression because we need full control of the resulted AST
|
|
207
210
|
const expr = parser.parse(props.value || '');
|
|
@@ -218,6 +221,7 @@ export function BaseEditorInput(props) {
|
|
|
218
221
|
functions: expressionFunctions,
|
|
219
222
|
evaluateCustomQueryVariable: props.api.internalApi.getQueryLanguageService().evaluateCustomQueryVariable,
|
|
220
223
|
dataChangedEvent,
|
|
224
|
+
columnScope: scopeColumnId,
|
|
221
225
|
...props.api.internalApi.buildBaseContext(),
|
|
222
226
|
});
|
|
223
227
|
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { AdaptableApi } from '../../Api/AdaptableApi';
|
|
3
3
|
import { AdaptableModule } from '../../AdaptableState/Common/Types';
|
|
4
|
+
import { ColumnScope } from '../../AdaptableState/Common/ColumnScope';
|
|
4
5
|
interface EditorInputProps {
|
|
5
6
|
type: 'boolean' | 'scalar' | 'aggregatedScalar' | 'cumulativeAggregatedScalar' | 'quantileAggregatedScalar';
|
|
6
7
|
module: AdaptableModule;
|
|
7
8
|
value: string;
|
|
8
9
|
onChange: (value: string) => void;
|
|
10
|
+
api: AdaptableApi;
|
|
9
11
|
testData: any;
|
|
10
12
|
isFullExpression?: boolean;
|
|
11
|
-
|
|
13
|
+
columnScope?: ColumnScope;
|
|
12
14
|
}
|
|
13
15
|
declare function EditorInput(props: EditorInputProps): React.JSX.Element;
|
|
14
16
|
export default EditorInput;
|
|
@@ -38,15 +38,26 @@ function EditorInput(props) {
|
|
|
38
38
|
}, {});
|
|
39
39
|
};
|
|
40
40
|
const expressionFunctions = useMemo(() => {
|
|
41
|
-
|
|
41
|
+
if (props.type === 'aggregatedScalar' ||
|
|
42
42
|
props.type === 'cumulativeAggregatedScalar' ||
|
|
43
|
-
props.type === 'quantileAggregatedScalar'
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
43
|
+
props.type === 'quantileAggregatedScalar') {
|
|
44
|
+
return getFilteredAggregatedExpressionFunctions(moduleExpressionFunctions.aggregatedScalarFunctions, props.type);
|
|
45
|
+
}
|
|
46
|
+
let booleanAndScalarFunctions = {
|
|
47
|
+
...moduleExpressionFunctions.booleanFunctions,
|
|
48
|
+
...moduleExpressionFunctions.scalarFunctions,
|
|
49
|
+
};
|
|
50
|
+
if (!props.columnScope) {
|
|
51
|
+
// filter out $SCOPE function if no columnScope is provided
|
|
52
|
+
booleanAndScalarFunctions = Object.keys(booleanAndScalarFunctions)
|
|
53
|
+
.filter((key) => key !== '$SCOPE')
|
|
54
|
+
.reduce((obj, key) => {
|
|
55
|
+
obj[key] = booleanAndScalarFunctions[key];
|
|
56
|
+
return obj;
|
|
57
|
+
}, {});
|
|
58
|
+
}
|
|
59
|
+
return booleanAndScalarFunctions;
|
|
60
|
+
}, [props.type, props.columnScope]);
|
|
50
61
|
const { setSelectedFunction } = useExpressionEditor();
|
|
51
62
|
let queryName;
|
|
52
63
|
switch (props.type) {
|
|
@@ -74,6 +85,6 @@ function EditorInput(props) {
|
|
|
74
85
|
? editorButtonsQuantileAggregatedScalar
|
|
75
86
|
: editorButtonsSearch, testData: props.testData, isFullExpression: props.isFullExpression, hideResultPreview: props.type === 'aggregatedScalar' ||
|
|
76
87
|
props.type === 'cumulativeAggregatedScalar' ||
|
|
77
|
-
props.type === 'quantileAggregatedScalar', api: props.api }));
|
|
88
|
+
props.type === 'quantileAggregatedScalar', api: props.api, columnScope: props.columnScope }));
|
|
78
89
|
}
|
|
79
90
|
export default EditorInput;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { AdaptableColumnDataType, AdaptableModule, BooleanFunctionName } from '../../../types';
|
|
2
|
+
import { AdaptableColumnDataType, AdaptableModule, BooleanFunctionName, ColumnScope } from '../../../types';
|
|
3
3
|
interface QueryBuilderProps {
|
|
4
4
|
query: string;
|
|
5
5
|
getColumns: (type?: AdaptableColumnDataType) => {
|
|
@@ -14,6 +14,7 @@ interface QueryBuilderProps {
|
|
|
14
14
|
}[];
|
|
15
15
|
onChange: (query: string) => void;
|
|
16
16
|
module: AdaptableModule;
|
|
17
|
+
columnScope?: ColumnScope;
|
|
17
18
|
}
|
|
18
19
|
export declare function useQueryBuilderContext(): {
|
|
19
20
|
getColumns: QueryBuilderProps["getColumns"];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { DragDropProvider } from '../../dnd';
|
|
3
3
|
import { mapExpressionToQlPredicate, } from '../../../parser/src/predicate';
|
|
4
4
|
import { mapQlPredicateToExpression } from '../../../parser/src/predicate/mapQlPredicateToExpression';
|
|
5
5
|
import { useAdaptable } from '../../../View/AdaptableContext';
|
|
@@ -9,7 +9,7 @@ import Panel from '../../Panel';
|
|
|
9
9
|
import SimpleButton from '../../SimpleButton';
|
|
10
10
|
import { WarningBox } from '../../WarningBox';
|
|
11
11
|
import { QueryPredicateBuilder } from './QueryPredicateBuilder';
|
|
12
|
-
import { getFunctionsForColumnType, getUnsuportedExpressionFromQlPredicate
|
|
12
|
+
import { getFunctionsForColumnType, getUnsuportedExpressionFromQlPredicate } from './utils';
|
|
13
13
|
import { Box, Flex } from '../../Flex';
|
|
14
14
|
const QUERY_BUILDER_CLASSNAME = 'ab-QueryBuilder';
|
|
15
15
|
const QueryBuilderContext = React.createContext(null);
|
|
@@ -86,7 +86,6 @@ export const QueryBuilder = (props) => {
|
|
|
86
86
|
}
|
|
87
87
|
else if (qlPredicate && !('errorMessage' in qlPredicate)) {
|
|
88
88
|
errorOrEditor = (React.createElement(QueryPredicateBuilder, { isRoot: true, index: 0, id: "0", predicate: qlPredicate, onNewPredicate: (type) => {
|
|
89
|
-
// add to its children
|
|
90
89
|
const newPredicate = {
|
|
91
90
|
operator: type === 'filter' ? undefined : 'AND',
|
|
92
91
|
args: [],
|
|
@@ -99,15 +98,7 @@ export const QueryBuilder = (props) => {
|
|
|
99
98
|
handleQlPredicateChange(predicate);
|
|
100
99
|
} }));
|
|
101
100
|
}
|
|
102
|
-
return (React.createElement(
|
|
103
|
-
if (!result.destination) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
const toPath = `${result.destination.droppableId}/${result.destination.index}`;
|
|
107
|
-
const fromPath = result.draggableId;
|
|
108
|
-
const predicate = reorder(qlPredicate, fromPath, toPath);
|
|
109
|
-
handleQlPredicateChange(predicate);
|
|
110
|
-
} },
|
|
101
|
+
return (React.createElement(DragDropProvider, null,
|
|
111
102
|
React.createElement(QueryBuilderContext.Provider, { value: context },
|
|
112
103
|
React.createElement(Box, { className: QUERY_BUILDER_CLASSNAME },
|
|
113
104
|
React.createElement(HelpBlock, { "data-name": "query-builder-help", className: "twa:my-2 twa:p-2 twa:text-3" }, "Build the Grid Filter by adding Column Conditions and AND / OR Groups as required"),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { defaultDragProxyMove, DragList } from '../../dnd';
|
|
3
3
|
import { isArgumentColumnOrField, isQlLogicalOperator, } from '../../../parser/src/predicate';
|
|
4
4
|
import { mapColumnDataTypeToExpressionFunctionType } from '../../../Utilities/adaptableQlUtils';
|
|
5
5
|
import { booleanExpressionFunctions } from '../../../Utilities/ExpressionFunctions/booleanExpressionFunctions';
|
|
@@ -11,6 +11,7 @@ import SimpleButton from '../../SimpleButton';
|
|
|
11
11
|
import { CombinatorSelector, ExpressionSelector, PrimitiveValueInput, PrimitiveColumnOrFieldSelector, PrimitiveMultiValueInput, } from './QueryBuilderInputs';
|
|
12
12
|
import { getOperatorMatchingInputs as getFunctionMatchingInputTypes, mapExpressionToFieldValue, } from './utils';
|
|
13
13
|
import { Box, Flex } from '../../Flex';
|
|
14
|
+
import clsx from 'clsx';
|
|
14
15
|
const ITEM_HEIGHT = 40;
|
|
15
16
|
const BASE_CLASS_NAME = 'ab-QueryBuilder-predicate-editor';
|
|
16
17
|
const Handle = (props) => (React.createElement(Flex, { className: `${BASE_CLASS_NAME}__handle twa:mr-1`, style: { height: ITEM_HEIGHT }, alignItems: "center", ...props },
|
|
@@ -35,8 +36,12 @@ const LogicalFunctionEditor = (props) => {
|
|
|
35
36
|
${props.lastChild ? `${BASE_CLASS_NAME}--last-child` : ''}
|
|
36
37
|
${props.isRoot ? `${BASE_CLASS_NAME}--root` : `${BASE_CLASS_NAME}--child`}
|
|
37
38
|
`;
|
|
38
|
-
const
|
|
39
|
-
|
|
39
|
+
const handleDrop = (sortedIndexes) => {
|
|
40
|
+
const newArgs = sortedIndexes.map((i) => props.predicate.args[i]);
|
|
41
|
+
props.onChange({ ...props.predicate, args: newArgs });
|
|
42
|
+
};
|
|
43
|
+
const getCombinatorEl = (handleProps) => (React.createElement(DragList, { dragListId: props.id, orientation: "vertical", onDrop: handleDrop, onDragProxyMove: defaultDragProxyMove }, (listDomProps) => {
|
|
44
|
+
return (React.createElement("div", { ...listDomProps, className: clsx(listDomProps.className) },
|
|
40
45
|
React.createElement(Flex, null,
|
|
41
46
|
props.isRoot ? null : React.createElement(Handle, { ...handleProps }),
|
|
42
47
|
React.createElement(Flex, { className: "twa:flex-1", alignItems: "center", height: ITEM_HEIGHT },
|
|
@@ -94,21 +99,18 @@ const LogicalFunctionEditor = (props) => {
|
|
|
94
99
|
});
|
|
95
100
|
} }));
|
|
96
101
|
}),
|
|
97
|
-
provided.placeholder,
|
|
98
102
|
React.createElement("div", { className: `${BASE_CLASS_NAME}__root-actions` },
|
|
99
103
|
React.createElement(QueryPredicateButtons, { ...props, hideDelete: true })))));
|
|
100
104
|
}));
|
|
101
105
|
if (props.isRoot) {
|
|
102
|
-
return getCombinatorEl({ className
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
return (React.createElement(Draggable, { key: props.id, draggableId: props.id, index: props.index }, (provided, snapshot) => {
|
|
106
|
-
return (React.createElement("div", { ...provided.draggableProps, ref: provided.innerRef, className: className }, getCombinatorEl(provided.dragHandleProps)));
|
|
107
|
-
}));
|
|
106
|
+
return getCombinatorEl({ className });
|
|
108
107
|
}
|
|
108
|
+
return (React.createElement(DragList.DraggableItem, { id: props.id }, (itemDomProps) => {
|
|
109
|
+
const { onPointerDown, ...restDomProps } = itemDomProps;
|
|
110
|
+
return (React.createElement("div", { ...restDomProps, className: clsx(className, restDomProps.className) }, getCombinatorEl({ onPointerDown })));
|
|
111
|
+
}));
|
|
109
112
|
};
|
|
110
113
|
const PrimitiveFunctionEditor = (props) => {
|
|
111
|
-
// [handle] [column] [operator-dropdown] [...args] [delete-button] [plus-button]
|
|
112
114
|
const adaptable = useAdaptable();
|
|
113
115
|
const [columnOrFieldExpression, ...restOfArgs] = props.predicate.args;
|
|
114
116
|
const columnOrField = columnOrFieldExpression;
|
|
@@ -116,15 +118,12 @@ const PrimitiveFunctionEditor = (props) => {
|
|
|
116
118
|
let columnOrFieldDataType = null;
|
|
117
119
|
let columnInputDataType = null;
|
|
118
120
|
let functionInputInputDataTypes = null;
|
|
119
|
-
// Thsese are the type of inputs ommiting the column
|
|
120
|
-
// [[column-data-type], number, number]
|
|
121
121
|
let restOfFunctionInputDataTypes = [];
|
|
122
122
|
if (columnOrField) {
|
|
123
123
|
if (!isArgumentColumnOrField(columnOrField)) {
|
|
124
124
|
return React.createElement(ErrorBox, null, "Expression must start with a column or a filed!");
|
|
125
125
|
}
|
|
126
126
|
if (columnOrField.includes('FIELD')) {
|
|
127
|
-
// we let the full expression so we can difirienciate between column and field
|
|
128
127
|
columnOrFieldId = columnOrField;
|
|
129
128
|
const fieldValue = mapExpressionToFieldValue(columnOrField);
|
|
130
129
|
columnOrFieldDataType = adaptable.api.expressionApi.internalApi.getFieldType(fieldValue);
|
|
@@ -141,9 +140,10 @@ const PrimitiveFunctionEditor = (props) => {
|
|
|
141
140
|
: [];
|
|
142
141
|
}
|
|
143
142
|
const level = props.id.split('/').length - 1;
|
|
144
|
-
return (React.createElement(
|
|
145
|
-
|
|
146
|
-
|
|
143
|
+
return (React.createElement(DragList.DraggableItem, { id: props.id }, (itemDomProps) => {
|
|
144
|
+
const { onPointerDown, ...restDomProps } = itemDomProps;
|
|
145
|
+
return (React.createElement(Flex, { ...restDomProps, className: clsx(`twa:pb-2 ${BASE_CLASS_NAME} ${BASE_CLASS_NAME}-level-${level} ${BASE_CLASS_NAME}-primitive ${props.lastChild ? `${BASE_CLASS_NAME}--last-child` : ''}`, restDomProps.className), style: { minHeight: ITEM_HEIGHT } },
|
|
146
|
+
React.createElement(Handle, { onPointerDown: onPointerDown }),
|
|
147
147
|
React.createElement(Flex, { alignItems: "center", style: { height: ITEM_HEIGHT } },
|
|
148
148
|
React.createElement(Box, { className: "twa:mr-2" },
|
|
149
149
|
React.createElement(PrimitiveColumnOrFieldSelector, { onChange: (colOrField) => {
|
|
@@ -161,7 +161,6 @@ const PrimitiveFunctionEditor = (props) => {
|
|
|
161
161
|
props.onChange({
|
|
162
162
|
...props.predicate,
|
|
163
163
|
operator,
|
|
164
|
-
// discard arguments
|
|
165
164
|
args,
|
|
166
165
|
});
|
|
167
166
|
}, value: props.predicate.operator })),
|
|
@@ -182,7 +181,6 @@ const PrimitiveFunctionEditor = (props) => {
|
|
|
182
181
|
}
|
|
183
182
|
return (React.createElement(PrimitiveValueInput, { ...commonProps, key: key, value: restOfArgs[index] ?? null, onChange: (value) => {
|
|
184
183
|
const args = [...props.predicate.args];
|
|
185
|
-
// +1 because col is the first argument
|
|
186
184
|
args[index + 1] = value;
|
|
187
185
|
props.onChange({
|
|
188
186
|
...props.predicate,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { AdaptableApi, AdaptableColumn, AdaptableField, AdaptableModule, NamedQuery } from '../../types';
|
|
2
|
+
import { AdaptableApi, AdaptableColumn, AdaptableField, AdaptableModule, ColumnScope, NamedQuery } from '../../types';
|
|
3
3
|
export type ExpressionEditorType = 'boolean' | 'scalar' | 'observable' | 'aggregatedBoolean' | 'aggregatedScalar' | 'cumulativeAggregatedScalar' | 'quantileAggregatedScalar';
|
|
4
4
|
interface ExpressionEditorProps {
|
|
5
5
|
value: string;
|
|
@@ -19,6 +19,7 @@ interface ExpressionEditorProps {
|
|
|
19
19
|
api: AdaptableApi;
|
|
20
20
|
showQueryBuilder?: boolean;
|
|
21
21
|
showExpressionEditor?: boolean;
|
|
22
|
+
columnScope?: ColumnScope;
|
|
22
23
|
}
|
|
23
24
|
export declare const baseClassName = "ab-ExpressionEditor";
|
|
24
25
|
export declare function ExpressionEditor(props: ExpressionEditorProps): React.JSX.Element;
|
|
@@ -35,7 +35,7 @@ export function ExpressionEditor(props) {
|
|
|
35
35
|
// 'boolean','scalar','aggregatedScalar'/'cumulativeAggregatedScalar'/'quantileAggregatedScalar'
|
|
36
36
|
(React.createElement(
|
|
37
37
|
EditorInput,
|
|
38
|
-
{ type: type, module: module, value: props.value, onChange: (value) => {
|
|
38
|
+
{ type: type, module: module, columnScope: props.columnScope, value: props.value, onChange: (value) => {
|
|
39
39
|
setExpressionText(value);
|
|
40
40
|
props.onChange(value);
|
|
41
41
|
}, testData: props.initialData, isFullExpression: props.isFullExpression, api: props.api }
|