xmlui 0.10.14 → 0.10.16
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/dist/lib/{index-779mp2Bm.mjs → index-D4RYJasT.mjs} +2952 -937
- package/dist/lib/index.css +1 -1
- package/dist/lib/{initMock-CAXdczCj.mjs → initMock-qzTZlH-6.mjs} +1 -1
- package/dist/lib/language-server-web-worker.mjs +1 -1
- package/dist/lib/language-server.mjs +1 -1
- package/dist/lib/{metadata-utils-D90qqMGc.mjs → metadata-utils-CtY0QcvH.mjs} +2 -1
- package/dist/lib/{server-common-lmBDLpUh.mjs → server-common-Cine5nRR.mjs} +1 -1
- package/dist/lib/xmlui-parser.d.ts +1 -1
- package/dist/lib/xmlui.d.ts +87 -11
- package/dist/lib/xmlui.mjs +72 -37
- package/dist/metadata/{collectedComponentMetadata-7DFXlw-J.mjs → collectedComponentMetadata-BQaefK3f.mjs} +3189 -1242
- package/dist/metadata/{initMock-AFWEftc6.mjs → initMock-Cz6QssI3.mjs} +1 -1
- package/dist/metadata/style.css +1 -1
- package/dist/metadata/xmlui-metadata.mjs +1 -1
- package/dist/metadata/xmlui-metadata.umd.js +3 -3
- package/dist/scripts/package.json +2 -3
- package/dist/scripts/src/components/Animation/AnimationNative.js +5 -1
- package/dist/scripts/src/components/AppState/AppState.js +32 -2
- package/dist/scripts/src/components/AppState/AppStateNative.js +27 -3
- package/dist/scripts/src/components/AutoComplete/AutoComplete.js +1 -5
- package/dist/scripts/src/components/AutoComplete/AutoCompleteContext.js +2 -0
- package/dist/scripts/src/components/AutoComplete/AutoCompleteNative.js +263 -82
- package/dist/scripts/src/components/Button/Button.js +5 -1
- package/dist/scripts/src/components/Charts/PieChart/PieChartNative.js +41 -2
- package/dist/scripts/src/components/DropdownMenu/DropdownMenuNative.js +7 -9
- package/dist/scripts/src/components/Form/FormNative.js +33 -25
- package/dist/scripts/src/components/FormItem/ItemWithLabel.js +3 -3
- package/dist/scripts/src/components/Icon/IconNative.js +18 -15
- package/dist/scripts/src/components/NavGroup/NavGroup.spec.js +182 -123
- package/dist/scripts/src/components/NavGroup/NavGroupNative.js +14 -6
- package/dist/scripts/src/components/NestedApp/AppWithCodeViewNative.js +1 -1
- package/dist/scripts/src/components/NumberBox/NumberBox.js +4 -4
- package/dist/scripts/src/components/NumberBox/NumberBox.spec.js +112 -423
- package/dist/scripts/src/components/NumberBox/NumberBoxNative.js +18 -4
- package/dist/scripts/src/components/Option/Option.js +3 -1
- package/dist/scripts/src/components/Select/HiddenOption.js +1 -1
- package/dist/scripts/src/components/SelectionStore/SelectionStoreNative.js +3 -1
- package/dist/scripts/src/components/Slider/Slider.spec.js +46 -13
- package/dist/scripts/src/components/Slider/SliderNative.js +19 -9
- package/dist/scripts/src/components/Table/Table.js +7 -1
- package/dist/scripts/src/components/Table/TableNative.js +4 -1
- package/dist/scripts/src/components/Table/useRowSelection.js +215 -1
- package/dist/scripts/src/components/TextBox/TextBox.js +1 -5
- package/dist/scripts/src/components/TextBox/TextBox.spec.js +368 -324
- package/dist/scripts/src/components/TextBox/TextBoxNative.js +10 -15
- package/dist/scripts/src/components/Theme/ThemeNative.js +2 -6
- package/dist/scripts/src/components/TimeInput/TimeInput.js +1 -5
- package/dist/scripts/src/components/TimeInput/TimeInputNative.js +2 -9
- package/dist/scripts/src/components/Tree/Tree-dynamic.spec.js +2894 -0
- package/dist/scripts/src/components/Tree/Tree.spec.js +2932 -0
- package/dist/scripts/src/components/Tree/TreeComponent.js +266 -10
- package/dist/scripts/src/components/Tree/TreeNative.js +1048 -23
- package/dist/scripts/src/components/Tree/testData.js +272 -0
- package/dist/scripts/src/components-core/ApiBoundComponent.js +38 -24
- package/dist/scripts/src/components-core/RestApiProxy.js +0 -1
- package/dist/scripts/src/components-core/behaviors/BehaviorContext.js +54 -0
- package/dist/scripts/src/components-core/behaviors/CoreBehaviors.js +81 -0
- package/dist/scripts/src/components-core/descriptorHelper.js +1 -0
- package/dist/scripts/src/components-core/parts.js +4 -1
- package/dist/scripts/src/components-core/rendering/AppRoot.js +2 -1
- package/dist/scripts/src/components-core/rendering/ComponentAdapter.js +32 -48
- package/dist/scripts/src/components-core/rendering/nodeUtils.js +6 -0
- package/dist/scripts/src/components-core/theming/layout-resolver.js +2 -0
- package/dist/scripts/src/components-core/utils/treeUtils.js +187 -12
- package/dist/scripts/src/index.js +38 -1
- package/dist/scripts/src/testing/ComponentDrivers.js +77 -31
- package/dist/scripts/src/testing/drivers/NumberBoxDriver.js +44 -0
- package/dist/scripts/src/testing/drivers/TextBoxDriver.js +20 -0
- package/dist/scripts/src/testing/drivers/TreeDriver.js +13 -0
- package/dist/scripts/src/testing/fixtures.js +40 -9
- package/dist/standalone/xmlui-standalone.es.d.ts +158 -15
- package/dist/standalone/xmlui-standalone.umd.js +36 -36
- package/package.json +2 -3
- package/dist/scripts/src/components/Animation/Animation.js +0 -50
|
@@ -53,6 +53,7 @@ const lodash_es_1 = require("lodash-es");
|
|
|
53
53
|
const react_compose_refs_1 = require("@radix-ui/react-compose-refs");
|
|
54
54
|
const extractParam_1 = require("../utils/extractParam");
|
|
55
55
|
const ThemeContext_1 = require("../theming/ThemeContext");
|
|
56
|
+
const StyleContext_1 = require("../theming/StyleContext");
|
|
56
57
|
const mergeProps_1 = require("../utils/mergeProps");
|
|
57
58
|
const ComponentDecorator_1 = __importDefault(require("../ComponentDecorator"));
|
|
58
59
|
const valueExtractor_1 = require("../rendering/valueExtractor");
|
|
@@ -68,9 +69,7 @@ const event_handlers_1 = require("../event-handlers");
|
|
|
68
69
|
const UnknownComponent_1 = __importDefault(require("./UnknownComponent"));
|
|
69
70
|
const InvalidComponent_1 = __importDefault(require("./InvalidComponent"));
|
|
70
71
|
const layout_resolver_1 = require("../theming/layout-resolver");
|
|
71
|
-
const
|
|
72
|
-
const StyleContext_1 = require("../theming/StyleContext");
|
|
73
|
-
const AnimationNative_1 = require("../../components/Animation/AnimationNative");
|
|
72
|
+
const BehaviorContext_1 = require("../behaviors/BehaviorContext");
|
|
74
73
|
/**
|
|
75
74
|
* This component's primary responsibility is to transform a particular component definition
|
|
76
75
|
* into its React representation using the current rendering context.
|
|
@@ -176,39 +175,32 @@ const ComponentAdapter = (0, react_1.forwardRef)(function ComponentAdapter(_a, r
|
|
|
176
175
|
// });
|
|
177
176
|
}, [appContext.mediaSize, layoutContextRef, safeNode.props, valueExtractor]);
|
|
178
177
|
// const className = useComponentStyle(cssProps);
|
|
179
|
-
// --- Check if the component has a tooltip property
|
|
180
|
-
const tooltipText = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.tooltip, true); }, [safeNode.props, valueExtractor]);
|
|
181
|
-
// --- Check if the component has a tooltip property
|
|
182
|
-
const tooltipMarkdown = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.tooltipMarkdown, true); }, [safeNode.props, valueExtractor]);
|
|
183
|
-
const tooltipOptions = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.tooltipOptions, true); }, [safeNode.props, valueExtractor]);
|
|
184
|
-
const animation = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.animation, true); }, [safeNode.props, valueExtractor]);
|
|
185
|
-
const animationOptions = (0, react_1.useMemo)(() => { var _a; return valueExtractor((_a = safeNode.props) === null || _a === void 0 ? void 0 : _a.animationOptions, true); }, [safeNode.props, valueExtractor]);
|
|
186
178
|
// --- As compileLayout generates new cssProps and nonCssProps objects every time, we need to
|
|
187
179
|
// --- memoize them using shallow comparison to avoid unnecessary re-renders.
|
|
188
180
|
const stableLayoutCss = (0, hooks_1.useShallowCompareMemoize)(cssProps);
|
|
189
181
|
const className = (0, StyleContext_1.useComponentStyle)(stableLayoutCss);
|
|
190
182
|
const { inspectId, refreshInspection } = (0, InspectorContext_1.useInspector)(safeNode, uid);
|
|
183
|
+
// --- Assemble the renderer context we pass down the rendering chain
|
|
184
|
+
const rendererContext = {
|
|
185
|
+
node: safeNode,
|
|
186
|
+
state: state[uid] || constants_1.EMPTY_OBJECT,
|
|
187
|
+
updateState: memoedUpdateState,
|
|
188
|
+
appContext,
|
|
189
|
+
extractValue: valueExtractor,
|
|
190
|
+
lookupEventHandler: memoedLookupEventHandler,
|
|
191
|
+
lookupAction: memoedLookupAction,
|
|
192
|
+
lookupSyncCallback: memoedLookupSyncCallback,
|
|
193
|
+
extractResourceUrl,
|
|
194
|
+
renderChild: memoedRenderChild,
|
|
195
|
+
registerComponentApi: memoedRegisterComponentApi,
|
|
196
|
+
className,
|
|
197
|
+
layoutContext: layoutContextRef === null || layoutContextRef === void 0 ? void 0 : layoutContextRef.current,
|
|
198
|
+
uid,
|
|
199
|
+
};
|
|
191
200
|
// --- No special behavior, let's render the component according to its definition.
|
|
192
201
|
let renderedNode = null;
|
|
193
202
|
let renderingError = null;
|
|
194
203
|
try {
|
|
195
|
-
// --- Assemble the renderer context we pass down the rendering chain
|
|
196
|
-
const rendererContext = {
|
|
197
|
-
node: safeNode,
|
|
198
|
-
state: state[uid] || constants_1.EMPTY_OBJECT,
|
|
199
|
-
updateState: memoedUpdateState,
|
|
200
|
-
appContext,
|
|
201
|
-
extractValue: valueExtractor,
|
|
202
|
-
lookupEventHandler: memoedLookupEventHandler,
|
|
203
|
-
lookupAction: memoedLookupAction,
|
|
204
|
-
lookupSyncCallback: memoedLookupSyncCallback,
|
|
205
|
-
extractResourceUrl,
|
|
206
|
-
renderChild: memoedRenderChild,
|
|
207
|
-
registerComponentApi: memoedRegisterComponentApi,
|
|
208
|
-
className,
|
|
209
|
-
layoutContext: layoutContextRef === null || layoutContextRef === void 0 ? void 0 : layoutContextRef.current,
|
|
210
|
-
uid,
|
|
211
|
-
};
|
|
212
204
|
if (safeNode.type === "Slot") {
|
|
213
205
|
// --- Transpose the children from the parent component to the slot in
|
|
214
206
|
// --- the compound component
|
|
@@ -245,6 +237,18 @@ const ComponentAdapter = (0, react_1.forwardRef)(function ComponentAdapter(_a, r
|
|
|
245
237
|
if (isApiBound) {
|
|
246
238
|
return ((0, jsx_runtime_1.jsx)(ApiBoundComponent_1.ApiBoundComponent, { uid: uid, renderChild: memoedRenderChild, node: safeNode, apiBoundEvents: apiBoundEvents, apiBoundProps: apiBoundProps, layoutContextRef: layoutContextRef, parentRendererContext: parentRenderContext }, safeNode.uid));
|
|
247
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
*
|
|
242
|
+
*/
|
|
243
|
+
const { getBehaviors } = (0, BehaviorContext_1.useBehaviors)();
|
|
244
|
+
const behaviors = getBehaviors();
|
|
245
|
+
if (!isCompoundComponent) {
|
|
246
|
+
for (const behavior of behaviors) {
|
|
247
|
+
if (behavior.canAttach(rendererContext.node, descriptor)) {
|
|
248
|
+
renderedNode = behavior.attach(rendererContext, renderedNode);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
248
252
|
// --- The current layout context may suggest to wrap the rendered node.
|
|
249
253
|
if ((_b = layoutContextRef.current) === null || _b === void 0 ? void 0 : _b.wrapChild) {
|
|
250
254
|
renderedNode = layoutContextRef.current.wrapChild(rendererContext, renderedNode, descriptor);
|
|
@@ -280,27 +284,7 @@ const ComponentAdapter = (0, react_1.forwardRef)(function ComponentAdapter(_a, r
|
|
|
280
284
|
? (0, react_1.cloneElement)(renderedNode, null, children)
|
|
281
285
|
: renderedNode;
|
|
282
286
|
}
|
|
283
|
-
|
|
284
|
-
// --- Handle animations and tooltips together
|
|
285
|
-
if (animation && (tooltipMarkdown || tooltipText)) {
|
|
286
|
-
const parsedOptions = (0, TooltipNative_1.parseTooltipOptions)(tooltipOptions);
|
|
287
|
-
const parsedAnimationOptions = (0, AnimationNative_1.parseAnimationOptions)(animationOptions);
|
|
288
|
-
return ((0, jsx_runtime_1.jsx)(TooltipNative_1.Tooltip, Object.assign({ text: tooltipText, markdown: tooltipMarkdown }, parsedOptions, { children: (0, jsx_runtime_1.jsx)(AnimationNative_1.Animation, Object.assign({ animation: (0, AnimationNative_1.parseAnimation)(animation) }, parsedAnimationOptions, { children: node })) })));
|
|
289
|
-
}
|
|
290
|
-
// --- Handle animation
|
|
291
|
-
if (animation) {
|
|
292
|
-
const parsedAnimationOptions = (0, AnimationNative_1.parseAnimationOptions)(animationOptions);
|
|
293
|
-
return ((0, jsx_runtime_1.jsx)(AnimationNative_1.Animation, Object.assign({ animation: (0, AnimationNative_1.parseAnimation)(animation) }, parsedAnimationOptions, { children: node })));
|
|
294
|
-
}
|
|
295
|
-
// --- Handle tooltip
|
|
296
|
-
if (tooltipMarkdown || tooltipText) {
|
|
297
|
-
const parsedOptions = (0, TooltipNative_1.parseTooltipOptions)(tooltipOptions);
|
|
298
|
-
return ((0, jsx_runtime_1.jsx)(TooltipNative_1.Tooltip, Object.assign({ text: tooltipText, markdown: tooltipMarkdown }, parsedOptions, { children: node })));
|
|
299
|
-
}
|
|
300
|
-
// --- No wrappers needed
|
|
301
|
-
return node;
|
|
302
|
-
};
|
|
303
|
-
return applyWrappers(nodeToRender);
|
|
287
|
+
return nodeToRender;
|
|
304
288
|
});
|
|
305
289
|
/**
|
|
306
290
|
* This function renders the content of a slot. If the slot is named, it looks for a template
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasRenderableChildren = hasRenderableChildren;
|
|
4
|
+
function hasRenderableChildren(children) {
|
|
5
|
+
return !!(children === null || children === void 0 ? void 0 : children.some((child) => (child === null || child === void 0 ? void 0 : child.type) !== "Slot"));
|
|
6
|
+
}
|
|
@@ -144,6 +144,7 @@ function resolveLayoutProps(layoutProps = constants_1.EMPTY_OBJECT, layoutContex
|
|
|
144
144
|
collectCss("zoom");
|
|
145
145
|
collectCss("cursor");
|
|
146
146
|
collectCss("whiteSpace");
|
|
147
|
+
collectCss("transform");
|
|
147
148
|
// --- Outline
|
|
148
149
|
collectCss("outline");
|
|
149
150
|
collectCss("outlineWidth");
|
|
@@ -375,6 +376,7 @@ const layoutPatterns = {
|
|
|
375
376
|
textDecorationStyle: [],
|
|
376
377
|
textDecorationThickness: [],
|
|
377
378
|
textUnderlineOffset: [],
|
|
379
|
+
transform: [],
|
|
378
380
|
// --- Outline
|
|
379
381
|
outline: [],
|
|
380
382
|
outlineWidth: [],
|
|
@@ -4,21 +4,34 @@ exports.flattenNode = flattenNode;
|
|
|
4
4
|
exports.toFlatTree = toFlatTree;
|
|
5
5
|
exports.walkTree = walkTree;
|
|
6
6
|
exports.unPackTree = unPackTree;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
exports.flatToNative = flatToNative;
|
|
8
|
+
exports.hierarchyToNative = hierarchyToNative;
|
|
9
|
+
function flattenNode(node, depth, result, openedIds, dynamicField, nodeStates) {
|
|
10
|
+
const { children, key } = node;
|
|
11
|
+
const isExpanded = openedIds.includes(key);
|
|
12
|
+
// Check if node has actual children OR is a dynamic node that can load children
|
|
13
|
+
const hasActualChildren = !!children && children.length > 0;
|
|
14
|
+
const isDynamic = dynamicField && node[dynamicField];
|
|
15
|
+
const hasChildren = hasActualChildren || isDynamic;
|
|
16
|
+
// Get loading state for this node
|
|
17
|
+
const loadingState = (nodeStates === null || nodeStates === void 0 ? void 0 : nodeStates.get(key)) || 'unloaded';
|
|
18
|
+
const flatNode = Object.assign(Object.assign({}, node), { hasChildren,
|
|
19
|
+
depth,
|
|
20
|
+
isExpanded,
|
|
21
|
+
loadingState,
|
|
22
|
+
// Ensure key is preserved (in case it was overwritten by ...node spread)
|
|
23
|
+
key: key || node.key || node.id });
|
|
24
|
+
result.push(flatNode);
|
|
12
25
|
if (isExpanded && children) {
|
|
13
26
|
for (let child of children) {
|
|
14
|
-
flattenNode(child, depth + 1, result, openedIds);
|
|
27
|
+
flattenNode(child, depth + 1, result, openedIds, dynamicField, nodeStates);
|
|
15
28
|
}
|
|
16
29
|
}
|
|
17
30
|
}
|
|
18
|
-
function toFlatTree(treeData, openedIds) {
|
|
31
|
+
function toFlatTree(treeData, openedIds, dynamicField, nodeStates) {
|
|
19
32
|
const ret = [];
|
|
20
33
|
treeData.forEach((node) => {
|
|
21
|
-
flattenNode(node, 0, ret, openedIds);
|
|
34
|
+
flattenNode(node, 0, ret, openedIds, dynamicField, nodeStates);
|
|
22
35
|
});
|
|
23
36
|
return ret;
|
|
24
37
|
}
|
|
@@ -33,12 +46,12 @@ function unPackTree(items = [], parentIds = [], parentPath = []) {
|
|
|
33
46
|
let treeItemsById = {};
|
|
34
47
|
items.forEach((item, index) => {
|
|
35
48
|
const path = [...parentPath, index];
|
|
36
|
-
const
|
|
37
|
-
const childTree = unPackTree(item.children, [...parentIds,
|
|
38
|
-
const treeItem = Object.assign(Object.assign({}, item), {
|
|
49
|
+
const id = item.id || item.cid;
|
|
50
|
+
const childTree = unPackTree(item.children, [...parentIds, id], path);
|
|
51
|
+
const treeItem = Object.assign(Object.assign({}, item), { id: id, key: id, parentIds,
|
|
39
52
|
path, children: childTree.treeData, selectable: item.selectable });
|
|
40
53
|
treeData.push(treeItem);
|
|
41
|
-
treeItemsById[
|
|
54
|
+
treeItemsById[id] = treeItem;
|
|
42
55
|
treeItemsById = Object.assign(Object.assign({}, treeItemsById), childTree.treeItemsById);
|
|
43
56
|
});
|
|
44
57
|
return {
|
|
@@ -46,3 +59,165 @@ function unPackTree(items = [], parentIds = [], parentPath = []) {
|
|
|
46
59
|
treeItemsById,
|
|
47
60
|
};
|
|
48
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Transforms flat array data with parent-child relationships into UnPackedTreeData format
|
|
64
|
+
* @param flatData Array of flat objects with id and parentId relationships
|
|
65
|
+
* @param fieldConfig Configuration for mapping object fields to tree properties
|
|
66
|
+
* @returns UnPackedTreeData structure suitable for Tree component
|
|
67
|
+
*/
|
|
68
|
+
function flatToNative(flatData, fieldConfig) {
|
|
69
|
+
if (!flatData || flatData.length === 0) {
|
|
70
|
+
return { treeData: [], treeItemsById: {} };
|
|
71
|
+
}
|
|
72
|
+
// Build parent-to-children map for efficient lookup
|
|
73
|
+
const childrenMap = new Map();
|
|
74
|
+
const itemsById = new Map();
|
|
75
|
+
const rootItems = [];
|
|
76
|
+
// First pass: organize items and build relationships
|
|
77
|
+
flatData.forEach(item => {
|
|
78
|
+
const id = item[fieldConfig.idField];
|
|
79
|
+
const parentId = item[fieldConfig.parentField || 'parentId'];
|
|
80
|
+
// Store item for lookup
|
|
81
|
+
itemsById.set(id, item);
|
|
82
|
+
if (parentId && parentId !== '') {
|
|
83
|
+
// Has parent - add to children map
|
|
84
|
+
if (!childrenMap.has(parentId)) {
|
|
85
|
+
childrenMap.set(parentId, []);
|
|
86
|
+
}
|
|
87
|
+
childrenMap.get(parentId).push(item);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Root item
|
|
91
|
+
rootItems.push(item);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Generate unique IDs for internal tree structure
|
|
95
|
+
let idCounter = 1;
|
|
96
|
+
const sourceIdToId = new Map();
|
|
97
|
+
const getOrCreateId = (sourceId) => {
|
|
98
|
+
if (!sourceIdToId.has(sourceId)) {
|
|
99
|
+
sourceIdToId.set(sourceId, `flat_${idCounter++}`);
|
|
100
|
+
}
|
|
101
|
+
return sourceIdToId.get(sourceId);
|
|
102
|
+
};
|
|
103
|
+
// Recursive function to build TreeNode structure
|
|
104
|
+
const buildTreeNode = (item, parentIds = [], pathSegments = []) => {
|
|
105
|
+
var _a;
|
|
106
|
+
const sourceId = item[fieldConfig.idField];
|
|
107
|
+
const id = getOrCreateId(sourceId);
|
|
108
|
+
const displayName = item[fieldConfig.labelField] || sourceId;
|
|
109
|
+
const currentPath = [...pathSegments, displayName];
|
|
110
|
+
// Get children for this item
|
|
111
|
+
const childItems = childrenMap.get(sourceId) || [];
|
|
112
|
+
const children = childItems.map(childItem => buildTreeNode(childItem, [...parentIds, sourceId], currentPath));
|
|
113
|
+
// Build the TreeNode
|
|
114
|
+
const treeNode = Object.assign(Object.assign(Object.assign(Object.assign({ id, key: sourceId, path: currentPath, displayName,
|
|
115
|
+
parentIds, selectable: fieldConfig.selectableField ? ((_a = item[fieldConfig.selectableField]) !== null && _a !== void 0 ? _a : true) : true, children }, item), (fieldConfig.iconField && item[fieldConfig.iconField] && {
|
|
116
|
+
icon: item[fieldConfig.iconField]
|
|
117
|
+
})), (fieldConfig.iconExpandedField && item[fieldConfig.iconExpandedField] && {
|
|
118
|
+
iconExpanded: item[fieldConfig.iconExpandedField]
|
|
119
|
+
})), (fieldConfig.iconCollapsedField && item[fieldConfig.iconCollapsedField] && {
|
|
120
|
+
iconCollapsed: item[fieldConfig.iconCollapsedField]
|
|
121
|
+
}));
|
|
122
|
+
return treeNode;
|
|
123
|
+
};
|
|
124
|
+
// Build tree structure from root items
|
|
125
|
+
const treeData = rootItems.map(rootItem => buildTreeNode(rootItem));
|
|
126
|
+
// Build lookup map by ID
|
|
127
|
+
const treeItemsById = {};
|
|
128
|
+
const collectNodes = (nodes) => {
|
|
129
|
+
nodes.forEach(node => {
|
|
130
|
+
treeItemsById[node.id] = node;
|
|
131
|
+
if (node.children) {
|
|
132
|
+
collectNodes(node.children);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
collectNodes(treeData);
|
|
137
|
+
return {
|
|
138
|
+
treeData,
|
|
139
|
+
treeItemsById,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Transforms hierarchical nested object data into UnPackedTreeData format
|
|
144
|
+
* @param hierarchyData Single object or array of objects with nested children structure
|
|
145
|
+
* @param fieldConfig Configuration for mapping object fields to tree properties
|
|
146
|
+
* @returns UnPackedTreeData structure suitable for Tree component
|
|
147
|
+
*/
|
|
148
|
+
function hierarchyToNative(hierarchyData, fieldConfig) {
|
|
149
|
+
if (!hierarchyData) {
|
|
150
|
+
return { treeData: [], treeItemsById: {} };
|
|
151
|
+
}
|
|
152
|
+
// Ensure we're working with an array
|
|
153
|
+
const rootItems = Array.isArray(hierarchyData) ? hierarchyData : [hierarchyData];
|
|
154
|
+
if (rootItems.length === 0) {
|
|
155
|
+
return { treeData: [], treeItemsById: {} };
|
|
156
|
+
}
|
|
157
|
+
// Generate unique IDs for internal tree structure
|
|
158
|
+
let idCounter = 1;
|
|
159
|
+
const sourceIdToId = new Map();
|
|
160
|
+
const getOrCreateId = (sourceId) => {
|
|
161
|
+
if (!sourceIdToId.has(sourceId)) {
|
|
162
|
+
sourceIdToId.set(sourceId, `hierarchy_${idCounter++}`);
|
|
163
|
+
}
|
|
164
|
+
return sourceIdToId.get(sourceId);
|
|
165
|
+
};
|
|
166
|
+
// Set to track visited nodes for circular reference detection
|
|
167
|
+
const visitedIds = new Set();
|
|
168
|
+
// Recursive function to build TreeNode structure from hierarchical data
|
|
169
|
+
const buildTreeNode = (item, parentIds = [], pathSegments = []) => {
|
|
170
|
+
var _a, _b;
|
|
171
|
+
const sourceId = item[fieldConfig.idField];
|
|
172
|
+
const displayName = item[fieldConfig.labelField] || sourceId;
|
|
173
|
+
// Circular reference detection
|
|
174
|
+
if (visitedIds.has(sourceId)) {
|
|
175
|
+
// Return a simple node without children to break the cycle
|
|
176
|
+
const id = getOrCreateId(sourceId);
|
|
177
|
+
return Object.assign(Object.assign({ id, key: sourceId, path: [...pathSegments, displayName], displayName,
|
|
178
|
+
parentIds, selectable: fieldConfig.selectableField ? ((_a = item[fieldConfig.selectableField]) !== null && _a !== void 0 ? _a : true) : true, children: [] }, item), (fieldConfig.iconField && item[fieldConfig.iconField] && {
|
|
179
|
+
icon: item[fieldConfig.iconField]
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
// Mark as visited
|
|
183
|
+
visitedIds.add(sourceId);
|
|
184
|
+
const id = getOrCreateId(sourceId);
|
|
185
|
+
const currentPath = [...pathSegments, displayName];
|
|
186
|
+
// Get children from the specified children field
|
|
187
|
+
const childrenField = fieldConfig.childrenField || 'children';
|
|
188
|
+
const childItems = item[childrenField] || [];
|
|
189
|
+
// Recursively build children
|
|
190
|
+
const children = childItems.map((childItem) => buildTreeNode(childItem, [...parentIds, sourceId], currentPath));
|
|
191
|
+
// Unmark as visited after processing (for depth-first traversal)
|
|
192
|
+
visitedIds.delete(sourceId);
|
|
193
|
+
// Build the TreeNode
|
|
194
|
+
const treeNode = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ id, path: currentPath, displayName,
|
|
195
|
+
parentIds, selectable: fieldConfig.selectableField ? ((_b = item[fieldConfig.selectableField]) !== null && _b !== void 0 ? _b : true) : true }, item), (fieldConfig.iconField && item[fieldConfig.iconField] && {
|
|
196
|
+
icon: item[fieldConfig.iconField]
|
|
197
|
+
})), (fieldConfig.iconExpandedField && item[fieldConfig.iconExpandedField] && {
|
|
198
|
+
iconExpanded: item[fieldConfig.iconExpandedField]
|
|
199
|
+
})), (fieldConfig.iconCollapsedField && item[fieldConfig.iconCollapsedField] && {
|
|
200
|
+
iconCollapsed: item[fieldConfig.iconCollapsedField]
|
|
201
|
+
})), {
|
|
202
|
+
// Set TreeNode-specific properties AFTER spreading item to ensure they're not overwritten
|
|
203
|
+
children, key: sourceId });
|
|
204
|
+
return treeNode;
|
|
205
|
+
};
|
|
206
|
+
// Build tree structure from root items
|
|
207
|
+
const treeData = rootItems.map(rootItem => buildTreeNode(rootItem));
|
|
208
|
+
// Build lookup map by ID
|
|
209
|
+
const treeItemsById = {};
|
|
210
|
+
const collectNodes = (nodes) => {
|
|
211
|
+
nodes.forEach(node => {
|
|
212
|
+
treeItemsById[node.id] = node;
|
|
213
|
+
if (node.children) {
|
|
214
|
+
collectNodes(node.children);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
collectNodes(treeData);
|
|
219
|
+
return {
|
|
220
|
+
treeData,
|
|
221
|
+
treeItemsById,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
@@ -36,7 +36,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
39
|
+
exports.Splitter = exports.Button = exports.Stack = exports.Icon = exports.ErrorBoundary = exports.AppRoot = exports.useTheme = exports.startApp = exports.parseScssVar = exports.dValueApi = exports.dValue = exports.dValidationStatus = exports.dTriggerTemplate = exports.dSetValueApi = exports.dStartText = exports.dStartIcon = exports.dRequired = exports.dReadonly = exports.dPlaceholder = exports.dOrientation = exports.dMulti = exports.dMaxLength = exports.dLostFocus = exports.dLabelWidth = exports.dLabelPosition = exports.dLabelBreak = exports.dLabel = exports.dInternal = exports.dInitialValue = exports.dIndeterminate = exports.dGotFocus = exports.dExpand = exports.dExpanded = exports.dEndText = exports.dEndIcon = exports.dFocus = exports.dEnabled = exports.dDidOpen = exports.dDidClose = exports.dDidChange = exports.dCollapse = exports.dClick = exports.dAutoFocus = exports.dComponent = exports.d = exports.createMetadata = exports.createUserDefinedComponentRenderer = exports.createComponentRenderer = exports.StandaloneExtensionManager = exports.StandaloneApp = void 0;
|
|
40
|
+
exports.Theme = exports.StandaloneComponent = exports.useEvent = exports.StyleRegistry = exports.StyleProvider = exports.useAppLayoutContext = exports.useSearchContextContent = exports.Breakout = exports.Logo = exports.ToneChangerButton = exports.LinkNative = exports.VisuallyHidden = exports.NestedApp = exports.TextBox = exports.Text = exports.XmlUiHelper = exports.builtInThemes = exports.useThemes = exports.Spinner = exports.ApiInterceptorProvider = exports.xmlUiMarkupToComponent = exports.errReportComponent = exports.useLogger = exports.useDevTools = exports.toCssVar = exports.useColors = exports.Tabs = exports.TabItem = exports.getColor = void 0;
|
|
40
41
|
const StandaloneApp_1 = __importStar(require("./components-core/StandaloneApp"));
|
|
41
42
|
exports.StandaloneApp = StandaloneApp_1.default;
|
|
42
43
|
Object.defineProperty(exports, "startApp", { enumerable: true, get: function () { return StandaloneApp_1.startApp; } });
|
|
@@ -103,6 +104,8 @@ const ToneChangerButton_1 = require("./components/ToneChangerButton/ToneChangerB
|
|
|
103
104
|
Object.defineProperty(exports, "ToneChangerButton", { enumerable: true, get: function () { return ToneChangerButton_1.ToneChangerButton; } });
|
|
104
105
|
const LogoNative_1 = require("./components/Logo/LogoNative");
|
|
105
106
|
Object.defineProperty(exports, "Logo", { enumerable: true, get: function () { return LogoNative_1.Logo; } });
|
|
107
|
+
const ThemeNative_1 = require("./components/Theme/ThemeNative");
|
|
108
|
+
Object.defineProperty(exports, "Theme", { enumerable: true, get: function () { return ThemeNative_1.Theme; } });
|
|
106
109
|
const SearchContext_1 = require("./components/App/SearchContext");
|
|
107
110
|
Object.defineProperty(exports, "useSearchContextContent", { enumerable: true, get: function () { return SearchContext_1.useSearchContextContent; } });
|
|
108
111
|
const AppLayoutContext_1 = require("./components/App/AppLayoutContext");
|
|
@@ -117,5 +120,39 @@ const metadata_helpers_1 = require("./components/metadata-helpers");
|
|
|
117
120
|
Object.defineProperty(exports, "createMetadata", { enumerable: true, get: function () { return metadata_helpers_1.createMetadata; } });
|
|
118
121
|
Object.defineProperty(exports, "d", { enumerable: true, get: function () { return metadata_helpers_1.d; } });
|
|
119
122
|
Object.defineProperty(exports, "dComponent", { enumerable: true, get: function () { return metadata_helpers_1.dComponent; } });
|
|
123
|
+
Object.defineProperty(exports, "dAutoFocus", { enumerable: true, get: function () { return metadata_helpers_1.dAutoFocus; } });
|
|
124
|
+
Object.defineProperty(exports, "dClick", { enumerable: true, get: function () { return metadata_helpers_1.dClick; } });
|
|
125
|
+
Object.defineProperty(exports, "dCollapse", { enumerable: true, get: function () { return metadata_helpers_1.dCollapse; } });
|
|
126
|
+
Object.defineProperty(exports, "dDidChange", { enumerable: true, get: function () { return metadata_helpers_1.dDidChange; } });
|
|
127
|
+
Object.defineProperty(exports, "dDidClose", { enumerable: true, get: function () { return metadata_helpers_1.dDidClose; } });
|
|
128
|
+
Object.defineProperty(exports, "dDidOpen", { enumerable: true, get: function () { return metadata_helpers_1.dDidOpen; } });
|
|
129
|
+
Object.defineProperty(exports, "dEnabled", { enumerable: true, get: function () { return metadata_helpers_1.dEnabled; } });
|
|
130
|
+
Object.defineProperty(exports, "dFocus", { enumerable: true, get: function () { return metadata_helpers_1.dFocus; } });
|
|
131
|
+
Object.defineProperty(exports, "dEndIcon", { enumerable: true, get: function () { return metadata_helpers_1.dEndIcon; } });
|
|
132
|
+
Object.defineProperty(exports, "dEndText", { enumerable: true, get: function () { return metadata_helpers_1.dEndText; } });
|
|
133
|
+
Object.defineProperty(exports, "dExpanded", { enumerable: true, get: function () { return metadata_helpers_1.dExpanded; } });
|
|
134
|
+
Object.defineProperty(exports, "dExpand", { enumerable: true, get: function () { return metadata_helpers_1.dExpand; } });
|
|
135
|
+
Object.defineProperty(exports, "dGotFocus", { enumerable: true, get: function () { return metadata_helpers_1.dGotFocus; } });
|
|
136
|
+
Object.defineProperty(exports, "dIndeterminate", { enumerable: true, get: function () { return metadata_helpers_1.dIndeterminate; } });
|
|
137
|
+
Object.defineProperty(exports, "dInitialValue", { enumerable: true, get: function () { return metadata_helpers_1.dInitialValue; } });
|
|
138
|
+
Object.defineProperty(exports, "dInternal", { enumerable: true, get: function () { return metadata_helpers_1.dInternal; } });
|
|
139
|
+
Object.defineProperty(exports, "dLabel", { enumerable: true, get: function () { return metadata_helpers_1.dLabel; } });
|
|
140
|
+
Object.defineProperty(exports, "dLabelBreak", { enumerable: true, get: function () { return metadata_helpers_1.dLabelBreak; } });
|
|
141
|
+
Object.defineProperty(exports, "dLabelPosition", { enumerable: true, get: function () { return metadata_helpers_1.dLabelPosition; } });
|
|
142
|
+
Object.defineProperty(exports, "dLabelWidth", { enumerable: true, get: function () { return metadata_helpers_1.dLabelWidth; } });
|
|
143
|
+
Object.defineProperty(exports, "dLostFocus", { enumerable: true, get: function () { return metadata_helpers_1.dLostFocus; } });
|
|
144
|
+
Object.defineProperty(exports, "dMaxLength", { enumerable: true, get: function () { return metadata_helpers_1.dMaxLength; } });
|
|
145
|
+
Object.defineProperty(exports, "dMulti", { enumerable: true, get: function () { return metadata_helpers_1.dMulti; } });
|
|
146
|
+
Object.defineProperty(exports, "dOrientation", { enumerable: true, get: function () { return metadata_helpers_1.dOrientation; } });
|
|
147
|
+
Object.defineProperty(exports, "dPlaceholder", { enumerable: true, get: function () { return metadata_helpers_1.dPlaceholder; } });
|
|
148
|
+
Object.defineProperty(exports, "dReadonly", { enumerable: true, get: function () { return metadata_helpers_1.dReadonly; } });
|
|
149
|
+
Object.defineProperty(exports, "dRequired", { enumerable: true, get: function () { return metadata_helpers_1.dRequired; } });
|
|
150
|
+
Object.defineProperty(exports, "dStartIcon", { enumerable: true, get: function () { return metadata_helpers_1.dStartIcon; } });
|
|
151
|
+
Object.defineProperty(exports, "dStartText", { enumerable: true, get: function () { return metadata_helpers_1.dStartText; } });
|
|
152
|
+
Object.defineProperty(exports, "dSetValueApi", { enumerable: true, get: function () { return metadata_helpers_1.dSetValueApi; } });
|
|
153
|
+
Object.defineProperty(exports, "dTriggerTemplate", { enumerable: true, get: function () { return metadata_helpers_1.dTriggerTemplate; } });
|
|
154
|
+
Object.defineProperty(exports, "dValidationStatus", { enumerable: true, get: function () { return metadata_helpers_1.dValidationStatus; } });
|
|
155
|
+
Object.defineProperty(exports, "dValue", { enumerable: true, get: function () { return metadata_helpers_1.dValue; } });
|
|
156
|
+
Object.defineProperty(exports, "dValueApi", { enumerable: true, get: function () { return metadata_helpers_1.dValueApi; } });
|
|
120
157
|
const StandaloneComponent_1 = __importDefault(require("./components-core/rendering/StandaloneComponent"));
|
|
121
158
|
exports.StandaloneComponent = StandaloneComponent_1.default;
|
|
@@ -9,8 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.SpinnerDriver = exports.LabelDriver = exports.CheckboxDriver = exports.CodeBlockDriver = exports.HtmlTagDriver = exports.FormItemDriver = exports.OptionDriver = exports.NoResultDriver = exports.BadgeDriver = exports.AppFooterDriver = exports.AppHeaderDriver = exports.AccordionDriver = exports.CardDriver = exports.NavPanelDriver = exports.NavGroupDriver = exports.NavLinkDriver = exports.LinkDriver = exports.VStackDriver = exports.HStackDriver = exports.StackDriver = exports.IconDriver = exports.HeadingDriver = exports.TextDriver = exports.ListDriver = exports.ProgressBarDriver = exports.TextAreaDriver = exports.
|
|
13
|
-
exports.DropdownMenuDriver = void 0;
|
|
12
|
+
exports.SliderDriver = exports.DropdownMenuDriver = exports.SpinnerDriver = exports.LabelDriver = exports.CheckboxDriver = exports.CodeBlockDriver = exports.HtmlTagDriver = exports.FormItemDriver = exports.OptionDriver = exports.NoResultDriver = exports.BadgeDriver = exports.AppFooterDriver = exports.AppHeaderDriver = exports.AccordionDriver = exports.CardDriver = exports.NavPanelDriver = exports.NavGroupDriver = exports.NavLinkDriver = exports.LinkDriver = exports.VStackDriver = exports.HStackDriver = exports.StackDriver = exports.IconDriver = exports.HeadingDriver = exports.TextDriver = exports.ListDriver = exports.ProgressBarDriver = exports.TextAreaDriver = exports.RadioGroupDriver = exports.SelectDriver = exports.AutoCompleteDriver = exports.DatePickerDriver = exports.RangeDriver = exports.ItemsDriver = exports.MarkdownDriver = exports.ValidationDisplayDriver = exports.ValidationSummaryDriver = exports.FormDriver = exports.BackdropDriver = exports.FileUploadDropZoneDriver = exports.FileInputDriver = exports.ExpandableItemDriver = exports.SplitterDriver = exports.AvatarDriver = exports.ContentSeparatorDriver = exports.ButtonDriver = exports.TestStateDriver = exports.InputComponentDriver = exports.ComponentDriver = void 0;
|
|
14
13
|
const component_test_helpers_1 = require("./component-test-helpers");
|
|
15
14
|
class ComponentDriver {
|
|
16
15
|
constructor({ locator, page }) {
|
|
@@ -37,9 +36,21 @@ class ComponentDriver {
|
|
|
37
36
|
get component() {
|
|
38
37
|
return this.locator;
|
|
39
38
|
}
|
|
39
|
+
getByTestId(testId) {
|
|
40
|
+
return this.component.getByTestId(testId).first();
|
|
41
|
+
}
|
|
40
42
|
getByPartName(part) {
|
|
41
43
|
return this.component.locator(`[data-part-id="${part}"]`).first();
|
|
42
44
|
}
|
|
45
|
+
getIcons() {
|
|
46
|
+
return this.component.locator('[data-icon-name="*"]');
|
|
47
|
+
}
|
|
48
|
+
getIconsByName(name) {
|
|
49
|
+
return this.component.locator(`[data-icon-name="${name}"]`);
|
|
50
|
+
}
|
|
51
|
+
getIconByName(name) {
|
|
52
|
+
return this.component.locator(`[data-icon-name="${name}"]`).first();
|
|
53
|
+
}
|
|
43
54
|
/**
|
|
44
55
|
* Gets the html tag name of the final rendered component
|
|
45
56
|
*/
|
|
@@ -440,7 +451,7 @@ class FileUploadDropZoneDriver extends ComponentDriver {
|
|
|
440
451
|
return {
|
|
441
452
|
name,
|
|
442
453
|
mimeType: "text/plain",
|
|
443
|
-
buffer: Buffer.from("test content")
|
|
454
|
+
buffer: Buffer.from("test content"),
|
|
444
455
|
};
|
|
445
456
|
});
|
|
446
457
|
// Set files on the hidden input
|
|
@@ -451,7 +462,7 @@ class FileUploadDropZoneDriver extends ComponentDriver {
|
|
|
451
462
|
const event = new DragEvent("drop", {
|
|
452
463
|
bubbles: true,
|
|
453
464
|
cancelable: true,
|
|
454
|
-
dataTransfer: new DataTransfer()
|
|
465
|
+
dataTransfer: new DataTransfer(),
|
|
455
466
|
});
|
|
456
467
|
// Add files to dataTransfer if needed for component logic
|
|
457
468
|
fileNames.forEach((fileName) => {
|
|
@@ -623,10 +634,6 @@ exports.MarkdownDriver = MarkdownDriver;
|
|
|
623
634
|
class ItemsDriver extends ComponentDriver {
|
|
624
635
|
}
|
|
625
636
|
exports.ItemsDriver = ItemsDriver;
|
|
626
|
-
// --- Slider
|
|
627
|
-
class SliderDriver extends ComponentDriver {
|
|
628
|
-
}
|
|
629
|
-
exports.SliderDriver = SliderDriver;
|
|
630
637
|
// --- Range
|
|
631
638
|
class RangeDriver extends ComponentDriver {
|
|
632
639
|
}
|
|
@@ -736,29 +743,6 @@ exports.SelectDriver = SelectDriver;
|
|
|
736
743
|
class RadioGroupDriver extends ComponentDriver {
|
|
737
744
|
}
|
|
738
745
|
exports.RadioGroupDriver = RadioGroupDriver;
|
|
739
|
-
// --- NumberBox
|
|
740
|
-
class NumberBoxDriver extends ComponentDriver {
|
|
741
|
-
get field() {
|
|
742
|
-
return this.component.locator("input");
|
|
743
|
-
}
|
|
744
|
-
get label() {
|
|
745
|
-
return this.component.locator("label");
|
|
746
|
-
}
|
|
747
|
-
get placeholder() {
|
|
748
|
-
return this.field.getAttribute("placeholder");
|
|
749
|
-
}
|
|
750
|
-
get spinnerUpButton() {
|
|
751
|
-
return this.component.locator("button").and(this.component.locator("[data-spinner='up']"));
|
|
752
|
-
}
|
|
753
|
-
get spinnerDownButton() {
|
|
754
|
-
return this.component.locator("button").and(this.component.locator("[data-spinner='down']"));
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
exports.NumberBoxDriver = NumberBoxDriver;
|
|
758
|
-
// --- TextBox
|
|
759
|
-
class TextBoxDriver extends InputComponentDriver {
|
|
760
|
-
}
|
|
761
|
-
exports.TextBoxDriver = TextBoxDriver;
|
|
762
746
|
// --- TextArea
|
|
763
747
|
class TextAreaDriver extends InputComponentDriver {
|
|
764
748
|
}
|
|
@@ -1353,3 +1337,65 @@ class DropdownMenuDriver extends ComponentDriver {
|
|
|
1353
1337
|
}
|
|
1354
1338
|
}
|
|
1355
1339
|
exports.DropdownMenuDriver = DropdownMenuDriver;
|
|
1340
|
+
// --- Slider
|
|
1341
|
+
class SliderDriver extends ComponentDriver {
|
|
1342
|
+
getActiveThumb() {
|
|
1343
|
+
return __awaiter(this, arguments, void 0, function* (thumbNumber = 0) {
|
|
1344
|
+
const thumbs = this.page.getByRole("slider");
|
|
1345
|
+
const thumbCount = yield thumbs.count();
|
|
1346
|
+
if (thumbCount === 0) {
|
|
1347
|
+
throw new Error("No slider thumb found to drag");
|
|
1348
|
+
}
|
|
1349
|
+
if (thumbNumber < 0) {
|
|
1350
|
+
thumbNumber = 0;
|
|
1351
|
+
}
|
|
1352
|
+
else if (thumbNumber >= thumbCount) {
|
|
1353
|
+
thumbNumber = thumbCount - 1;
|
|
1354
|
+
}
|
|
1355
|
+
return thumbs.nth(thumbNumber);
|
|
1356
|
+
});
|
|
1357
|
+
}
|
|
1358
|
+
dragThumbByMouse(location_1) {
|
|
1359
|
+
return __awaiter(this, arguments, void 0, function* (location, thumbNumber = 0) {
|
|
1360
|
+
const track = this.page.locator("[data-track]");
|
|
1361
|
+
yield track.waitFor({ state: "visible" });
|
|
1362
|
+
const activeThumb = yield this.getActiveThumb(thumbNumber);
|
|
1363
|
+
yield activeThumb.waitFor({ state: "visible" });
|
|
1364
|
+
// Get the thumb's current position for relative movement
|
|
1365
|
+
const thumbBox = yield activeThumb.boundingBox();
|
|
1366
|
+
if (!thumbBox) {
|
|
1367
|
+
throw new Error("Could not get thumb bounding box");
|
|
1368
|
+
}
|
|
1369
|
+
const trackBox = yield track.boundingBox();
|
|
1370
|
+
if (!trackBox) {
|
|
1371
|
+
throw new Error("Could not get track bounding box");
|
|
1372
|
+
}
|
|
1373
|
+
// Calculate target position relative to track
|
|
1374
|
+
let targetX;
|
|
1375
|
+
if (location === "start") {
|
|
1376
|
+
targetX = trackBox.x;
|
|
1377
|
+
}
|
|
1378
|
+
else if (location === "end") {
|
|
1379
|
+
targetX = trackBox.x + trackBox.width;
|
|
1380
|
+
}
|
|
1381
|
+
else { // middle
|
|
1382
|
+
targetX = trackBox.x + trackBox.width / 2;
|
|
1383
|
+
}
|
|
1384
|
+
const targetY = trackBox.y + trackBox.height / 2;
|
|
1385
|
+
yield activeThumb.hover();
|
|
1386
|
+
yield this.page.mouse.down({ button: "left" });
|
|
1387
|
+
yield this.page.mouse.move(targetX, targetY);
|
|
1388
|
+
yield this.page.mouse.up();
|
|
1389
|
+
});
|
|
1390
|
+
}
|
|
1391
|
+
stepThumbByKeyboard(key_1) {
|
|
1392
|
+
return __awaiter(this, arguments, void 0, function* (key, thumbNumber = 0, repeat = 1) {
|
|
1393
|
+
const activeThumb = yield this.getActiveThumb(thumbNumber);
|
|
1394
|
+
yield activeThumb.focus();
|
|
1395
|
+
for (let i = 0; i < repeat; i++) {
|
|
1396
|
+
yield this.page.keyboard.press(key);
|
|
1397
|
+
}
|
|
1398
|
+
});
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
exports.SliderDriver = SliderDriver;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.NumberBoxDriver = void 0;
|
|
13
|
+
const parts_1 = require("../../components-core/parts");
|
|
14
|
+
const ComponentDrivers_1 = require("../ComponentDrivers");
|
|
15
|
+
const PART_SPINNER_UP = "spinnerUp";
|
|
16
|
+
const PART_SPINNER_DOWN = "spinnerDown";
|
|
17
|
+
class NumberBoxDriver extends ComponentDrivers_1.InputComponentDriver {
|
|
18
|
+
get input() {
|
|
19
|
+
return this.getByPartName(parts_1.PART_INPUT);
|
|
20
|
+
}
|
|
21
|
+
get startAdornment() {
|
|
22
|
+
return this.getByPartName(parts_1.PART_START_ADORNMENT);
|
|
23
|
+
}
|
|
24
|
+
get endAdornment() {
|
|
25
|
+
return this.getByPartName(parts_1.PART_END_ADORNMENT);
|
|
26
|
+
}
|
|
27
|
+
get spinnerUp() {
|
|
28
|
+
return this.getByPartName(PART_SPINNER_UP);
|
|
29
|
+
}
|
|
30
|
+
get spinnerDown() {
|
|
31
|
+
return this.getByPartName(PART_SPINNER_DOWN);
|
|
32
|
+
}
|
|
33
|
+
increment() {
|
|
34
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
yield this.spinnerUp.click({ force: true });
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
decrement() {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
yield this.spinnerDown.click({ force: true });
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.NumberBoxDriver = NumberBoxDriver;
|