Skip to content

Commit ce35a49

Browse files
committed
feat: add css-class to tree-node
close #845 Signed-off-by: Christian Kotzbauer <christian.kotzbauer@gmail.com>
1 parent 2f487dc commit ce35a49

File tree

8 files changed

+49
-3
lines changed

8 files changed

+49
-3
lines changed

dist/simple-tree-component.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@
276276
lineWrapperDiv.classList.add(constants.classNames.SimpleTreeNodeWrapper);
277277
lineWrapperDiv.addEventListener("mouseover", () => this.hoverNode(node));
278278
lineWrapperDiv.addEventListener("mouseout", () => this.hoverNode(null));
279+
if (node.cssClass) {
280+
lineWrapperDiv.classList.add(node.cssClass);
281+
}
279282
if (hasChildren) {
280283
lineWrapperDiv.classList.add(constants.classNames.SimpleTreeParentNode);
281284
}
@@ -440,6 +443,7 @@
440443
collapsed: false,
441444
hidden: false,
442445
uid: "",
446+
cssClass: "",
443447
};
444448

445449
function isTreeNodeValid(treeNode) {

dist/simple-tree-component.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/types/rects.d.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ export interface Rect {
3636
* @param maxOverlayHeight The maximum height of the overlay. Defaults to `300`.
3737
* @returns The calculated rectangle of the overlay position.
3838
*/
39-
export declare function calculate(elementRect: Rect, availableHeight: number, overlayHeight: number, borderWith?: number, maxOverlayHeight?: number): Rect;
39+
export declare function calculate(
40+
elementRect: Rect,
41+
availableHeight: number,
42+
overlayHeight: number,
43+
borderWith?: number,
44+
maxOverlayHeight?: number
45+
): Rect;
4046
/**
4147
* Calculates the position of the `overlay` relative to the `element` and sets the values accordingly.
4248
* See the docs of the `calculate` function for more details.

dist/types/tree-node.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ export interface InitTreeNode {
2424
* Recursive array of child `TreeNode` objects.
2525
*/
2626
children?: InitTreeNode[];
27+
/**
28+
* Custom css-class added to the line-wrapper element.
29+
* (Default: `""`)
30+
*/
31+
cssClass?: string;
2732
/**
2833
* Any additional property, which is available (the component-logic will respect them).
2934
*/

src/__tests__/ui/ui-component.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,24 @@ describe("simpleTree", () => {
239239
expect(tree.getNode("child2")?.hidden).toBeFalsy();
240240
});
241241

242+
it("should respect custom-node-css-classes.", () => {
243+
const tree = createInstance<"singleSelectDropdown">(singleCtx, "singleSelectDropdown", {
244+
nodes: [
245+
createTreeNode("Node Test 1", "node1"),
246+
createTreeNode("Node Test 2", "node2", [], false, true, "my-class"),
247+
createTreeNode("Node Test 3", "node3"),
248+
],
249+
});
250+
251+
openDropdown(singleCtx, constants.classNames.SimpleTreeSingleSelectBox);
252+
const uid = tree.getNode("node2")?.uid;
253+
const lineWrapper = document
254+
.getElementById(uid as string)
255+
?.querySelector(`.${constants.classNames.SimpleTreeNodeWrapper}`) as HTMLElement;
256+
257+
expect(lineWrapper.classList.contains("my-class")).toBeTruthy();
258+
});
259+
242260
it("should close dropdown on escape.", () => {
243261
createInstance<"singleSelectDropdown">(singleCtx, "singleSelectDropdown", {
244262
nodes: [

src/test-utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,16 @@ export function createTreeNode(
6767
value: string | null | undefined,
6868
children: InitTreeNode[] = [],
6969
selected = false,
70-
selectable = true
70+
selectable = true,
71+
cssClass = ""
7172
): InitTreeNode {
7273
return {
7374
label: label,
7475
value: value as string,
7576
selected,
7677
selectable,
7778
children,
79+
cssClass,
7880
};
7981
}
8082

src/types/tree-node.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ export interface InitTreeNode {
2929
*/
3030
children?: InitTreeNode[];
3131

32+
/**
33+
* Custom css-class added to the line-wrapper element.
34+
* (Default: `""`)
35+
*/
36+
cssClass?: string;
37+
3238
/**
3339
* Any additional property, which is available (the component-logic will respect them).
3440
*/
@@ -84,4 +90,5 @@ export const defaults: TreeNode = {
8490
collapsed: false,
8591
hidden: false,
8692
uid: "",
93+
cssClass: "",
8794
};

src/ui/base-tree.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ export class BaseTree {
154154
lineWrapperDiv.addEventListener("mouseover", () => this.hoverNode(node));
155155
lineWrapperDiv.addEventListener("mouseout", () => this.hoverNode(null));
156156

157+
if (node.cssClass) {
158+
lineWrapperDiv.classList.add(node.cssClass);
159+
}
160+
157161
if (hasChildren) {
158162
lineWrapperDiv.classList.add(constants.classNames.SimpleTreeParentNode);
159163
}

0 commit comments

Comments
 (0)