fds-vue-core 1.3.3 → 1.3.4
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/App.vue.d.ts.map +1 -1
- package/dist/components/FdsTreeView.vue.d.ts +10 -1
- package/dist/components/FdsTreeView.vue.d.ts.map +1 -1
- package/dist/components/fds-tree-view/TreeNode.vue.d.ts.map +1 -1
- package/dist/components/fds-tree-view/useTreeState.d.ts.map +1 -1
- package/dist/fds-vue-core.cjs.js +25 -3
- package/dist/fds-vue-core.cjs.js.map +1 -1
- package/dist/fds-vue-core.es.js +25 -3
- package/dist/fds-vue-core.es.js.map +1 -1
- package/package.json +1 -1
package/dist/App.vue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.vue.d.ts","sourceRoot":"","sources":["../src/App.vue"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"App.vue.d.ts","sourceRoot":"","sources":["../src/App.vue"],"names":[],"mappings":";AAkVA,wBACG"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types';
|
|
2
|
+
type NodeShape = Pick<TreeNodeType, 'nodeId' | 'title' | 'data' | 'children'>;
|
|
2
3
|
type WrapperProps<T = Record<string, unknown>> = Omit<TreeViewProps<T>, 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'> & {
|
|
3
4
|
data: TreeNodeType<T>;
|
|
5
|
+
selected?: NodeShape[];
|
|
4
6
|
};
|
|
5
7
|
type __VLS_Props = WrapperProps<Record<string, unknown>>;
|
|
6
|
-
declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
9
|
+
selectedNodeObjects: import("vue").ComputedRef<NodeShape[]>;
|
|
10
|
+
selectedNodes: import("vue").Reactive<Set<string>>;
|
|
11
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
12
|
+
"update:selectedNodes": (value: NodeShape[]) => any;
|
|
13
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
|
+
"onUpdate:selectedNodes"?: (value: NodeShape[]) => any;
|
|
15
|
+
}>, {
|
|
7
16
|
expandChildrenOnParentCheck: boolean;
|
|
8
17
|
expandAllChildrenOnParentCheck: boolean;
|
|
9
18
|
showIndeterminateOnlyOnChildrenSelection: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FdsTreeView.vue.d.ts","sourceRoot":"","sources":["../../src/components/FdsTreeView.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FdsTreeView.vue.d.ts","sourceRoot":"","sources":["../../src/components/FdsTreeView.vue"],"names":[],"mappings":"AAqHA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAEpF,KAAK,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC,CAAA;AAE7E,KAAK,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CACnD,aAAa,CAAC,CAAC,CAAC,EAChB,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAChD,GAAG;IACF,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAA;CACvB,CAAA;AAED,KAAK,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;AAiMzD,wBAKG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeNode.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fds-tree-view/TreeNode.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TreeNode.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fds-tree-view/TreeNode.vue"],"names":[],"mappings":"AAmTA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5C,KAAK,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAA;AAE1D,KAAK,WAAW,GAAG,KAAK,CAAC;;;;;;;;;;;;;;;;;AAulBzB,wBAGG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTreeState.d.ts","sourceRoot":"","sources":["../../../src/components/fds-tree-view/useTreeState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAgB,MAAM,SAAS,CAAA;AAE5E,UAAU,gBAAgB;IACxB,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,8BAA8B,CAAC,EAAE,OAAO,CAAA;IACxC,wCAAwC,CAAC,EAAE,OAAO,CAAA;IAClD,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB;AAED,QAAA,MAAM,YAAY,GAAI,UAAS,gBAAqB;;;2BAiDpB,MAAM;uCAgFM,QAAQ;mCAaZ,MAAM;2BAzBd,MAAM;8BAjDH,QAAQ;;yBAxBb,MAAM;yBAyUzB,aAAa,QACd,MAAM,iBACG,MAAM,EAAE,KACtB,aAAa;0BAlCa,MAAM,cAAc,MAAM,gBAAgB,MAAM;6BA/R7C,QAAQ;6BAhBR,MAAM;iCAwNF,aAAa,iBAAiB,MAAM,KAAG,OAAO;sCAmCzC,MAAM,KAAG,OAAO;6BAhQzB,MAAM;yCAsKM,MAAM,KAAG,OAAO;6CAWZ,MAAM,KAAG,OAAO;0BA2MnC,MAAM,GAAG,SAAS,QAAQ,MAAM,GAAG,SAAS,KAAG,MAAM;;8BAhVjD,QAAQ;;;0BAkUZ,MAAM;+BArED,MAAM;+BAhCN,MAAM,UAAU,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mCA7ElD,MAAM,KAAG,OAAO;uCA1HZ,MAAM;;
|
|
1
|
+
{"version":3,"file":"useTreeState.d.ts","sourceRoot":"","sources":["../../../src/components/fds-tree-view/useTreeState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAgB,MAAM,SAAS,CAAA;AAE5E,UAAU,gBAAgB;IACxB,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,8BAA8B,CAAC,EAAE,OAAO,CAAA;IACxC,wCAAwC,CAAC,EAAE,OAAO,CAAA;IAClD,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB;AAED,QAAA,MAAM,YAAY,GAAI,UAAS,gBAAqB;;;2BAiDpB,MAAM;uCAgFM,QAAQ;mCAaZ,MAAM;2BAzBd,MAAM;8BAjDH,QAAQ;;yBAxBb,MAAM;yBAyUzB,aAAa,QACd,MAAM,iBACG,MAAM,EAAE,KACtB,aAAa;0BAlCa,MAAM,cAAc,MAAM,gBAAgB,MAAM;6BA/R7C,QAAQ;6BAhBR,MAAM;iCAwNF,aAAa,iBAAiB,MAAM,KAAG,OAAO;sCAmCzC,MAAM,KAAG,OAAO;6BAhQzB,MAAM;yCAsKM,MAAM,KAAG,OAAO;6CAWZ,MAAM,KAAG,OAAO;0BA2MnC,MAAM,GAAG,SAAS,QAAQ,MAAM,GAAG,SAAS,KAAG,MAAM;;8BAhVjD,QAAQ;;;0BAkUZ,MAAM;+BArED,MAAM;+BAhCN,MAAM,UAAU,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mCA7ElD,MAAM,KAAG,OAAO;uCA1HZ,MAAM;;CAqWjD,CAAA;AAED,eAAe,YAAY,CAAA"}
|
package/dist/fds-vue-core.cjs.js
CHANGED
|
@@ -332,7 +332,6 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
332
332
|
const props = __props;
|
|
333
333
|
const injectedTreeState = vue.inject("treeState", null);
|
|
334
334
|
const treeState = injectedTreeState;
|
|
335
|
-
console.log(props);
|
|
336
335
|
const expandedNodes = treeState?.expandedNodes ?? vue.reactive(/* @__PURE__ */ new Set());
|
|
337
336
|
const indentValue = props.depth * props.indentation;
|
|
338
337
|
const indent = vue.computed(() => ({
|
|
@@ -582,10 +581,13 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
582
581
|
horizontalScroll: { type: Boolean, default: false },
|
|
583
582
|
style: {},
|
|
584
583
|
searchHighlighting: { type: Boolean },
|
|
585
|
-
data: {}
|
|
584
|
+
data: {},
|
|
585
|
+
selected: {}
|
|
586
586
|
},
|
|
587
|
-
|
|
587
|
+
emits: ["update:selectedNodes"],
|
|
588
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
588
589
|
const props = __props;
|
|
590
|
+
const emit = __emit;
|
|
589
591
|
const rootNode = props.data;
|
|
590
592
|
const nodesForState = rootNode ? [rootNode] : [];
|
|
591
593
|
const treeState = useTreeState({
|
|
@@ -596,6 +598,26 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
596
598
|
nodes: nodesForState
|
|
597
599
|
});
|
|
598
600
|
vue.provide("treeState", treeState);
|
|
601
|
+
const pruneNode = (node) => ({
|
|
602
|
+
nodeId: node.nodeId,
|
|
603
|
+
title: node.title,
|
|
604
|
+
data: node.data,
|
|
605
|
+
children: Array.isArray(node.children) ? node.children.map(pruneNode) : void 0
|
|
606
|
+
});
|
|
607
|
+
const selectedNodeObjects = vue.computed(
|
|
608
|
+
() => treeState.selectedNodeObjects.map(pruneNode)
|
|
609
|
+
);
|
|
610
|
+
__expose({
|
|
611
|
+
selectedNodeObjects,
|
|
612
|
+
selectedNodes: treeState.selectedNodes
|
|
613
|
+
});
|
|
614
|
+
vue.watch(
|
|
615
|
+
() => treeState.selectedNodeObjects,
|
|
616
|
+
() => {
|
|
617
|
+
emit("update:selectedNodes", selectedNodeObjects.value);
|
|
618
|
+
},
|
|
619
|
+
{ deep: true }
|
|
620
|
+
);
|
|
599
621
|
return (_ctx, _cache) => {
|
|
600
622
|
return vue.openBlock(), vue.createElementBlock("div", null, [
|
|
601
623
|
props.searchEnabled ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fds-vue-core.cjs.js","sources":["../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import { reactive, ref } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const searchLower = term.toLowerCase()\n\n for (const param of searchParams) {\n if (param === 'title' && node.title?.toLowerCase().includes(searchLower)) return true\n if (param === 'nodeId' && node.nodeId.toLowerCase().includes(searchLower)) return true\n\n // Check nested data properties\n if (node.data && typeof node.data === 'object') {\n const value = (node.data as Record<string, unknown>)[param]\n if (value && String(value).toLowerCase().includes(searchLower)) return true\n }\n }\n\n return false\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children ? filterNodes(node.children, term, searchParams) : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n }\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n\n return {\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconsole.log(props)\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n display: 'flex',\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n transform: `translate(${indentValue}px)`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n if (!props.searchEnabled || !treeState?.searchTerm?.value) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, treeState.searchTerm.value, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ top: 0, left: 0 })\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.top = Math.round(rect.top)\n popoverCoords.left = Math.round(rect.right + 8)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: 'Denna och alla underliggande', value: 'parent_and_children' },\n { label: 'Endast denna nivå', value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div>\n <div :class=\"'bg-white-solid p-2 rounded-md'\">\n <div :style=\"indent\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(\n props.nodeId,\n props.nodeExpandIcon,\n props.nodeCollapseIcon,\n ) ?? props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ width: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{ props.nodes.length }})\n </span>\n </div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(props.nodeId, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"meta\" class=\"flex-1\">\n {{ props.nodeId }}\n </fds-text>\n </template>\n </label>\n </fds-checkbox>\n <div\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n class=\"ml-3 relative\"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{ top: popoverCoords.top + 'px', left: popoverCoords.left + 'px' }\"\n >\n <div\n ref=\"popoverPanelRef\"\n style=\"\n width: 327px;\n min-height: 80px;\n background-color: white;\n position: relative;\n padding: 24px;\n box-shadow: 0px 12px 24px rgba(12, 72, 153, 0.12);\n border-radius: 8px;\n gap: 16px;\n display: flex;\n flex-direction: column;\n \"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n style=\"\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: space-between;\n cursor: pointer;\n \"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"child.title\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n})\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n nodes: nodesForState,\n})\nprovide('treeState', treeState)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n </div>\n\n <div :class=\"props.horizontalScroll ? 'overflow-x-auto' : ''\">\n <TreeNode\n v-if=\"props.data\"\n :nodes=\"props.data.children || []\"\n :title=\"props.data.title\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["reactive","ref","index","inject","computed","watch","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_hoisted_2","_unref","indentation","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","provide","TreeNode","FdsTreeView"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fds-vue-core.cjs.js","sources":["../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import { reactive, ref } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const searchLower = term.toLowerCase()\n\n for (const param of searchParams) {\n if (param === 'title' && node.title?.toLowerCase().includes(searchLower)) return true\n if (param === 'nodeId' && node.nodeId.toLowerCase().includes(searchLower)) return true\n\n // Check nested data properties\n if (node.data && typeof node.data === 'object') {\n const value = (node.data as Record<string, unknown>)[param]\n if (value && String(value).toLowerCase().includes(searchLower)) return true\n }\n }\n\n return false\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children ? filterNodes(node.children, term, searchParams) : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n }\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n return {\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n display: 'flex',\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n transform: `translate(${indentValue}px)`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n if (!props.searchEnabled || !treeState?.searchTerm?.value) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, treeState.searchTerm.value, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ top: 0, left: 0 })\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.top = Math.round(rect.top)\n popoverCoords.left = Math.round(rect.right + 8)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: 'Denna och alla underliggande', value: 'parent_and_children' },\n { label: 'Endast denna nivå', value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div>\n <div :class=\"'bg-white-solid p-2 rounded-md'\">\n <div :style=\"indent\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(\n props.nodeId,\n props.nodeExpandIcon,\n props.nodeCollapseIcon,\n ) ?? props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ width: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{ props.nodes.length }})\n </span>\n </div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(props.nodeId, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"meta\" class=\"flex-1\">\n {{ props.nodeId }}\n </fds-text>\n </template>\n </label>\n </fds-checkbox>\n <div\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n class=\"ml-3 relative\"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{ top: popoverCoords.top + 'px', left: popoverCoords.left + 'px' }\"\n >\n <div\n ref=\"popoverPanelRef\"\n style=\"\n width: 327px;\n min-height: 80px;\n background-color: white;\n position: relative;\n padding: 24px;\n box-shadow: 0px 12px 24px rgba(12, 72, 153, 0.12);\n border-radius: 8px;\n gap: 16px;\n display: flex;\n flex-direction: column;\n \"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n style=\"\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: space-between;\n cursor: pointer;\n \"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"child.title\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, watch } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\n\ntype NodeShape = Pick<TreeNodeType, 'nodeId' | 'title' | 'data' | 'children'>\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n selected?: NodeShape[]\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n})\n\nconst emit = defineEmits<{\n (e: 'update:selectedNodes', value: NodeShape[]): void\n}>()\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n nodes: nodesForState,\n})\nprovide('treeState', treeState)\n\nconst pruneNode = (node: TreeNodeType): NodeShape => ({\n nodeId: node.nodeId,\n title: node.title,\n data: node.data,\n children: Array.isArray(node.children) ? node.children.map(pruneNode) : undefined,\n})\n\nconst selectedNodeObjects = computed<NodeShape[]>(() =>\n treeState.selectedNodeObjects.map(pruneNode),\n)\n\ndefineExpose({\n selectedNodeObjects,\n selectedNodes: treeState.selectedNodes,\n})\n\nwatch(\n () => treeState.selectedNodeObjects,\n () => {\n emit('update:selectedNodes', selectedNodeObjects.value)\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n </div>\n\n <div :class=\"props.horizontalScroll ? 'overflow-x-auto' : ''\">\n <TreeNode\n v-if=\"props.data\"\n :nodes=\"props.data.children || []\"\n :title=\"props.data.title\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["reactive","ref","index","inject","computed","watch","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_hoisted_2","_unref","indentation","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","provide","TreeNode","FdsTreeView"],"mappings":"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"}
|
package/dist/fds-vue-core.es.js
CHANGED
|
@@ -330,7 +330,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
330
330
|
const props = __props;
|
|
331
331
|
const injectedTreeState = inject("treeState", null);
|
|
332
332
|
const treeState = injectedTreeState;
|
|
333
|
-
console.log(props);
|
|
334
333
|
const expandedNodes = treeState?.expandedNodes ?? reactive(/* @__PURE__ */ new Set());
|
|
335
334
|
const indentValue = props.depth * props.indentation;
|
|
336
335
|
const indent = computed(() => ({
|
|
@@ -580,10 +579,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
580
579
|
horizontalScroll: { type: Boolean, default: false },
|
|
581
580
|
style: {},
|
|
582
581
|
searchHighlighting: { type: Boolean },
|
|
583
|
-
data: {}
|
|
582
|
+
data: {},
|
|
583
|
+
selected: {}
|
|
584
584
|
},
|
|
585
|
-
|
|
585
|
+
emits: ["update:selectedNodes"],
|
|
586
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
586
587
|
const props = __props;
|
|
588
|
+
const emit = __emit;
|
|
587
589
|
const rootNode = props.data;
|
|
588
590
|
const nodesForState = rootNode ? [rootNode] : [];
|
|
589
591
|
const treeState = useTreeState({
|
|
@@ -594,6 +596,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
594
596
|
nodes: nodesForState
|
|
595
597
|
});
|
|
596
598
|
provide("treeState", treeState);
|
|
599
|
+
const pruneNode = (node) => ({
|
|
600
|
+
nodeId: node.nodeId,
|
|
601
|
+
title: node.title,
|
|
602
|
+
data: node.data,
|
|
603
|
+
children: Array.isArray(node.children) ? node.children.map(pruneNode) : void 0
|
|
604
|
+
});
|
|
605
|
+
const selectedNodeObjects = computed(
|
|
606
|
+
() => treeState.selectedNodeObjects.map(pruneNode)
|
|
607
|
+
);
|
|
608
|
+
__expose({
|
|
609
|
+
selectedNodeObjects,
|
|
610
|
+
selectedNodes: treeState.selectedNodes
|
|
611
|
+
});
|
|
612
|
+
watch(
|
|
613
|
+
() => treeState.selectedNodeObjects,
|
|
614
|
+
() => {
|
|
615
|
+
emit("update:selectedNodes", selectedNodeObjects.value);
|
|
616
|
+
},
|
|
617
|
+
{ deep: true }
|
|
618
|
+
);
|
|
597
619
|
return (_ctx, _cache) => {
|
|
598
620
|
return openBlock(), createElementBlock("div", null, [
|
|
599
621
|
props.searchEnabled ? (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fds-vue-core.es.js","sources":["../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import { reactive, ref } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const searchLower = term.toLowerCase()\n\n for (const param of searchParams) {\n if (param === 'title' && node.title?.toLowerCase().includes(searchLower)) return true\n if (param === 'nodeId' && node.nodeId.toLowerCase().includes(searchLower)) return true\n\n // Check nested data properties\n if (node.data && typeof node.data === 'object') {\n const value = (node.data as Record<string, unknown>)[param]\n if (value && String(value).toLowerCase().includes(searchLower)) return true\n }\n }\n\n return false\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children ? filterNodes(node.children, term, searchParams) : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n }\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n\n return {\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconsole.log(props)\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n display: 'flex',\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n transform: `translate(${indentValue}px)`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n if (!props.searchEnabled || !treeState?.searchTerm?.value) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, treeState.searchTerm.value, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ top: 0, left: 0 })\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.top = Math.round(rect.top)\n popoverCoords.left = Math.round(rect.right + 8)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: 'Denna och alla underliggande', value: 'parent_and_children' },\n { label: 'Endast denna nivå', value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div>\n <div :class=\"'bg-white-solid p-2 rounded-md'\">\n <div :style=\"indent\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(\n props.nodeId,\n props.nodeExpandIcon,\n props.nodeCollapseIcon,\n ) ?? props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ width: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{ props.nodes.length }})\n </span>\n </div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(props.nodeId, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"meta\" class=\"flex-1\">\n {{ props.nodeId }}\n </fds-text>\n </template>\n </label>\n </fds-checkbox>\n <div\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n class=\"ml-3 relative\"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{ top: popoverCoords.top + 'px', left: popoverCoords.left + 'px' }\"\n >\n <div\n ref=\"popoverPanelRef\"\n style=\"\n width: 327px;\n min-height: 80px;\n background-color: white;\n position: relative;\n padding: 24px;\n box-shadow: 0px 12px 24px rgba(12, 72, 153, 0.12);\n border-radius: 8px;\n gap: 16px;\n display: flex;\n flex-direction: column;\n \"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n style=\"\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: space-between;\n cursor: pointer;\n \"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"child.title\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n})\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n nodes: nodesForState,\n})\nprovide('treeState', treeState)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n </div>\n\n <div :class=\"props.horizontalScroll ? 'overflow-x-auto' : ''\">\n <TreeNode\n v-if=\"props.data\"\n :nodes=\"props.data.children || []\"\n :title=\"props.data.title\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["index","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_hoisted_2","_unref","indentation","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","TreeNode","FdsTreeView"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fds-vue-core.es.js","sources":["../src/components/fds-tree-view/useTreeState.ts","../src/components/fds-tree-view/TreeNode.vue","../src/components/FdsTreeView.vue","../src/index.ts"],"sourcesContent":["import { reactive, ref } from 'vue'\nimport type { TreeNode, NodeId, TreeNodeArray, TreeNodeItem } from './types'\n\ninterface TreeStateOptions {\n expandChildrenOnParentCheck?: boolean\n expandAllChildrenOnParentCheck?: boolean\n showIndeterminateOnlyOnChildrenSelection?: boolean\n searchExpandNodes?: boolean\n nodes?: TreeNodeArray\n}\n\nconst useTreeState = (options: TreeStateOptions = {}) => {\n /**\n * The set of selected nodes\n */\n const selectedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The array of selected node objects\n */\n const selectedNodeObjects = reactive<TreeNode[]>([])\n /**\n * The set of expanded nodes\n */\n const expandedNodes = reactive<Set<NodeId>>(new Set())\n /**\n * The search term for filtering nodes\n */\n const searchTerm = ref<string>('')\n\n /**\n * Clears all selected nodes. Can be used to reset the selections to the initial state.\n */\n const clearAllSelectedNodes = () => {\n selectedNodes.clear()\n selectedNodeObjects.length = 0\n }\n\n /**\n * Collapses all expanded nodes. Can be used to reset the tree to the initial state.\n */\n const collapseAllExpandedNodes = () => expandedNodes.clear()\n\n /**\n * Returns true if the node is selected\n */\n const isNodeSelected = (nodeId: NodeId) => selectedNodes.has(nodeId)\n\n /**\n * Returns true if the node is expanded\n */\n const isNodeExpanded = (nodeId: NodeId) => expandedNodes.has(nodeId)\n\n /**\n * Expands the specific node\n */\n const expandNode = (nodeId: NodeId) => expandedNodes.add(nodeId)\n\n /**\n * Collapses the specific node\n */\n const collapseNode = (nodeId: NodeId) => expandedNodes.delete(nodeId)\n\n /**\n * Selects the specific node and adds it to the selectedNodeObjects array.\n * Used to access the node object and it's underlying data\n */\n const injectNode = (nodeObject: TreeNode) => {\n // Prevent duplicates\n if (selectedNodes.has(nodeObject.nodeId)) return\n\n selectedNodes.add(nodeObject.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === nodeObject.nodeId)) {\n selectedNodeObjects.push(nodeObject)\n }\n }\n\n /**\n * Expands all children of the specific node\n */\n const expandAllChildren = (node: TreeNode) => {\n expandNode(node.nodeId)\n if (node.children && node.children.length > 0) {\n node.children.forEach(expandAllChildren)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectAllChildren = (node: TreeNode) => {\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n\n // Inject the current node\n injectNode(node)\n\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n\n // Only expand children if the option is enabled\n if (options.expandChildrenOnParentCheck) {\n expandAllChildren(node)\n }\n }\n\n /**\n * Selects this node and recursively selects all children nodes\n */\n const selectNodeAndAllChildren = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Select the current node\n injectNode(node)\n\n // Deselect all children to avoid duplicates\n if (node.children && node.children.length > 0) {\n node.children.forEach(selectAllChildren)\n }\n }\n\n /**\n * Deselects the specific node\n */\n const deselectNode = (nodeId: NodeId) => {\n selectedNodes.delete(nodeId)\n const index = selectedNodeObjects.findIndex((node) => node.nodeId === nodeId)\n\n if (index > -1) {\n selectedNodeObjects.splice(index, 1)\n }\n }\n\n /**\n * Deselects this node and recursively deselects all children nodes\n */\n const deselectNodeAndAllChildren = (node: TreeNode) => {\n // Remove the current node\n deselectNode(node.nodeId)\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Deselects only the children of the specific node\n */\n const deselectChildrenOnly = (nodeId: NodeId) => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return\n\n // Ensure parent remains selected\n selectedNodes.add(node.nodeId)\n if (!selectedNodeObjects.some((n) => n.nodeId === node.nodeId)) {\n selectedNodeObjects.push(node)\n }\n\n // Recursively remove all children\n if (node.children && node.children.length > 0) {\n node.children.forEach(deselectNodeAndAllChildren)\n }\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeById = (nodes: TreeNodeArray, nodeId: string): TreeNodeItem | null => {\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Finds a node by ID\n */\n const findNodeObjectById = (nodeId: string): TreeNodeItem | null => {\n const nodes = Array.isArray(options.nodes) ? options.nodes : []\n for (const node of nodes) {\n if (node.nodeId === nodeId) {\n return node\n }\n if (node.children) {\n const found = findNodeById(node.children, nodeId)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Checks if a node has children\n */\n const hasChildrenNodes = (nodes: TreeNodeArray) => nodes.length > 0\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOrChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return selectedNodes.has(node.nodeId) || isAnyChildSelected(node.children || [])\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentAndAllChildrenSelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node) return false\n // Parent must be selected and all children\n return selectedNodes.has(node.nodeId) && isEveryChildSelected(node)\n }\n\n /**\n * Checks if a parent or it's children are selected\n */\n const isParentOnlySelected = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n\n if (!node || !hasChildrenNodes(node.children || [])) return false\n\n return !isAnyChildSelected(node.children || []) && selectedNodes.has(node.nodeId)\n }\n\n /**\n * Returns true if ALL children of a node are selected\n */\n const isEveryChildSelected = (node: TreeNode): boolean => {\n if (!node.children || node.children.length === 0) return true\n\n return node.children.every(\n (child) => selectedNodes.has(child.nodeId) && isEveryChildSelected(child),\n )\n }\n\n /**\n * Checks if any child of a node is selected\n */\n const isAnyChildSelected = (nodes: TreeNodeArray): boolean => {\n if (!nodes || nodes.length === 0) return false\n return nodes.some(\n (child) =>\n selectedNodes.has(child.nodeId) || (child.children && isAnyChildSelected(child.children)),\n )\n }\n\n /**\n * Checks if a node is indeterminate (partially selected)\n */\n const isNodeIndeterminate = (nodes: TreeNodeArray, parentNodeId?: string): boolean => {\n if (!hasChildrenNodes(nodes)) return false\n\n // Check each child's state\n const childStates = nodes.map((node) => ({\n isSelected: selectedNodes.has(node.nodeId),\n isIndeterminate:\n node.children && node.children.length > 0\n ? isNodeIndeterminate(node.children, node.nodeId)\n : false,\n }))\n\n const hasSelected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isSelected,\n )\n const hasUnselected = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) =>\n !child.isSelected && !child.isIndeterminate,\n )\n const hasIndeterminate = childStates.some(\n (child: { isSelected: boolean; isIndeterminate: boolean }) => child.isIndeterminate,\n )\n\n // If parent is selected, never show indeterminate\n if (parentNodeId && selectedNodes.has(parentNodeId)) return false\n\n // Standard behavior: some selected + some unselected, OR any child is indeterminate\n if (!options.showIndeterminateOnlyOnChildrenSelection) {\n return (hasSelected && hasUnselected) || hasIndeterminate\n }\n\n // Special behavior: any child selected OR any child indeterminate\n return hasSelected || hasIndeterminate\n }\n\n const isNodeIndeterminateById = (nodeId: NodeId): boolean => {\n const node = findNodeObjectById(nodeId)\n if (!node) return false\n return isNodeIndeterminate(node.children || [], nodeId)\n }\n\n /**\n * Toggles the selection state of the specific node\n */\n const toggleSelectNode = (nodeId: string, title?: string, data?: Record<string, unknown>) => {\n let node = findNodeObjectById(nodeId)\n\n if (!node && nodeId) {\n node = {\n nodeId: nodeId,\n title: title,\n children: [],\n data: data,\n }\n }\n\n if (!node) return\n\n if (selectedNodes.has(nodeId)) {\n deselectNodeAndAllChildren(node)\n } else {\n selectAllChildren(node)\n\n if (\n selectedNodes.has(nodeId) &&\n !expandedNodes.has(nodeId) &&\n options.expandChildrenOnParentCheck\n ) {\n expandNode(nodeId)\n }\n }\n }\n\n /**\n * Toggles the expansion state of the specific node\n */\n const toggleExpandNode = (nodeId: NodeId) => {\n if (isNodeExpanded(nodeId)) {\n collapseNode(nodeId)\n } else {\n expandNode(nodeId)\n }\n }\n\n /**\n * Gets the icons for expanded and collapsed nodes\n */\n const getNodeIcon = (nodeId: NodeId, expandIcon: string, collapseIcon: string) => {\n return isNodeExpanded(nodeId) ? collapseIcon : expandIcon\n }\n\n /**\n * Checks if a node matches the search term by searching through specified properties\n */\n const nodeMatchesSearch = (node: TreeNode, term: string, searchParams?: string[]): boolean => {\n if (!term.trim()) return true\n if (!searchParams || !Array.isArray(searchParams)) return false\n\n const searchLower = term.toLowerCase()\n\n for (const param of searchParams) {\n if (param === 'title' && node.title?.toLowerCase().includes(searchLower)) return true\n if (param === 'nodeId' && node.nodeId.toLowerCase().includes(searchLower)) return true\n\n // Check nested data properties\n if (node.data && typeof node.data === 'object') {\n const value = (node.data as Record<string, unknown>)[param]\n if (value && String(value).toLowerCase().includes(searchLower)) return true\n }\n }\n\n return false\n }\n\n /**\n * Filters nodes based on search term, including children that match\n */\n const filterNodes = (\n nodes: TreeNodeArray,\n term: string,\n searchParams?: string[],\n ): TreeNodeArray => {\n if (!term.trim()) return nodes\n\n const filtered: TreeNodeArray = []\n\n for (const node of nodes) {\n const nodeMatches = nodeMatchesSearch(node, term, searchParams)\n const filteredChildren = node.children ? filterNodes(node.children, term, searchParams) : []\n\n // Include node if it matches OR has matching children\n if (nodeMatches || filteredChildren.length > 0) {\n filtered.push({\n ...node,\n children: filteredChildren.length > 0 ? filteredChildren : node.children,\n })\n }\n }\n\n return filtered\n }\n\n /**\n * Sets the search term\n */\n const setSearchTerm = (term: string) => {\n searchTerm.value = term\n }\n\n /**\n * Clears the search term\n */\n const clearSearch = () => {\n searchTerm.value = ''\n }\n\n /**\n * Returns HTML string with hits from search term wrapped in <strong>.\n */\n const highlightText = (text: string | undefined, term: string | undefined): string => {\n const source = String(text ?? '')\n const t = String(term ?? '').trim()\n if (!t) return source\n try {\n const re = new RegExp(t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'ig')\n return source.replace(re, '<strong>$&</strong>')\n } catch {\n return source\n }\n }\n\n return {\n clearSearch,\n collapseAllExpandedNodes,\n collapseNode,\n deselectNodeAndAllChildren,\n deselectChildrenOnly,\n deselectNode,\n expandAllChildren,\n expandedNodes,\n expandNode,\n filterNodes,\n getNodeIcon,\n injectNode,\n isNodeExpanded,\n isNodeIndeterminate,\n isNodeIndeterminateById,\n isNodeSelected,\n isParentOrChildrenSelected,\n isParentAndAllChildrenSelected,\n highlightText,\n searchTerm,\n selectAllChildren,\n selectedNodeObjects,\n selectedNodes,\n setSearchTerm,\n toggleExpandNode,\n toggleSelectNode,\n isParentOnlySelected,\n selectNodeAndAllChildren,\n clearAllSelectedNodes,\n }\n}\n\nexport default useTreeState\n","<script setup lang=\"ts\">\nimport { computed, inject, reactive, ref, watch } from 'vue'\nimport type { TreeViewProps } from './types'\nimport useTreeState from './useTreeState'\n\ntype Props<T = Record<string, unknown>> = TreeViewProps<T>\n\nconst props = withDefaults(defineProps<Props>(), {\n nodes: () => [],\n depth: 0,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n searchHighlighting: false,\n})\n\ndefineOptions({\n name: 'TreeNode',\n})\n\nconst injectedTreeState = inject<ReturnType<typeof useTreeState> | null>('treeState', null)\nconst treeState = injectedTreeState!\nconst expandedNodes = treeState?.expandedNodes ?? reactive(new Set())\n\nconst indentValue = props.depth * props.indentation\n\nconst indent = computed(() => ({\n display: 'flex',\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n transform: `translate(${indentValue}px)`,\n}))\n\nconst hasChildrenNodes = computed(() => {\n const nodesToCheck =\n props.searchEnabled && treeState?.searchTerm?.value ? filteredNodes.value : props.nodes\n return Array.isArray(nodesToCheck) && nodesToCheck.length > 0\n})\n\nconst filteredNodes = computed(() => {\n if (!props.searchEnabled || !treeState?.searchTerm?.value) {\n return props.nodes\n }\n return treeState.filterNodes(props.nodes, treeState.searchTerm.value, props.searchMatchParams)\n})\n\n// Auto-expand current node if search is active and it has matching children\nwatch(\n () => ({\n enabled: props.searchEnabled,\n expandOnSearch: props.searchExpandNodes,\n term: treeState?.searchTerm?.value,\n count: (filteredNodes.value || []).length,\n }),\n ({ enabled, expandOnSearch, term, count }) => {\n if (!enabled || !expandOnSearch) return\n const t = String(term || '').trim()\n if (!t) return\n if (typeof count === 'number' && count > 0) {\n expandedNodes.add(props.nodeId)\n }\n },\n)\n\nconst isOpen = ref(false)\nconst triggerRef = ref<HTMLElement | null>(null)\nconst popoverPanelRef = ref<HTMLElement | null>(null)\nconst popoverCoords = reactive({ top: 0, left: 0 })\n\nconst computePopoverCoords = () => {\n const triggerEl = triggerRef.value\n if (!triggerEl) return\n const rect = triggerEl.getBoundingClientRect()\n popoverCoords.top = Math.round(rect.top)\n popoverCoords.left = Math.round(rect.right + 8)\n}\n\nconst openPopover = () => {\n computePopoverCoords()\n isOpen.value = true\n window.addEventListener('scroll', computePopoverCoords, true)\n window.addEventListener('resize', computePopoverCoords)\n document.addEventListener('pointerdown', handleGlobalPointerDown, { passive: true })\n document.addEventListener('keydown', handleGlobalKeydown)\n}\n\nconst closePopover = () => {\n isOpen.value = false\n window.removeEventListener('scroll', computePopoverCoords, true)\n window.removeEventListener('resize', computePopoverCoords)\n document.removeEventListener('pointerdown', handleGlobalPointerDown)\n document.removeEventListener('keydown', handleGlobalKeydown)\n}\n\nconst togglePopover = () => {\n if (isOpen.value) closePopover()\n else openPopover()\n}\n\nconst handleGlobalPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) return\n\n const hasComposedPath = (ev: Event): ev is Event & { composedPath: () => EventTarget[] } =>\n typeof (ev as { composedPath?: () => EventTarget[] }).composedPath === 'function'\n\n const clickedPath = hasComposedPath(event) ? event.composedPath() : ([] as EventTarget[])\n const contains = (el: HTMLElement | null) => (el ? clickedPath.includes(el) : false)\n if (!contains(triggerRef.value) && !contains(popoverPanelRef.value)) {\n closePopover()\n }\n}\n\nconst handleGlobalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen.value) {\n closePopover()\n }\n}\n\nconst options = [\n { label: 'Denna och alla underliggande', value: 'parent_and_children' },\n { label: 'Endast denna nivå', value: 'parent' },\n]\n\nconst currentOption = computed(() => {\n if (treeState?.isParentAndAllChildrenSelected(props.nodeId)) return 'parent_and_children'\n if (treeState?.isParentOnlySelected(props.nodeId)) return 'parent'\n return ''\n})\n\nconst handleOptionClick = (option: (typeof options)[number]['value']) => {\n if (option === 'parent_and_children') {\n treeState?.selectNodeAndAllChildren(props.nodeId)\n } else if (option === 'parent') {\n treeState?.deselectChildrenOnly(props.nodeId)\n }\n isOpen.value = false\n}\n</script>\n\n<template>\n <div :class=\"props?.style?.container\">\n <div>\n <div :class=\"'bg-white-solid p-2 rounded-md'\">\n <div :style=\"indent\">\n <div class=\"flex\">\n <fds-icon\n v-if=\"hasChildrenNodes\"\n @click=\"treeState?.toggleExpandNode(props.nodeId)\"\n :name=\"\n treeState?.getNodeIcon(\n props.nodeId,\n props.nodeExpandIcon,\n props.nodeCollapseIcon,\n ) ?? props.nodeExpandIcon\n \"\n size=\"24px\"\n class=\"text-blue-500 mr-3\"\n style=\"margin-top: 3px\"\n />\n <div v-if=\"!hasChildrenNodes\" :style=\"{ width: `${indentation}px` }\" />\n\n <fds-checkbox class=\"pl-0 flex-1 flex items-center\">\n <input\n :id=\"`checkbox-${props.nodeId}`\"\n style=\"margin: 0px; margin-top: 3px\"\n type=\"checkbox\"\n :checked=\"treeState?.isNodeSelected(props.nodeId)\"\n :indeterminate=\"\n showIndeterminate && (treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n @change=\"treeState?.toggleSelectNode(props.nodeId, props.title, props.data)\"\n />\n <label :for=\"`checkbox-${props.nodeId}`\" class=\"flex flex-col pl-0\">\n <div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(title, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"default\">{{ title }}</fds-text>\n </template>\n <span v-if=\"showChildrenCount && hasChildrenNodes\">\n (+{{ props.nodes.length }})\n </span>\n </div>\n <template v-if=\"title\">\n <fds-text\n v-if=\"searchHighlighting && searchEnabled && treeState?.searchTerm?.value\"\n type=\"default\"\n >\n <span\n v-html=\"treeState?.highlightText(props.nodeId, treeState?.searchTerm?.value)\"\n />\n </fds-text>\n <fds-text v-else type=\"meta\" class=\"flex-1\">\n {{ props.nodeId }}\n </fds-text>\n </template>\n </label>\n </fds-checkbox>\n <div\n v-if=\"\n treeState?.isParentOrChildrenSelected(props.nodeId) &&\n !(treeState?.isNodeIndeterminateById(props.nodeId) ?? false)\n \"\n class=\"ml-3 relative\"\n >\n <fds-icon-button\n ref=\"triggerRef\"\n icon=\"more\"\n size=\"24px\"\n color=\"blue\"\n @click=\"togglePopover\"\n />\n <teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n class=\"fixed z-[9999]\"\n :style=\"{ top: popoverCoords.top + 'px', left: popoverCoords.left + 'px' }\"\n >\n <div\n ref=\"popoverPanelRef\"\n style=\"\n width: 327px;\n min-height: 80px;\n background-color: white;\n position: relative;\n padding: 24px;\n box-shadow: 0px 12px 24px rgba(12, 72, 153, 0.12);\n border-radius: 8px;\n gap: 16px;\n display: flex;\n flex-direction: column;\n \"\n @click.stop\n >\n <div\n v-for=\"option in options\"\n :key=\"option.value\"\n style=\"\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: space-between;\n cursor: pointer;\n \"\n @click=\"handleOptionClick(option.value)\"\n >\n <fds-text>{{ option.label }}</fds-text>\n <fds-icon\n name=\"checkmark\"\n size=\"24px\"\n class=\"text-blue-500\"\n v-if=\"currentOption === option.value\"\n />\n </div>\n </div>\n </div>\n </teleport>\n </div>\n </div>\n </div>\n\n <div v-if=\"expandedNodes.has(props.nodeId)\">\n <TreeNode\n v-for=\"child in filteredNodes\"\n :key=\"child.nodeId\"\n :nodes=\"child.children || []\"\n :title=\"child.title\"\n :nodeId=\"child.nodeId\"\n :data=\"child.data\"\n :depth=\"props.depth + 1\"\n :indentation=\"props.indentation\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :showNodeDescription=\"showNodeDescription\"\n :showChildrenCount=\"showChildrenCount\"\n :expandChildrenOnSelect=\"expandChildrenOnSelect\"\n :showIndeterminate=\"showIndeterminate\"\n :showIndeterminateOnlyOnChildrenSelection=\"showIndeterminateOnlyOnChildrenSelection\"\n :expandChildrenOnParentCheck=\"expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"expandAllChildrenOnParentCheck\"\n :searchEnabled=\"searchEnabled\"\n :searchExpandNodes=\"searchExpandNodes\"\n :searchMatchParams=\"searchMatchParams\"\n :searchHighlighting=\"searchHighlighting\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, watch } from 'vue'\nimport useTreeState from './fds-tree-view/useTreeState'\nimport TreeNode from './fds-tree-view/TreeNode.vue'\nimport type { TreeNode as TreeNodeType, TreeViewProps } from './fds-tree-view/types'\n\ntype NodeShape = Pick<TreeNodeType, 'nodeId' | 'title' | 'data' | 'children'>\n\ntype WrapperProps<T = Record<string, unknown>> = Omit<\n TreeViewProps<T>,\n 'nodes' | 'depth' | 'data' | 'nodeId' | 'title'\n> & {\n data: TreeNodeType<T>\n selected?: NodeShape[]\n}\n\nconst props = withDefaults(defineProps<WrapperProps<Record<string, unknown>>>(), {\n indentation: 36,\n showNodeDescription: false,\n showChildrenCount: false,\n expandChildrenOnSelect: false,\n showIndeterminate: false,\n expandChildrenOnParentCheck: false,\n expandAllChildrenOnParentCheck: true,\n showIndeterminateOnlyOnChildrenSelection: false,\n searchEnabled: false,\n searchExpandNodes: false,\n horizontalScroll: false,\n searchMatchParams: () => ['title', 'nodeId'],\n})\n\nconst emit = defineEmits<{\n (e: 'update:selectedNodes', value: NodeShape[]): void\n}>()\n\nconst rootNode = props.data\nconst nodesForState = rootNode ? [rootNode] : []\n\nconst treeState = useTreeState({\n expandChildrenOnParentCheck: props.expandChildrenOnParentCheck,\n expandAllChildrenOnParentCheck: props.expandAllChildrenOnParentCheck,\n showIndeterminateOnlyOnChildrenSelection: props.showIndeterminateOnlyOnChildrenSelection,\n searchExpandNodes: props.searchExpandNodes,\n nodes: nodesForState,\n})\nprovide('treeState', treeState)\n\nconst pruneNode = (node: TreeNodeType): NodeShape => ({\n nodeId: node.nodeId,\n title: node.title,\n data: node.data,\n children: Array.isArray(node.children) ? node.children.map(pruneNode) : undefined,\n})\n\nconst selectedNodeObjects = computed<NodeShape[]>(() =>\n treeState.selectedNodeObjects.map(pruneNode),\n)\n\ndefineExpose({\n selectedNodeObjects,\n selectedNodes: treeState.selectedNodes,\n})\n\nwatch(\n () => treeState.selectedNodeObjects,\n () => {\n emit('update:selectedNodes', selectedNodeObjects.value)\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div>\n <div v-if=\"props.searchEnabled\" class=\"mb-4\">\n <fds-input\n :value=\"treeState?.searchTerm || ''\"\n @input=\"treeState?.setSearchTerm($event.target.value)\"\n class=\"w-full\"\n :label=\"props.searchLabel\"\n >\n <input id=\"tree-view-search-input\" />\n </fds-input>\n </div>\n\n <div :class=\"props.horizontalScroll ? 'overflow-x-auto' : ''\">\n <TreeNode\n v-if=\"props.data\"\n :nodes=\"props.data.children || []\"\n :title=\"props.data.title\"\n :nodeId=\"props.data.nodeId\"\n :data=\"props.data.data\"\n :indentation=\"props.indentation\"\n :showNodeDescription=\"props.showNodeDescription\"\n :showChildrenCount=\"props.showChildrenCount\"\n :expandChildrenOnSelect=\"props.expandChildrenOnSelect\"\n :showIndeterminate=\"props.showIndeterminate\"\n :expandChildrenOnParentCheck=\"props.expandChildrenOnParentCheck\"\n :expandAllChildrenOnParentCheck=\"props.expandAllChildrenOnParentCheck\"\n :showIndeterminateOnlyOnChildrenSelection=\"props.showIndeterminateOnlyOnChildrenSelection\"\n :searchEnabled=\"props.searchEnabled\"\n :searchLabel=\"props.searchLabel\"\n :searchExpandNodes=\"props.searchExpandNodes\"\n :searchMatchParams=\"props.searchMatchParams\"\n :horizontalScroll=\"props.horizontalScroll\"\n :nodeExpandIcon=\"props.nodeExpandIcon\"\n :nodeCollapseIcon=\"props.nodeCollapseIcon\"\n :searchHighlighting=\"props.searchHighlighting\"\n />\n </div>\n </div>\n</template>\n","import type { App } from 'vue'\n\n// Import all components\nimport FdsTreeView from './components/FdsTreeView.vue'\n\n// Import composables\nimport useTreeState from './components/fds-tree-view/useTreeState'\n\n// Export individual components\nexport { FdsTreeView }\n\n// Export composables\nexport { useTreeState }\n\n// Export component library plugin\nexport default {\n install(app: App) {\n // Register all components globally\n app.component('FdsTreeView', FdsTreeView)\n },\n}\n\nexport type {\n TreeNode,\n TreeNodeArray,\n TreeNodeItem,\n TreeViewProps,\n NodeId,\n} from './components/fds-tree-view/types'\n\nimport type { TreeViewProps } from './components/fds-tree-view/types'\nexport type FdsTreeViewProps<T = Record<string, unknown>> = TreeViewProps<T>\n"],"names":["index","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_hoisted_2","_unref","indentation","showIndeterminate","title","_Fragment","searchHighlighting","searchEnabled","_openBlock","_toDisplayString","showChildrenCount","_createBlock","_Teleport","_renderList","showNodeDescription","expandChildrenOnSelect","showIndeterminateOnlyOnChildrenSelection","expandChildrenOnParentCheck","expandAllChildrenOnParentCheck","searchExpandNodes","searchMatchParams","TreeNode","FdsTreeView"],"mappings":"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"}
|