Skip to content

Commit 0c0c044

Browse files
authored
Refactored and tested function to get relationships visible in tab (#6396)
1 parent 512f2bf commit 0c0c044

File tree

6 files changed

+198
-33
lines changed

6 files changed

+198
-33
lines changed

frontend/app/src/config/constants.tsx

-5
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,6 @@ export const relationshipsForDetailsView: { one: RelationshipKind[]; many: Relat
139139
many: ["Attribute", "Parent"],
140140
};
141141

142-
export const relationshipsForTabs: { one: RelationshipKind[]; many: RelationshipKind[] } = {
143-
one: [],
144-
many: ["Generic", "Component", "Hierarchy", "Template"],
145-
};
146-
147142
export const RELATIONSHIP_VIEW_BLACKLIST = [
148143
"member_of_groups",
149144
"subscriber_of_groups",

frontend/app/src/entities/nodes/hooks/useObjectDetails.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { PROFILE_KIND, TASK_OBJECT } from "@/config/constants";
22
import { getObjectDetailsPaginated } from "@/entities/nodes/api/getObjectDetails";
3-
import {
4-
getSchemaObjectColumns,
5-
getTabs,
6-
} from "@/entities/nodes/object-items/getSchemaObjectColumns";
3+
import { getSchemaObjectColumns } from "@/entities/nodes/object-items/getSchemaObjectColumns";
4+
import { getRelationshipsVisibleInTab } from "@/entities/nodes/object/utils/get-relationships-visible-in-tab";
75
import { getPermission } from "@/entities/permission/utils";
86
import { genericSchemasAtom } from "@/entities/schema/stores/schema.atom";
97
import { ModelSchema } from "@/entities/schema/types";
@@ -16,7 +14,7 @@ export const useObjectDetails = (schema: ModelSchema, objectId: string) => {
1614
const generics = useAtomValue(genericSchemasAtom);
1715
const profileGenericSchema = generics.find((s) => s.kind === PROFILE_KIND);
1816

19-
const relationshipsTabs = getTabs(schema);
17+
const relationshipsTabs = getRelationshipsVisibleInTab(schema.relationships ?? []);
2018
const columns = getSchemaObjectColumns({ schema });
2119

2220
const isProfileSchema = schema?.namespace === "Profile";

frontend/app/src/entities/nodes/object-item-details/object-item-details-paginated.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ import ObjectItemMetaEdit from "@/entities/nodes/object-item-meta-edit/object-it
66
import {
77
getObjectAttributes,
88
getObjectRelationships,
9-
getTabs,
109
} from "@/entities/nodes/object-items/getSchemaObjectColumns";
1110
import {
1211
ObjectDetailsTab,
1312
ObjectTaskTab,
1413
RelationshipTab,
1514
} from "@/entities/nodes/object/ui/object-tabs";
15+
import { getRelationshipsVisibleInTab } from "@/entities/nodes/object/utils/get-relationships-visible-in-tab";
1616
import { ObjectRelationshipsManager } from "@/entities/nodes/relationships/ui/object-relationships-manager";
1717
import { showMetaEditState } from "@/entities/nodes/stores/metaEditFieldDetails.atom";
1818
import { metaEditFieldDetailsState } from "@/entities/nodes/stores/showMetaEdit.atom";
@@ -82,7 +82,7 @@ export default function ObjectItemDetails({
8282

8383
const attributes = getObjectAttributes({ schema: schema });
8484
const relationships = getObjectRelationships({ schema: schema });
85-
const relationshipsTabs = getTabs(schema);
85+
const relationshipsTabs = getRelationshipsVisibleInTab(schema.relationships ?? []);
8686

8787
useTitle(
8888
objectDetailsData?.display_label

frontend/app/src/entities/nodes/object-items/getSchemaObjectColumns.ts

-21
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {
22
attributesKindForDetailsViewExclude,
33
relationshipsForDetailsView,
44
relationshipsForListView,
5-
relationshipsForTabs,
65
} from "@/config/constants";
76
import { ATTRIBUTE_KINDS_FOR_LIST_VIEW } from "@/entities/schema/constants";
87
import { AttributeKind, ModelSchema } from "@/entities/schema/types";
@@ -77,26 +76,6 @@ export const getObjectRelationships = ({
7776
return relationships;
7877
};
7978

80-
export const getTabs = (schema?: ModelSchema) => {
81-
if (!schema) {
82-
return [];
83-
}
84-
85-
// Relationship kind to show in LIST VIEW - Attribute, Parent
86-
const relationships = (schema.relationships || [])
87-
.filter(
88-
(relationship) =>
89-
relationship.cardinality &&
90-
relationshipsForTabs[relationship.cardinality].includes(relationship.kind)
91-
)
92-
.map((relationship) => ({
93-
label: relationship.label,
94-
name: relationship.name,
95-
}));
96-
97-
return relationships;
98-
};
99-
10079
type tgetSchemaObjectColumns = {
10180
schema?: ModelSchema;
10281
forListView?: boolean;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
import { RelationshipSchema } from "@/entities/schema/types";
2+
import { describe, expect, it } from "vitest";
3+
import { generateRelationshipSchema } from "../../../../../tests/fake/schema";
4+
import { getRelationshipsVisibleInTab } from "./get-relationships-visible-in-tab";
5+
6+
describe("getRelationshipsVisibleInTab", () => {
7+
it("should return relationships with kind Generic and cardinality many", () => {
8+
// GIVEN
9+
const relationships = [generateRelationshipSchema({ kind: "Generic", cardinality: "many" })];
10+
11+
// WHEN
12+
const result = getRelationshipsVisibleInTab(relationships);
13+
14+
// THEN
15+
expect(result).toEqual(relationships);
16+
});
17+
18+
it("should return relationships with kind Component and cardinality many", () => {
19+
// GIVEN
20+
const relationships = [generateRelationshipSchema({ kind: "Component", cardinality: "many" })];
21+
22+
// WHEN
23+
const result = getRelationshipsVisibleInTab(relationships);
24+
25+
// THEN
26+
expect(result).toEqual(relationships);
27+
});
28+
29+
it("should return relationships with kind Hierarchy and cardinality many", () => {
30+
// GIVEN
31+
const relationships = [generateRelationshipSchema({ kind: "Hierarchy", cardinality: "many" })];
32+
33+
// WHEN
34+
const result = getRelationshipsVisibleInTab(relationships);
35+
36+
// THEN
37+
expect(result).toEqual(relationships);
38+
});
39+
40+
it("should return relationships with kind Template and cardinality many", () => {
41+
// GIVEN
42+
const relationships = [generateRelationshipSchema({ kind: "Template", cardinality: "many" })];
43+
44+
// WHEN
45+
const result = getRelationshipsVisibleInTab(relationships);
46+
47+
// THEN
48+
expect(result).toEqual(relationships);
49+
});
50+
51+
it("should not return relationships with cardinality one regardless of kind", () => {
52+
// GIVEN
53+
const relationships = [
54+
generateRelationshipSchema({ kind: "Attribute", cardinality: "one" }),
55+
generateRelationshipSchema({ kind: "Generic", cardinality: "one" }),
56+
generateRelationshipSchema({ kind: "Component", cardinality: "one" }),
57+
generateRelationshipSchema({ kind: "Group", cardinality: "one" }),
58+
generateRelationshipSchema({ kind: "Hierarchy", cardinality: "one" }),
59+
generateRelationshipSchema({ kind: "Parent", cardinality: "one" }),
60+
generateRelationshipSchema({ kind: "Profile", cardinality: "one" }),
61+
generateRelationshipSchema({ kind: "Template", cardinality: "one" }),
62+
];
63+
64+
// WHEN
65+
const result = getRelationshipsVisibleInTab(relationships);
66+
67+
// THEN
68+
expect(result).toEqual([]);
69+
});
70+
71+
it("should not return relationships with kinds not in the visible list", () => {
72+
// GIVEN
73+
const relationships = [
74+
generateRelationshipSchema({ kind: "Attribute", cardinality: "many" }),
75+
generateRelationshipSchema({ kind: "Parent", cardinality: "many" }),
76+
generateRelationshipSchema({ kind: "Group", cardinality: "many" }),
77+
generateRelationshipSchema({ kind: "Profile", cardinality: "many" }),
78+
];
79+
80+
// WHEN
81+
const result = getRelationshipsVisibleInTab(relationships);
82+
83+
// THEN
84+
expect(result).toEqual([]);
85+
});
86+
87+
it("should handle mixed relationships correctly", () => {
88+
// GIVEN
89+
const visibleRelationships = [
90+
generateRelationshipSchema({ kind: "Generic", cardinality: "many" }),
91+
generateRelationshipSchema({ kind: "Component", cardinality: "many" }),
92+
];
93+
const invisibleRelationships = [
94+
generateRelationshipSchema({ kind: "Generic", cardinality: "one" }),
95+
generateRelationshipSchema({ kind: "Attribute", cardinality: "many" }),
96+
];
97+
const relationships = [...visibleRelationships, ...invisibleRelationships];
98+
99+
// WHEN
100+
const result = getRelationshipsVisibleInTab(relationships);
101+
102+
// THEN
103+
expect(result).toEqual(visibleRelationships);
104+
});
105+
106+
it("should return empty array for empty input", () => {
107+
// GIVEN
108+
const relationships: RelationshipSchema[] = [];
109+
110+
// WHEN
111+
const result = getRelationshipsVisibleInTab(relationships);
112+
113+
// THEN
114+
expect(result).toEqual([]);
115+
});
116+
117+
it("should sort relationships by order_weight", () => {
118+
// GIVEN
119+
const templateRel = generateRelationshipSchema({
120+
kind: "Template",
121+
cardinality: "many",
122+
order_weight: 0,
123+
});
124+
const componentRel = generateRelationshipSchema({
125+
kind: "Component",
126+
cardinality: "many",
127+
order_weight: 1,
128+
});
129+
const genericRel = generateRelationshipSchema({
130+
kind: "Generic",
131+
cardinality: "many",
132+
order_weight: 2,
133+
});
134+
const relationships = [genericRel, componentRel, templateRel];
135+
136+
// WHEN
137+
const result = getRelationshipsVisibleInTab(relationships);
138+
139+
// THEN
140+
expect(result).toEqual([templateRel, componentRel, genericRel]);
141+
});
142+
143+
it("should handle undefined order_weight as 0", () => {
144+
// GIVEN
145+
const templateRel = generateRelationshipSchema({
146+
kind: "Template",
147+
cardinality: "many",
148+
order_weight: -1,
149+
});
150+
const componentRel = generateRelationshipSchema({
151+
kind: "Component",
152+
cardinality: "many",
153+
order_weight: undefined,
154+
});
155+
const genericRel = generateRelationshipSchema({
156+
kind: "Generic",
157+
cardinality: "many",
158+
order_weight: 1,
159+
});
160+
const relationships = [genericRel, componentRel, templateRel];
161+
162+
// WHEN
163+
const result = getRelationshipsVisibleInTab(relationships);
164+
165+
// THEN
166+
expect(result).toEqual([templateRel, componentRel, genericRel]);
167+
});
168+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { RelationshipKind } from "@/entities/nodes/types";
2+
import { RelationshipSchema } from "@/entities/schema/types";
3+
4+
const RELATIONSHIP_KIND_VISIBLE_IN_TAB: Array<RelationshipKind> = [
5+
"Generic",
6+
"Component",
7+
"Hierarchy",
8+
"Template",
9+
];
10+
11+
export function isRelationshipVisibleInTab(relationshipSchema: RelationshipSchema): boolean {
12+
if (relationshipSchema.cardinality === "one") {
13+
return false;
14+
}
15+
16+
return RELATIONSHIP_KIND_VISIBLE_IN_TAB.includes(relationshipSchema.kind);
17+
}
18+
19+
export function getRelationshipsVisibleInTab(
20+
relationships: RelationshipSchema[]
21+
): RelationshipSchema[] {
22+
return relationships
23+
.filter(isRelationshipVisibleInTab)
24+
.sort((a, b) => (a.order_weight ?? 0) - (b.order_weight ?? 0));
25+
}

0 commit comments

Comments
 (0)