-
-
Notifications
You must be signed in to change notification settings - Fork 13
/
TreeViewActions.ts
82 lines (72 loc) · 2.19 KB
/
TreeViewActions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import TreeSemanticDomain, {
DomainMap,
} from "components/TreeView/TreeSemanticDomain";
import { StoreStateDispatch } from "types/Redux/actions";
export enum TreeActionType {
CLOSE_TREE = "CLOSE_TREE",
OPEN_TREE = "OPEN_TREE",
SET_DOMAIN_MAP = "SET_DOMAIN_MAP",
TRAVERSE_TREE = "TRAVERSE_TREE",
}
export interface TreeViewAction {
type: TreeActionType;
domain?: TreeSemanticDomain;
domainMap?: DomainMap;
language?: string;
}
export function closeTreeAction(): TreeViewAction {
return { type: TreeActionType.CLOSE_TREE };
}
export function openTreeAction(): TreeViewAction {
return { type: TreeActionType.OPEN_TREE };
}
export function setDomainMapAction(
domainMap: DomainMap,
language: string
): TreeViewAction {
return { type: TreeActionType.SET_DOMAIN_MAP, domainMap, language };
}
export function traverseTreeAction(domain: TreeSemanticDomain): TreeViewAction {
return { type: TreeActionType.TRAVERSE_TREE, domain };
}
// Split off subdomains and add domainIds
function mapDomain(
domain: TreeSemanticDomain,
domainMap: DomainMap,
parentId?: string
) {
domain.parentId = parentId;
domain.childIds = domain.subdomains.map((dom) => dom.id);
for (const child of domain.subdomains) {
mapDomain(child, domainMap, domain.id);
}
domain.subdomains = [];
domainMap[domain.id] = domain;
}
// Parses a list of semantic domains (to be loaded from file)
export function createDomainMap(
data: TreeSemanticDomain[],
headString = ""
): DomainMap {
const domain = new TreeSemanticDomain("", headString);
domain.subdomains = data;
const domainMap: DomainMap = {};
mapDomain(domain, domainMap);
return domainMap;
}
function loadLocalizedJson(languageKey: string): Promise<any> {
return new Promise((res) => {
import(`resources/semantic-domains/${languageKey}.json`).then((data) => {
res(data?.default);
});
});
}
export function updateTreeLanguage(language: string, headString = "") {
return async (dispatch: StoreStateDispatch) => {
if (language) {
const localizedDomains = await loadLocalizedJson(language);
const domainMap = createDomainMap(localizedDomains, headString);
dispatch(setDomainMapAction(domainMap, language));
}
};
}