diff --git a/backend/pom.xml b/backend/pom.xml
index 2a903b5a..b2007380 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -5,7 +5,7 @@
ru.micord.ervu
dashboard
- 1.5.0-SNAPSHOT
+ 1.7.0-SNAPSHOT
ru.micord.ervu.dashboard
backend
diff --git a/backend/src/main/java/component/model/TreeItemDto.java b/backend/src/main/java/component/model/TreeItemDto.java
new file mode 100644
index 00000000..d62eb049
--- /dev/null
+++ b/backend/src/main/java/component/model/TreeItemDto.java
@@ -0,0 +1,22 @@
+package component.model;
+
+import ru.cg.webbpm.modules.webkit.annotations.Model;
+
+/**
+ * @author r.latypov
+ */
+@Model
+public class TreeItemDto {
+ public Object id;
+ public Object parentId;
+ public String label;
+ public TreeItemDto[] children;
+ public Object businessId;
+ public String domainId;
+
+ public TreeItemDto(Object id, Object parentId, String label) {
+ this.id = id;
+ this.parentId = parentId;
+ this.label = label;
+ }
+}
diff --git a/backend/src/main/java/component/rpc/TreeItemRpcService.java b/backend/src/main/java/component/rpc/TreeItemRpcService.java
new file mode 100644
index 00000000..0e174d3b
--- /dev/null
+++ b/backend/src/main/java/component/rpc/TreeItemRpcService.java
@@ -0,0 +1,28 @@
+package component.rpc;
+
+import java.util.List;
+
+import component.model.TreeItemDto;
+import component.service.TreeItemService;
+
+import ru.cg.webbpm.modules.webkit.annotations.RpcCall;
+import ru.cg.webbpm.modules.webkit.annotations.RpcService;
+import ru.cg.webbpm.modules.webkit.beans.Behavior;
+
+/**
+ * @author r.latypov
+ */
+@RpcService
+public class TreeItemRpcService extends Behavior {
+ public TreeItemService treeItemService;
+
+ @RpcCall
+ public List loadTreeData() {
+ return treeItemService.loadTreeData();
+ }
+
+ @RpcCall
+ public List loadTreeDataByDomainId(String domainId) {
+ return treeItemService.loadTreeDataByDomainId(domainId);
+ }
+}
diff --git a/backend/src/main/java/component/service/TreeItemService.java b/backend/src/main/java/component/service/TreeItemService.java
new file mode 100644
index 00000000..fbb170bc
--- /dev/null
+++ b/backend/src/main/java/component/service/TreeItemService.java
@@ -0,0 +1,126 @@
+package component.service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import component.model.TreeItemDto;
+import component.rpc.TreeItemRpcService;
+import database.dao.DefaultLoadDao;
+import org.springframework.stereotype.Service;
+
+import ru.cg.webbpm.modules.database.api.bean.TableRow;
+import ru.cg.webbpm.modules.database.api.dao.option.LoadOptions;
+import ru.cg.webbpm.modules.database.bean.annotation.GraphSource;
+import ru.cg.webbpm.modules.database.bean.annotation.TypedColumn;
+import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn;
+import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumnType;
+import ru.cg.webbpm.modules.standard_annotations.validation.NotNull;
+
+/**
+ * @author r.latypov
+ */
+@Service
+public class TreeItemService {
+ @NotNull
+ public DefaultLoadDao loadDao;
+ @GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
+ @NotNull
+ public EntityColumn idColumn;
+ @GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
+ @NotNull
+ public EntityColumn parentIdColumn;
+ @GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
+ @TypedColumn(colTypes = EntityColumnType.STRING)
+ @NotNull
+ public EntityColumn labelColumn;
+ @GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
+ public EntityColumn businessIdColumn;
+ @GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
+ public EntityColumn domainIdColumn;
+
+ public List loadTreeData() {
+ List loadedTreeItems = loadTreeItems();
+ loadedTreeItems.forEach(item -> item.domainId = null);
+ return loadedTreeItems.stream()
+ .filter(item -> item.parentId == null)
+ .toList();
+ }
+
+ public List loadTreeDataByDomainId(String domainId) {
+ if (domainId == null || domainIdColumn == null) {
+ return loadTreeData();
+ }
+
+ List filteredTreeItems = loadTreeItems().stream()
+ .filter(item -> item.domainId.equalsIgnoreCase(domainId))
+ .toList();
+ filteredTreeItems.forEach(this::setDomainIdToNull);
+ return filteredTreeItems;
+ }
+
+ private void setDomainIdToNull(TreeItemDto treeItem) {
+ treeItem.domainId = null;
+ TreeItemDto[] treeItemChildren = treeItem.children;
+ if (treeItemChildren != null && treeItemChildren.length > 0) {
+ for (TreeItemDto child : treeItemChildren) {
+ setDomainIdToNull(child);
+ }
+ }
+ }
+
+ private List loadTreeItems() {
+ List loadedList = this.loadDao.load(getColumns(), new LoadOptions()).stream()
+ .map(this::toTreeItemDto)
+ .toList();
+
+ Map