@adaptabletools/adaptable-cjs 21.0.12 → 21.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/base.css +1811 -2336
- package/base.css.map +1 -1
- package/index.css +1768 -1413
- package/index.css.map +1 -1
- package/package.json +3 -3
- package/src/AdaptableInterfaces/IAdaptable.d.ts +2 -1
- package/src/AdaptableOptions/FilterOptions.d.ts +7 -0
- package/src/AdaptableOptions/PredicateOptions.d.ts +4 -3
- package/src/AdaptableState/Common/AdaptableColumn.d.ts +1 -1
- package/src/AdaptableState/Common/AdaptablePredicate.d.ts +12 -0
- package/src/AdaptableState/Common/AdaptablePredicate.js +132 -18
- package/src/AdaptableState/Selection/GridCell.d.ts +10 -0
- package/src/Api/Implementation/ExportApiImpl.js +1 -7
- package/src/Api/Implementation/PredicateApiImpl.d.ts +3 -1
- package/src/Api/Implementation/PredicateApiImpl.js +27 -3
- package/src/Api/Internal/AdaptableInternalApi.d.ts +2 -1
- package/src/Api/Internal/AdaptableInternalApi.js +6 -0
- package/src/Api/Internal/PredicateInternalApi.d.ts +3 -1
- package/src/Api/Internal/PredicateInternalApi.js +14 -0
- package/src/Api/PredicateApi.d.ts +1 -1
- package/src/Redux/Store/AdaptableStore.js +111 -3
- package/src/Utilities/Helpers/Helper.js +26 -2
- package/src/Utilities/Hooks/index.d.ts +4 -0
- package/src/Utilities/Hooks/index.js +9 -0
- package/src/Utilities/Hooks/useAdaptableColumn.d.ts +2 -0
- package/src/Utilities/Hooks/useAdaptableColumn.js +10 -0
- package/src/Utilities/Hooks/useAdaptableOptions.d.ts +2 -0
- package/src/Utilities/Hooks/useAdaptableOptions.js +9 -0
- package/src/Utilities/Hooks/useAdaptableState.d.ts +3 -0
- package/src/Utilities/Hooks/useAdaptableState.js +43 -0
- package/src/Utilities/Services/ModuleService.js +1 -1
- package/src/Utilities/adaptableQlUtils.js +3 -0
- package/src/View/AdaptableComputedCSSVarsContext.d.ts +12 -0
- package/src/View/AdaptableComputedCSSVarsContext.js +32 -0
- package/src/View/Components/AdaptableInput/AdaptableDateInlineInput.d.ts +1 -1
- package/src/View/Components/ColumnFilter/FloatingFilter.js +5 -1
- package/src/View/Components/ColumnFilter/components/FloatingFilterInputList.js +1 -1
- package/src/View/Components/ColumnFilter/components/FloatingFilterValues.js +34 -9
- package/src/View/Components/FilterForm/ListBoxFilterForm.d.ts +1 -0
- package/src/View/Components/FilterForm/ListBoxFilterForm.js +93 -16
- package/src/View/Layout/Wizard/sections/ColumnsSection.js +1 -1
- package/src/View/renderWithAdaptableContext.js +3 -1
- package/src/agGrid/AdaptableAgGrid.d.ts +3 -1
- package/src/agGrid/AdaptableAgGrid.js +360 -23
- package/src/agGrid/AdaptableFilterHandler.d.ts +3 -1
- package/src/agGrid/AdaptableFilterHandler.js +16 -12
- package/src/agGrid/AgGridAdapter.js +9 -5
- package/src/agGrid/AgGridColumnAdapter.js +14 -12
- package/src/components/OverlayTrigger/index.js +1 -1
- package/src/components/Select/Select.js +21 -21
- package/src/components/Tree/TreeDropdown/index.d.ts +27 -0
- package/src/components/Tree/TreeDropdown/index.js +256 -0
- package/src/components/Tree/TreeList/index.d.ts +25 -0
- package/src/components/Tree/TreeList/index.js +40 -0
- package/src/devTools/DevToolsTracks.d.ts +31 -0
- package/src/devTools/DevToolsTracks.js +34 -0
- package/src/devTools/PerfMarker.d.ts +12 -0
- package/src/devTools/PerfMarker.js +2 -0
- package/src/devTools/index.d.ts +102 -0
- package/src/devTools/index.js +165 -0
- package/src/env.js +2 -2
- package/src/layout-manager/src/index.d.ts +2 -0
- package/src/layout-manager/src/index.js +24 -0
- package/src/metamodel/adaptable.metamodel.d.ts +6 -0
- package/src/metamodel/adaptable.metamodel.js +1 -1
- package/tsconfig.cjs.tsbuildinfo +1 -1
|
@@ -28,7 +28,7 @@ class AgGridAdapter {
|
|
|
28
28
|
const ColumnDefFactory_Prototye_preWireBeans = ColumnDefFactory_Prototype.preWireBeans;
|
|
29
29
|
ColumnDefFactory_Prototype.preWireBeans = function (beans) {
|
|
30
30
|
ColumnDefFactory_Prototye_preWireBeans?.apply(this, arguments);
|
|
31
|
-
const gridId = beans?.context?.
|
|
31
|
+
const gridId = beans?.context?.getId();
|
|
32
32
|
if (!gridId) {
|
|
33
33
|
console.error('CRITICAL: No gridId found in beans, this should never happen!');
|
|
34
34
|
}
|
|
@@ -141,7 +141,8 @@ class AgGridAdapter {
|
|
|
141
141
|
}
|
|
142
142
|
const pivotColumnFilters = self.adaptableApi.filterApi.columnFilterApi
|
|
143
143
|
.getActiveColumnFilters()
|
|
144
|
-
.filter((columnFilter) => self.adaptableApi.columnApi.isPivotResultColumn(columnFilter.ColumnId)
|
|
144
|
+
.filter((columnFilter) => self.adaptableApi.columnApi.isPivotResultColumn(columnFilter.ColumnId) ||
|
|
145
|
+
self.adaptableApi.columnApi.isAutoRowGroupColumnForSingle(columnFilter.ColumnId));
|
|
145
146
|
try {
|
|
146
147
|
if (pivotColumnFilters.length > 0) {
|
|
147
148
|
for (const columnFilter of pivotColumnFilters) {
|
|
@@ -164,7 +165,8 @@ class AgGridAdapter {
|
|
|
164
165
|
agGridColumnFilterService.doFiltersPass = this.DANGER_doFiltersPassMonkeyPatcher;
|
|
165
166
|
this.DANGER_isAggFilterPresentMonkeyPatcher = function () {
|
|
166
167
|
const columnFilters = self.adaptableApi.filterApi.columnFilterApi.getActiveColumnFilters();
|
|
167
|
-
return columnFilters.some((colFilter) => self.adaptableApi.columnApi.isPivotResultColumn(colFilter.ColumnId)
|
|
168
|
+
return columnFilters.some((colFilter) => self.adaptableApi.columnApi.isPivotResultColumn(colFilter.ColumnId) ||
|
|
169
|
+
self.adaptableApi.columnApi.isAutoRowGroupColumnForSingle(colFilter.ColumnId));
|
|
168
170
|
};
|
|
169
171
|
agGridColumnFilterService.isAggFilterPresent = this.DANGER_isAggFilterPresentMonkeyPatcher;
|
|
170
172
|
}
|
|
@@ -488,8 +490,10 @@ class AgGridAdapter {
|
|
|
488
490
|
this.logger.warn(`Column is undefined, returning 'text' for Type`);
|
|
489
491
|
return 'text';
|
|
490
492
|
}
|
|
491
|
-
if (this.adaptableApi.columnApi.isAutoRowGroupColumnForSingle(agColumn.getId())
|
|
492
|
-
|
|
493
|
+
if (this.adaptableApi.columnApi.isAutoRowGroupColumnForSingle(agColumn.getId())) {
|
|
494
|
+
return 'groupColumn';
|
|
495
|
+
}
|
|
496
|
+
if (this.adaptableApi.columnApi.isSelectionColumn(agColumn.getId())) {
|
|
493
497
|
return 'unknown';
|
|
494
498
|
}
|
|
495
499
|
if (this.adaptableApi.columnApi.isAutoRowGroupColumnForMulti(agColumn.getId())) {
|
|
@@ -597,31 +597,33 @@ class AgGridColumnAdapter {
|
|
|
597
597
|
});
|
|
598
598
|
}
|
|
599
599
|
else {
|
|
600
|
+
// TODO only set auto group column as filterable if at least one group columns is filterable
|
|
600
601
|
this.setColDefProperty(col, 'filter', () => {
|
|
601
602
|
return 'agGroupColumnFilter';
|
|
602
603
|
});
|
|
603
604
|
}
|
|
604
|
-
|
|
605
|
+
if (this.adaptableApi.columnApi.isAutoRowGroupColumnForMulti(colId)) {
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
605
608
|
}
|
|
606
609
|
// setup "normal" column filter
|
|
607
610
|
this.setColDefProperty(col, 'filter', (original_filter) => {
|
|
608
|
-
|
|
609
|
-
return;
|
|
610
|
-
}
|
|
611
|
+
const pivotMode = this.adaptableInstance.isInPivotMode();
|
|
611
612
|
if (!useAdaptableFilter) {
|
|
612
613
|
return original_filter;
|
|
613
614
|
}
|
|
614
|
-
if (
|
|
615
|
-
|
|
615
|
+
if (!colDef.filter) {
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
if (typeof original_filter !== 'boolean' &&
|
|
616
619
|
typeof original_filter?.handler !== 'function' &&
|
|
617
|
-
!
|
|
620
|
+
!pivotMode) {
|
|
618
621
|
this.adaptableApi.consoleError(`Column '${colId}' has a custom filter defined in colDef.filter, but Adaptable Filtering accepts only the TRUE/FALSE values!`);
|
|
619
622
|
return false;
|
|
620
623
|
}
|
|
621
624
|
return {
|
|
622
625
|
component: (0, AgGridFilterAdapter_1.AgGridFilterAdapterFactory)(this.adaptableInstance),
|
|
623
|
-
|
|
624
|
-
handler: (params) => new AdaptableFilterHandler_1.AdaptableFilterHandler(this.adaptableApi, columnSetup),
|
|
626
|
+
handler: () => new AdaptableFilterHandler_1.AdaptableFilterHandler(this.adaptableApi, columnSetup),
|
|
625
627
|
};
|
|
626
628
|
});
|
|
627
629
|
}
|
|
@@ -638,7 +640,7 @@ class AgGridColumnAdapter {
|
|
|
638
640
|
!colDef.floatingFilter ||
|
|
639
641
|
!this.adaptableOptions.filterOptions.useAdaptableFiltering ||
|
|
640
642
|
!this.adaptableApi.filterApi.columnFilterApi.isQuickFilterVisible();
|
|
641
|
-
if (this.adaptableApi.columnApi.
|
|
643
|
+
if (this.adaptableApi.columnApi.isAutoRowGroupColumnForMulti(col.getColId())) {
|
|
642
644
|
this.setColDefProperty(col, 'floatingFilter', (original_floatingFilter) => {
|
|
643
645
|
// the floating filter for the group column is "inherited" from the base column
|
|
644
646
|
// via the colDef.filter = 'agGroupColumnFilter'
|
|
@@ -649,7 +651,7 @@ class AgGridColumnAdapter {
|
|
|
649
651
|
});
|
|
650
652
|
this.setColDefProperty(col, 'suppressFloatingFilterButton', () => {
|
|
651
653
|
// hide button for multi column groups
|
|
652
|
-
return
|
|
654
|
+
return true;
|
|
653
655
|
});
|
|
654
656
|
return;
|
|
655
657
|
}
|
|
@@ -659,7 +661,7 @@ class AgGridColumnAdapter {
|
|
|
659
661
|
}
|
|
660
662
|
return (0, AgGridFloatingFilterAdapter_1.AgGridFloatingFilterAdapterFactory)(this.adaptableInstance);
|
|
661
663
|
});
|
|
662
|
-
this.setColDefProperty(col, 'floatingFilter', (
|
|
664
|
+
this.setColDefProperty(col, 'floatingFilter', () => {
|
|
663
665
|
if (isFloatingFilterDisabled) {
|
|
664
666
|
return;
|
|
665
667
|
}
|
|
@@ -200,7 +200,7 @@ const OverlayTrigger = React.forwardRef((givenProps, ref) => {
|
|
|
200
200
|
clearAllOverlays();
|
|
201
201
|
hideOverlay('overlay-trigger');
|
|
202
202
|
}
|
|
203
|
-
} }, props.render({ targetWidth
|
|
203
|
+
} }, props.render({ targetWidth })));
|
|
204
204
|
let preparedConstrainTo;
|
|
205
205
|
if (constrainTo) {
|
|
206
206
|
preparedConstrainTo = (0, exports.getConstrainElement)(targetRef.current, constrainTo);
|
|
@@ -14,7 +14,8 @@ const join_1 = tslib_1.__importDefault(require("../utils/join"));
|
|
|
14
14
|
const re_resizable_1 = require("re-resizable");
|
|
15
15
|
const Tooltip_1 = tslib_1.__importDefault(require("../Tooltip"));
|
|
16
16
|
const OverlayTrigger_1 = require("../OverlayTrigger");
|
|
17
|
-
const
|
|
17
|
+
const CheckBox_1 = require("../CheckBox");
|
|
18
|
+
const AdaptableComputedCSSVarsContext_1 = require("../../View/AdaptableComputedCSSVarsContext");
|
|
18
19
|
const resizableDirections = {
|
|
19
20
|
right: true,
|
|
20
21
|
bottom: true,
|
|
@@ -56,15 +57,27 @@ const INFINITE_COLUMNS_WITH_CHECKBOX = {
|
|
|
56
57
|
renderSelectionCheckBox: (params) => {
|
|
57
58
|
// disable reacting to onChange
|
|
58
59
|
// as we handle selection change in the onCellClick
|
|
59
|
-
return React.createElement(
|
|
60
|
+
return React.createElement(CheckBox_1.CheckBox, { mx: 1, checked: params.rowInfo?.rowSelected ?? false });
|
|
60
61
|
},
|
|
61
62
|
renderHeaderSelectionCheckBox: true,
|
|
62
63
|
className: 'ab-Select-CheckboxColumn',
|
|
63
64
|
renderValue,
|
|
64
65
|
renderHeader: (headerParams) => {
|
|
66
|
+
const selected = headerParams.allRowsSelected
|
|
67
|
+
? true
|
|
68
|
+
: headerParams.someRowsSelected
|
|
69
|
+
? null
|
|
70
|
+
: false;
|
|
71
|
+
const { api } = headerParams;
|
|
65
72
|
return (React.createElement(React.Fragment, null,
|
|
66
|
-
|
|
67
|
-
|
|
73
|
+
React.createElement(CheckBox_1.CheckBox, { mx: 1, checked: selected, onChange: (selected) => {
|
|
74
|
+
if (selected) {
|
|
75
|
+
api.rowSelectionApi.selectAll();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
api.rowSelectionApi.deselectAll();
|
|
79
|
+
}
|
|
80
|
+
} }, headerParams.allRowsSelected ? '(Deselect All)' : '(Select All)')));
|
|
68
81
|
},
|
|
69
82
|
renderMenuIcon: false,
|
|
70
83
|
},
|
|
@@ -106,15 +119,11 @@ const doesOptionMatchValue = function (value) {
|
|
|
106
119
|
};
|
|
107
120
|
const Select = function (props) {
|
|
108
121
|
let maxLabelLength = 0;
|
|
109
|
-
const
|
|
110
|
-
'--ab-cmp-select-menu__max-width': 0,
|
|
111
|
-
'--ab-cmp-select-menu__min-width': 0,
|
|
112
|
-
'--ab-cmp-select-menu__max-height': 0,
|
|
113
|
-
});
|
|
122
|
+
const computedCSSVars = (0, AdaptableComputedCSSVarsContext_1.useAdaptableComputedCSSVars)();
|
|
114
123
|
const CSS_VARS_VALUES = {
|
|
115
|
-
'--ab-cmp-select-menu__max-width':
|
|
116
|
-
'--ab-cmp-select-menu__min-width':
|
|
117
|
-
'--ab-cmp-select-menu__max-height':
|
|
124
|
+
'--ab-cmp-select-menu__max-width': computedCSSVars['--ab-cmp-select-menu__max-width'] || '60vw',
|
|
125
|
+
'--ab-cmp-select-menu__min-width': computedCSSVars['--ab-cmp-select-menu__min-width'] || 150,
|
|
126
|
+
'--ab-cmp-select-menu__max-height': computedCSSVars['--ab-cmp-select-menu__max-height'] || '60vh',
|
|
118
127
|
};
|
|
119
128
|
const searchableInMenulist = props.searchable === 'menulist';
|
|
120
129
|
const searchableInline = props.searchable === 'inline';
|
|
@@ -517,15 +526,6 @@ const Select = function (props) {
|
|
|
517
526
|
props.onInputChange?.(value);
|
|
518
527
|
}, [props.onInputChange, isMulti]);
|
|
519
528
|
return (React.createElement(React.Fragment, null,
|
|
520
|
-
React.createElement(CSSNumericVariableWatch_1.CSSNumericVariableWatch, { varName: "--ab-cmp-select-menu__max-width", onChange: (value) => {
|
|
521
|
-
cssVarsValuesRef.current['--ab-cmp-select-menu__max-width'] = value;
|
|
522
|
-
} }),
|
|
523
|
-
React.createElement(CSSNumericVariableWatch_1.CSSNumericVariableWatch, { varName: "--ab-cmp-select-menu__min-width", onChange: (value) => {
|
|
524
|
-
cssVarsValuesRef.current['--ab-cmp-select-menu__min-width'] = value;
|
|
525
|
-
} }),
|
|
526
|
-
React.createElement(CSSNumericVariableWatch_1.CSSNumericVariableWatch, { varName: "--ab-cmp-select-menu__max-height", onChange: (value) => {
|
|
527
|
-
cssVarsValuesRef.current['--ab-cmp-select-menu__max-height'] = value;
|
|
528
|
-
} }),
|
|
529
529
|
React.createElement(SelectComponent, { ref: ref, openMenuOnClick: searchableInMenulist ? false : undefined, openMenuOnFocus: searchableInMenulist ? false : undefined, menuIsOpen: searchableInMenulist ? isSelectMenuOpen : undefined, isSearchable: searchableInline, "aria-label": props['aria-label'], onKeyDown: props.onKeyDown, inputValue: inputValue, onInputChange: onInputChange, onFocus: onFocus, onBlur: onBlur, onMenuOpen: props.onMenuOpen, isLoading: props.isLoading, options: props.options, className: (0, join_1.default)(props.className, 'ab-Select'), isDisabled: disabled, menuPlacement: props.menuPlacement ?? 'auto', hideSelectedOptions: false, isMulti: isMulti, value: selectedOption, blurInputOnSelect: false, menuPosition: props.menuPosition ?? 'absolute',
|
|
530
530
|
// This needed so the menu is not clipped by overflow: hidden
|
|
531
531
|
menuPortalTarget: (0, OverlayTrigger_1.ensurePortalElement)(), isClearable: props.isClearable, closeMenuOnSelect: props.closeMenuOnSelect, onChange: (option) => {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TreeListItem, TreeListProps } from '../TreeList';
|
|
3
|
+
export type TreeDropdownProps<T extends TreeListItem<any>> = {
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
style?: React.CSSProperties;
|
|
6
|
+
fieldStyle?: React.CSSProperties;
|
|
7
|
+
listSizeConstraints?: {
|
|
8
|
+
minWidth?: number | string;
|
|
9
|
+
maxWidth?: number | string;
|
|
10
|
+
minHeight?: number | string;
|
|
11
|
+
maxHeight?: number | string;
|
|
12
|
+
};
|
|
13
|
+
options: TreeListProps<T>['options'];
|
|
14
|
+
labelField?: string;
|
|
15
|
+
primaryKey?: keyof T;
|
|
16
|
+
value?: any[][] | string[];
|
|
17
|
+
defaultValue?: any[][] | string[];
|
|
18
|
+
toDisplayValue?: (value: any[][] | string[]) => string;
|
|
19
|
+
onChange: (value: any[][] | string[]) => void;
|
|
20
|
+
onMenuOpen?: () => void;
|
|
21
|
+
onMenuClose?: () => void;
|
|
22
|
+
onMouseDown?: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
23
|
+
resizable?: boolean;
|
|
24
|
+
clearable?: boolean;
|
|
25
|
+
};
|
|
26
|
+
export declare function toDisplayValueDefault(value: any[][] | string[]): string;
|
|
27
|
+
export declare function TreeDropdown<T extends TreeListItem<any>>(props: TreeDropdownProps<T>): React.JSX.Element;
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TreeDropdown = exports.toDisplayValueDefault = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const React = tslib_1.__importStar(require("react"));
|
|
6
|
+
const FieldWrap_1 = tslib_1.__importDefault(require("../../FieldWrap"));
|
|
7
|
+
const TreeList_1 = require("../TreeList");
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const OverlayTrigger_1 = tslib_1.__importDefault(require("../../OverlayTrigger"));
|
|
10
|
+
const rebass_1 = require("rebass");
|
|
11
|
+
const NotifyResize_1 = tslib_1.__importDefault(require("../../NotifyResize"));
|
|
12
|
+
const Input_1 = tslib_1.__importDefault(require("../../Input"));
|
|
13
|
+
const InfiniteTable_1 = require("../../InfiniteTable");
|
|
14
|
+
const SimpleButton_1 = tslib_1.__importDefault(require("../../SimpleButton"));
|
|
15
|
+
const CheckBox_1 = require("../../CheckBox");
|
|
16
|
+
const useLatest_1 = require("../../utils/useLatest");
|
|
17
|
+
const re_resizable_1 = require("re-resizable");
|
|
18
|
+
const AdaptableComputedCSSVarsContext_1 = require("../../../View/AdaptableComputedCSSVarsContext");
|
|
19
|
+
const resizableDirections = {
|
|
20
|
+
right: true,
|
|
21
|
+
bottom: true,
|
|
22
|
+
bottomRight: true,
|
|
23
|
+
};
|
|
24
|
+
function toDisplayValueDefault(value) {
|
|
25
|
+
if (!Array.isArray(value)) {
|
|
26
|
+
return `${value}`;
|
|
27
|
+
}
|
|
28
|
+
return value.map((v) => (Array.isArray(v) ? v.join('-') : v)).join(', ');
|
|
29
|
+
}
|
|
30
|
+
exports.toDisplayValueDefault = toDisplayValueDefault;
|
|
31
|
+
const getLabelColumn = (field) => {
|
|
32
|
+
return {
|
|
33
|
+
field,
|
|
34
|
+
defaultFlex: 1,
|
|
35
|
+
renderTreeIcon: true,
|
|
36
|
+
defaultSortable: false,
|
|
37
|
+
resizable: false,
|
|
38
|
+
renderSelectionCheckBox: ({ rowInfo, dataSourceApi, api }) => {
|
|
39
|
+
if (!rowInfo.isTreeNode) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return (React.createElement(CheckBox_1.CheckBox, { mx: 1, checked: rowInfo?.rowSelected, onChange: (checked) => {
|
|
43
|
+
dataSourceApi.treeApi.setNodeSelection(rowInfo.nodePath, checked);
|
|
44
|
+
api.focus();
|
|
45
|
+
} }));
|
|
46
|
+
},
|
|
47
|
+
renderHeader: ({ dataSourceApi, api, allRowsSelected, someRowsSelected }) => {
|
|
48
|
+
const { treeApi } = dataSourceApi;
|
|
49
|
+
const allFirstLevelCollapsed = dataSourceApi
|
|
50
|
+
.getOriginalDataArray()
|
|
51
|
+
.every((item) => !treeApi.isNodeExpanded([item.id]));
|
|
52
|
+
return (React.createElement(rebass_1.Flex, { flexDirection: 'row', alignItems: 'center', width: '100%', onMouseDown: (e) => {
|
|
53
|
+
// so we can keep the focus on the Grid
|
|
54
|
+
e.preventDefault();
|
|
55
|
+
} },
|
|
56
|
+
React.createElement(CheckBox_1.CheckBox, { checked: someRowsSelected && !allRowsSelected ? null : allRowsSelected, mr: 2, onChange: () => {
|
|
57
|
+
if (allRowsSelected) {
|
|
58
|
+
dataSourceApi.treeApi.deselectAll();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
dataSourceApi.treeApi.selectAll();
|
|
62
|
+
}
|
|
63
|
+
api.focus();
|
|
64
|
+
} }),
|
|
65
|
+
React.createElement(rebass_1.Flex, { flex: 1 }),
|
|
66
|
+
React.createElement(SimpleButton_1.default, { label: "toggle-expand-collapse", icon: allFirstLevelCollapsed ? 'expand-all' : 'collapse-all', onMouseDown: () => {
|
|
67
|
+
if (allFirstLevelCollapsed) {
|
|
68
|
+
dataSourceApi.treeApi.expandAll();
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
dataSourceApi.treeApi.collapseAll();
|
|
72
|
+
}
|
|
73
|
+
}, iconPosition: "end" }, allFirstLevelCollapsed ? 'Expand All' : 'Collapse All')));
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
const sizeFull = {
|
|
78
|
+
width: '100%',
|
|
79
|
+
height: '100%',
|
|
80
|
+
};
|
|
81
|
+
function getRowCount(options) {
|
|
82
|
+
return options.reduce((acc, option) => {
|
|
83
|
+
if (Array.isArray(option.children)) {
|
|
84
|
+
return acc + getRowCount(option.children) + 1;
|
|
85
|
+
}
|
|
86
|
+
return acc + 1;
|
|
87
|
+
}, 0);
|
|
88
|
+
}
|
|
89
|
+
function TreeDropdown(props) {
|
|
90
|
+
const [visible, doSetVisible] = (0, react_1.useState)(false);
|
|
91
|
+
const overlayDOMRef = (0, react_1.useRef)(null);
|
|
92
|
+
const getProps = (0, useLatest_1.useLatest)(props);
|
|
93
|
+
const computedCSSVars = (0, AdaptableComputedCSSVarsContext_1.useAdaptableComputedCSSVars)();
|
|
94
|
+
const [treeExpandState, setTreeExpandState] = (0, react_1.useState)(undefined);
|
|
95
|
+
const [searchValue, setSearchValue] = (0, react_1.useState)('');
|
|
96
|
+
const labelField = props.labelField ?? 'label';
|
|
97
|
+
const columns = (0, react_1.useMemo)(() => {
|
|
98
|
+
return {
|
|
99
|
+
label: getLabelColumn(labelField),
|
|
100
|
+
};
|
|
101
|
+
}, [labelField]);
|
|
102
|
+
const [stateValue, setStateValue] = (0, react_1.useState)(props.value !== undefined ? props.value : props.defaultValue || []);
|
|
103
|
+
const onChange = (0, react_1.useCallback)((value) => {
|
|
104
|
+
const paths = value instanceof InfiniteTable_1.TreeSelectionState
|
|
105
|
+
? value.getState().selectedPaths
|
|
106
|
+
: value.selectedPaths || [];
|
|
107
|
+
if (props.value === undefined) {
|
|
108
|
+
setStateValue(paths);
|
|
109
|
+
}
|
|
110
|
+
props.onChange?.(paths);
|
|
111
|
+
}, [props.onChange, props.value]);
|
|
112
|
+
const value = props.value !== undefined ? props.value : stateValue;
|
|
113
|
+
const treeSelection = (0, react_1.useMemo)(() => {
|
|
114
|
+
const selection = {
|
|
115
|
+
defaultSelection: false,
|
|
116
|
+
selectedPaths: value,
|
|
117
|
+
};
|
|
118
|
+
return selection;
|
|
119
|
+
}, [value]);
|
|
120
|
+
const rowCount = (0, react_1.useMemo)(() => {
|
|
121
|
+
return getRowCount(props.options);
|
|
122
|
+
}, [props.options]);
|
|
123
|
+
const [size, setSize] = (0, react_1.useState)({
|
|
124
|
+
width: 0,
|
|
125
|
+
height: rowCount * 35,
|
|
126
|
+
});
|
|
127
|
+
const setHeight = (0, react_1.useCallback)((height) => {
|
|
128
|
+
setSize((s) => {
|
|
129
|
+
return {
|
|
130
|
+
...s,
|
|
131
|
+
height,
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
}, []);
|
|
135
|
+
const setWidth = (0, react_1.useCallback)((width) => {
|
|
136
|
+
setSize((s) => {
|
|
137
|
+
return {
|
|
138
|
+
...s,
|
|
139
|
+
width,
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
}, []);
|
|
143
|
+
const getSize = (0, useLatest_1.useLatest)(size);
|
|
144
|
+
(0, react_1.useEffect)(() => {
|
|
145
|
+
if (!getSize().height) {
|
|
146
|
+
setHeight(rowCount * 35);
|
|
147
|
+
}
|
|
148
|
+
}, [rowCount]);
|
|
149
|
+
const setVisible = (visible) => {
|
|
150
|
+
if (visible) {
|
|
151
|
+
const { onMenuOpen } = getProps();
|
|
152
|
+
if (onMenuOpen) {
|
|
153
|
+
onMenuOpen();
|
|
154
|
+
}
|
|
155
|
+
requestAnimationFrame(() => {
|
|
156
|
+
doSetVisible(visible);
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const { onMenuClose } = getProps();
|
|
161
|
+
if (onMenuClose) {
|
|
162
|
+
onMenuClose();
|
|
163
|
+
}
|
|
164
|
+
doSetVisible(visible);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const [treeListApi, setTreeListApi] = (0, react_1.useState)(null);
|
|
168
|
+
const { listSizeConstraints } = props;
|
|
169
|
+
const nodeMatches = (0, react_1.useCallback)(({ data }) => {
|
|
170
|
+
return !searchValue
|
|
171
|
+
? data
|
|
172
|
+
: `${data[labelField]}`.toLowerCase().includes(searchValue.toLowerCase());
|
|
173
|
+
}, [searchValue]);
|
|
174
|
+
const filterFunction = (0, react_1.useCallback)(({ data, filterTreeNode }) => {
|
|
175
|
+
if (!Array.isArray(data.children)) {
|
|
176
|
+
return nodeMatches({ data });
|
|
177
|
+
}
|
|
178
|
+
// allow non-leaf nodes to match
|
|
179
|
+
if (nodeMatches({ data })) {
|
|
180
|
+
return data;
|
|
181
|
+
}
|
|
182
|
+
return filterTreeNode(data);
|
|
183
|
+
}, [nodeMatches]);
|
|
184
|
+
return (React.createElement(rebass_1.Flex, { flexDirection: 'row', className: "ab-TreeDropdown", style: {
|
|
185
|
+
width: '100%',
|
|
186
|
+
...props.style,
|
|
187
|
+
}, onMouseDown: props.onMouseDown, onBlur: (e) => {
|
|
188
|
+
const { relatedTarget } = e;
|
|
189
|
+
const overlayDOMNode = overlayDOMRef.current;
|
|
190
|
+
if ((overlayDOMNode && relatedTarget == overlayDOMNode) ||
|
|
191
|
+
overlayDOMNode?.contains(relatedTarget)) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
setVisible(false);
|
|
195
|
+
} },
|
|
196
|
+
React.createElement(NotifyResize_1.default, { onResize: (newSize) => {
|
|
197
|
+
setWidth(newSize.width);
|
|
198
|
+
} }),
|
|
199
|
+
React.createElement(OverlayTrigger_1.default, { visible: visible, targetOffset: 20, render: () => {
|
|
200
|
+
const minWidth = listSizeConstraints?.minWidth ||
|
|
201
|
+
computedCSSVars['--ab-cmp-select-menu__min-width'] ||
|
|
202
|
+
240;
|
|
203
|
+
const maxWidth = listSizeConstraints?.maxWidth ||
|
|
204
|
+
computedCSSVars['--ab-cmp-select-menu__max-width'] ||
|
|
205
|
+
'60vw';
|
|
206
|
+
const minHeight = listSizeConstraints?.minHeight || 200;
|
|
207
|
+
const maxHeight = listSizeConstraints?.maxHeight ||
|
|
208
|
+
computedCSSVars['--ab-cmp-select-menu__max-height'] ||
|
|
209
|
+
'50vh';
|
|
210
|
+
const resizable = getProps().resizable;
|
|
211
|
+
const treeList = (React.createElement(TreeList_1.TreeList, { primaryKey: props.primaryKey ?? 'id', treeFilterFunction: filterFunction, columnHeaderHeight: 40, onReady: ({ api }) => {
|
|
212
|
+
setTreeListApi(api);
|
|
213
|
+
api.focus();
|
|
214
|
+
}, defaultTreeExpandState: treeExpandState, onTreeExpandStateChange: setTreeExpandState, columns: columns, options: props.options, treeSelection: treeSelection, onTreeSelectionChange: (0, InfiniteTable_1.withSelectedLeafNodesOnly)(onChange), style: resizable
|
|
215
|
+
? sizeFull
|
|
216
|
+
: {
|
|
217
|
+
width: size.width,
|
|
218
|
+
height: size.height,
|
|
219
|
+
maxWidth,
|
|
220
|
+
minHeight,
|
|
221
|
+
maxHeight,
|
|
222
|
+
minWidth,
|
|
223
|
+
} }));
|
|
224
|
+
let children = (React.createElement(rebass_1.Flex, { flexDirection: 'column', height: '100%' },
|
|
225
|
+
React.createElement(rebass_1.Flex, { backgroundColor: 'defaultbackground', p: 1, alignItems: 'center', justifyContent: 'stretch', justifyItems: 'stretch' },
|
|
226
|
+
React.createElement(Input_1.default, { "data-name": "menulist-search-input", placeholder: "Search...", style: { width: '100%' }, value: searchValue, onChange: (e) => setSearchValue(e.target.value) })),
|
|
227
|
+
treeList));
|
|
228
|
+
if (resizable) {
|
|
229
|
+
const onResizeStop = (_e, _direction, ref) => {
|
|
230
|
+
const newSize = {
|
|
231
|
+
width: ref.style.width,
|
|
232
|
+
height: ref.style.height,
|
|
233
|
+
};
|
|
234
|
+
setSize(newSize);
|
|
235
|
+
};
|
|
236
|
+
children = (React.createElement(re_resizable_1.Resizable, { enable: resizableDirections, minWidth: minWidth, maxWidth: maxWidth, minHeight: minHeight, maxHeight: maxHeight, defaultSize: size, onResizeStop: onResizeStop, onResizeStart: (e) => {
|
|
237
|
+
// in order to prevent focus from being lost
|
|
238
|
+
e.preventDefault();
|
|
239
|
+
} }, children));
|
|
240
|
+
}
|
|
241
|
+
return (React.createElement(rebass_1.Box, { ref: overlayDOMRef, className: "ab-TreeDropdownOverlay", "data-name": "menu-container" }, children));
|
|
242
|
+
} },
|
|
243
|
+
React.createElement(FieldWrap_1.default, { style: { width: '100%', ...props.fieldStyle } },
|
|
244
|
+
React.createElement(Input_1.default, { type: "text", readOnly: true, "data-name": "Select Values", placeholder: props.placeholder ?? 'Select a value', style: {
|
|
245
|
+
width: '100%',
|
|
246
|
+
}, pr: props.clearable ? 0 : undefined, value: props.toDisplayValue ? props.toDisplayValue(value) : toDisplayValueDefault(value), onFocus: () => {
|
|
247
|
+
if (!visible) {
|
|
248
|
+
setVisible(true);
|
|
249
|
+
}
|
|
250
|
+
treeListApi?.focus();
|
|
251
|
+
} }),
|
|
252
|
+
props.clearable && (React.createElement(SimpleButton_1.default, { style: {
|
|
253
|
+
visibility: Array.isArray(value) && value.length > 0 ? 'visible' : 'hidden',
|
|
254
|
+
}, variant: "text", icon: "close", onClick: () => onChange({ selectedPaths: [] }) }))))));
|
|
255
|
+
}
|
|
256
|
+
exports.TreeDropdown = TreeDropdown;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { DataSourcePropOnTreeSelectionChange_MultiNode, InfiniteTableProps, TreeDataSourceProps } from '../../InfiniteTable';
|
|
3
|
+
export type TreeListItem<T = any> = {
|
|
4
|
+
id: string | number;
|
|
5
|
+
label: string;
|
|
6
|
+
children?: TreeListItem<T>[];
|
|
7
|
+
};
|
|
8
|
+
export type TreeListProps<T extends TreeListItem<T>> = {
|
|
9
|
+
options: T[];
|
|
10
|
+
debugId?: string;
|
|
11
|
+
primaryKey?: keyof T;
|
|
12
|
+
domProps?: InfiniteTableProps<T>['domProps'];
|
|
13
|
+
style?: React.CSSProperties;
|
|
14
|
+
rowHeight?: number | string;
|
|
15
|
+
treeSelection?: TreeDataSourceProps<T>['treeSelection'];
|
|
16
|
+
defaultTreeSelection?: TreeDataSourceProps<T>['defaultTreeSelection'];
|
|
17
|
+
onTreeSelectionChange?: DataSourcePropOnTreeSelectionChange_MultiNode;
|
|
18
|
+
defaultTreeExpandState?: TreeDataSourceProps<T>['defaultTreeExpandState'];
|
|
19
|
+
onTreeExpandStateChange?: TreeDataSourceProps<T>['onTreeExpandStateChange'];
|
|
20
|
+
columns?: InfiniteTableProps<T>['columns'];
|
|
21
|
+
columnHeaderHeight?: number | string;
|
|
22
|
+
onReady?: InfiniteTableProps<T>['onReady'];
|
|
23
|
+
treeFilterFunction?: TreeDataSourceProps<T>['treeFilterFunction'];
|
|
24
|
+
};
|
|
25
|
+
export declare function TreeList<T extends TreeListItem<T>>(props: TreeListProps<T>): React.JSX.Element;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TreeList = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const React = tslib_1.__importStar(require("react"));
|
|
6
|
+
const InfiniteTable_1 = require("../../InfiniteTable");
|
|
7
|
+
const rebass_1 = require("rebass");
|
|
8
|
+
const join_1 = tslib_1.__importDefault(require("../../../../../adaptable-react-aggrid/src/utils/join"));
|
|
9
|
+
const columns = {
|
|
10
|
+
label: {
|
|
11
|
+
field: 'label',
|
|
12
|
+
header: 'Label',
|
|
13
|
+
defaultFlex: 1,
|
|
14
|
+
renderTreeIcon: true,
|
|
15
|
+
renderSelectionCheckBox: true,
|
|
16
|
+
defaultSortable: false,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const domProps = {
|
|
20
|
+
style: {
|
|
21
|
+
height: '100%',
|
|
22
|
+
flex: 1,
|
|
23
|
+
},
|
|
24
|
+
className: 'ab-TreeList',
|
|
25
|
+
};
|
|
26
|
+
const DEFAULT_TREE_EXPAND_STATE = {
|
|
27
|
+
expandedPaths: [],
|
|
28
|
+
defaultExpanded: false,
|
|
29
|
+
};
|
|
30
|
+
function TreeList(props) {
|
|
31
|
+
return (React.createElement(rebass_1.Flex, { flex: 1, flexDirection: 'column', className: "ab-TreeList", style: props.style },
|
|
32
|
+
React.createElement(InfiniteTable_1.TreeDataSource, { data: props.options, primaryKey: props.primaryKey ?? 'id', defaultTreeSelection: props.defaultTreeSelection, treeSelection: props.treeSelection, onTreeSelectionChange: props.onTreeSelectionChange, treeFilterFunction: props.treeFilterFunction, onTreeExpandStateChange: props.onTreeExpandStateChange, defaultTreeExpandState: props.defaultTreeExpandState ?? DEFAULT_TREE_EXPAND_STATE },
|
|
33
|
+
React.createElement(InfiniteTable_1.TreeGrid, { defaultActiveRowIndex: 0, onReady: props.onReady, debugId: props.debugId, keyboardSelection: true, rowHeight: props.rowHeight ?? '--ab-grid-row-height', keyboardNavigation: "row", columnHeaderHeight: props.columnHeaderHeight, domProps: {
|
|
34
|
+
...domProps,
|
|
35
|
+
...props.domProps,
|
|
36
|
+
className: (0, join_1.default)(domProps.className, props.domProps?.className),
|
|
37
|
+
style: { ...domProps.style, ...props.domProps?.style },
|
|
38
|
+
}, columns: props.columns ?? columns, showZebraRows: false }))));
|
|
39
|
+
}
|
|
40
|
+
exports.TreeList = TreeList;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const DevToolsTracks: {
|
|
2
|
+
readonly Init: {
|
|
3
|
+
readonly track: "Initialisation";
|
|
4
|
+
readonly labels: {
|
|
5
|
+
readonly Init: "Init";
|
|
6
|
+
readonly InitStore: "Init store";
|
|
7
|
+
readonly LoadStore: "Loading store";
|
|
8
|
+
readonly InitAGGrid: "AG Grid init";
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
readonly LayoutManager: {
|
|
12
|
+
readonly track: "Layout Manager";
|
|
13
|
+
readonly labels: {
|
|
14
|
+
readonly SetLayout: "Setting layout";
|
|
15
|
+
readonly ApplyPivotLayout: "Apply pivot layout";
|
|
16
|
+
readonly ApplyTableLayout: "Apply table layout";
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
readonly Runtime: {
|
|
20
|
+
readonly track: "Runtime";
|
|
21
|
+
readonly labels: {
|
|
22
|
+
readonly SetLayout: "Setting layout";
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
readonly Redux: {
|
|
26
|
+
readonly track: "Redux";
|
|
27
|
+
readonly labels: {
|
|
28
|
+
readonly Action: "Action";
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DevToolsTracks = void 0;
|
|
4
|
+
exports.DevToolsTracks = {
|
|
5
|
+
Init: {
|
|
6
|
+
track: 'Initialisation',
|
|
7
|
+
labels: {
|
|
8
|
+
Init: 'Init',
|
|
9
|
+
InitStore: 'Init store',
|
|
10
|
+
LoadStore: 'Loading store',
|
|
11
|
+
InitAGGrid: 'AG Grid init',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
LayoutManager: {
|
|
15
|
+
track: 'Layout Manager',
|
|
16
|
+
labels: {
|
|
17
|
+
SetLayout: 'Setting layout',
|
|
18
|
+
ApplyPivotLayout: 'Apply pivot layout',
|
|
19
|
+
ApplyTableLayout: 'Apply table layout',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
Runtime: {
|
|
23
|
+
track: 'Runtime',
|
|
24
|
+
labels: {
|
|
25
|
+
SetLayout: 'Setting layout',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
Redux: {
|
|
29
|
+
track: 'Redux',
|
|
30
|
+
labels: {
|
|
31
|
+
Action: 'Action',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type PerfMarkerDetails = {
|
|
2
|
+
name: string;
|
|
3
|
+
value: string | number | boolean;
|
|
4
|
+
}[];
|
|
5
|
+
export interface PerfMarker {
|
|
6
|
+
start(options?: {
|
|
7
|
+
details?: PerfMarkerDetails;
|
|
8
|
+
}): PerfMarker;
|
|
9
|
+
end(options?: {
|
|
10
|
+
details?: PerfMarkerDetails;
|
|
11
|
+
}): PerfMarker;
|
|
12
|
+
}
|