# Hämta menyalternativ

## Hämta en nivå

Hämtar menyalternativ från en given nod.

**server/getMenuItems.js**

```js
import NodeIteratorUtil from '@sitevision/api/server/NodeIteratorUtil';
import NodeTreeUtil from '@sitevision/api/server/NodeTreeUtil';
import Properties from '@sitevision/api/server/Properties';


function createItemData(iterator, callback) {
  const items = [];
  while (iterator?.hasNext()) {
    const node = iterator.next();
    items.push(callback(node));
  }
  return items;
}


export default function getMenuItems(rootNode, currentPage) {
  const iterator = NodeIteratorUtil.getMenuItems(rootNode);
  return createItemData(iterator, (node) => ({
    id: node.getIdentifier(),
    name: Properties.get(node, 'displayName'),
    uri: Properties.get(node, 'rawURI') || Properties.get(node, 'URI'),
    isCurrent: currentPage.equals(node),
    isExpanded: NodeTreeUtil.isDescendantOf(currentPage, node),
  }));
}
```

Exempel på användning:

**index.js**

```js
import router from '@sitevision/api/common/router';
import appData from '@sitevision/api/server/appData';
import PortletContextUtil from '@sitevision/api/server/PortletContextUtil';


import getMenuItems from './server/getMenuItems';


router.get('/', (req, res) => {
  const rootNode = appData.getNode('rootNode');
  const currentPage = PortletContextUtil.getCurrentPage();
  const items = getMenuItems(rootNode, currentPage);
  // Do something with the items
});
```

## Hämta aktivt träd

Hämtar rekursivt det aktiva trädet från en given nod.

**server/getActiveMenuTree.js**

```js
import NodeIteratorUtil from '@sitevision/api/server/NodeIteratorUtil';
import NodeTreeUtil from '@sitevision/api/server/NodeTreeUtil';
import Properties from '@sitevision/api/server/Properties';


function createItemData(iterator, callback) {
  const items = [];
  while (iterator.hasNext()) {
    const node = iterator.next();
    items.push(callback(node));
  }
  return items;
}


function hasChildren(node) {
  return NodeIteratorUtil.getMenuItems(node).hasNext();
}


export default function getActiveMenuTree(parentNode, { currentPage, level = 1 } = {}) {
  const iterator = NodeIteratorUtil.getMenuItems(parentNode);
  return createItemData(iterator, (node) => {
    const isExpanded = NodeTreeUtil.isDescendantOf(currentPage, node);
    return {
      id: node.getIdentifier(),
      level,
      name: Properties.get(node, 'displayName'),
      uri: Properties.get(node, 'rawURI') || Properties.get(node, 'URI'),
      isCurrent: currentPage.equals(node),
      isExpanded,
      hasChildren: hasChildren(node),
      children: isExpanded ? getActiveMenuTree(node, { currentPage, level: level + 1 }) : [],
    };
  });
}
```

Exempel på användning:

**index.js**

```js
import router from '@sitevision/api/common/router';
import appData from '@sitevision/api/server/appData';
import PortletContextUtil from '@sitevision/api/server/PortletContextUtil';


import getActiveMenuTree from './server/getActiveMenuTree';


router.get('/', (req, res) => {
  const rootNode = appData.getNode('rootNode');
  const currentPage = PortletContextUtil.getCurrentPage();
  const tree = getActiveMenuTree(rootNode, { currentPage });
  // Do something with the tree
});
```

## Hämta hela trädet

Hämtar rekursivt hela trädet från en given nod.

**server/getMenuTree.js**

```js
import NodeIteratorUtil from '@sitevision/api/server/NodeIteratorUtil';
import NodeTreeUtil from '@sitevision/api/server/NodeTreeUtil';
import Properties from '@sitevision/api/server/Properties';


function createItemData(iterator, callback) {
  const items = [];
  while (iterator.hasNext()) {
    const node = iterator.next();
    items.push(callback(node));
  }
  return items;
}


function hasChildren(node) {
  return NodeIteratorUtil.getMenuItems(node).hasNext();
}


export default function getMenuTree(parentNode, { currentPage, level = 1 } = {}) {
  const iterator = NodeIteratorUtil.getMenuItems(parentNode);
  return createItemData(iterator, (node) => ({
    id: node.getIdentifier(),
    level,
    name: Properties.get(node, 'displayName'),
    uri: Properties.get(node, 'rawURI') || Properties.get(node, 'URI'),
    isCurrent: currentPage.equals(node),
    isExpanded: NodeTreeUtil.isDescendantOf(currentPage, node),
    hasChildren: hasChildren(node),
    children: getMenuTree(node, { currentPage, level: level + 1 }),
  }));
}
```

Exempel på användning:

**index.js**

```js
import router from '@sitevision/api/common/router';
import appData from '@sitevision/api/server/appData';
import PortletContextUtil from '@sitevision/api/server/PortletContextUtil';


import getMenuTree from './server/getMenuTree';


router.get('/', (req, res) => {
  const rootNode = appData.getNode('rootNode');
  const currentPage = PortletContextUtil.getCurrentPage();
  const tree = getMenuTree(rootNode, { currentPage });
  // Do something with the tree
});
```