Skip to content

Commit 4217f0f

Browse files
pa-lembilalabbad
andauthored
Display "dissociate" action only if possible on relationships table's row actions (#6373)
* enable dissocate action only for optional relationships * add fragment * add count * dissociate if min_count is fine * rename variable and fix edit form * add edit relationship test + use branch * fix dissociate checks * update fragment * update dissociate action * add comment * rename file and update import * update logic * fix dissociate check * update check * add mock data * add test * update comment * rename files, update types * add generic use case * remove old mock data * use utils function * refactor dissociate check * Fix ts errors + improved code logic with early return * added tests * more tests * made usage simplier and added more tests * lint * cleaning --------- Co-authored-by: bilalabbad <[email protected]>
1 parent 968b3c5 commit 4217f0f

File tree

9 files changed

+778
-5177
lines changed

9 files changed

+778
-5177
lines changed

changelog/+dissociate.fixed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Display "dissociate" action only if possible on relationships table's row actions

frontend/app/src/entities/nodes/relationships/ui/relationship-table/get-relationship-actions-column.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ export type GetRelationshipActionsColumnParams = {
99
parentKind: string;
1010
relationshipName: string;
1111
permission: Permission;
12+
relationshipsCount: number;
1213
};
1314

1415
export function getRelationshipActionsColumn({
1516
parentId,
1617
parentKind,
1718
relationshipName,
1819
permission,
20+
relationshipsCount,
1921
}: GetRelationshipActionsColumnParams): ColumnDef<NodeObject> {
2022
return {
2123
id: "actions",
@@ -30,6 +32,7 @@ export function getRelationshipActionsColumn({
3032
relationshipKind={row.original.__typename as string}
3133
relationshipLabel={row.getValue("id") as string}
3234
relationshipId={row.original.id as string}
35+
relationshipsCount={relationshipsCount}
3336
/>
3437
);
3538
},

frontend/app/src/entities/nodes/relationships/ui/relationship-table/relationship-actions-cell.tsx

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import ObjectItemEditComponent from "@/entities/nodes/object-item-edit/object-item-edit-paginated";
22
import { DissociateRelationshipsModal } from "@/entities/nodes/relationships/ui/dissociate-relationships-modal";
33
import { RelationshipProperties } from "@/entities/nodes/relationships/ui/relationship-properties";
4+
import { canDissociateRelationship } from "@/entities/nodes/relationships/utils/can-dissociate-relationship";
45
import { Permission } from "@/entities/permission/types";
56
import { useSchema } from "@/entities/schema/ui/hooks/useSchema";
67
import { queryClient } from "@/shared/api/rest/client";
@@ -27,6 +28,7 @@ export interface ActionsCellProps {
2728
relationshipKind: string;
2829
relationshipLabel: string;
2930
relationshipName: string;
31+
relationshipsCount: number;
3032
}
3133

3234
export function RelationshipActionsCell({
@@ -37,14 +39,24 @@ export function RelationshipActionsCell({
3739
relationshipLabel,
3840
relationshipKind,
3941
relationshipName,
42+
relationshipsCount,
4043
}: ActionsCellProps) {
4144
const [showPropertiesModal, setShowPropertiesModal] = useState(false);
4245
const [showEditForm, setShowEditForm] = useState(false);
4346
const [showDissociateModal, setShowDissociateModal] = useState(false);
44-
const { schema } = useSchema(relationshipKind);
45-
const isEditAllowed = permission.update.isAllowed;
4647

47-
if (!schema) return <ErrorScreen message={`Schema not found for ${relationshipKind}`} />;
48+
const { schema: parentSchema } = useSchema(parentKind);
49+
50+
if (!parentSchema) {
51+
return <ErrorScreen message={`Schema not found for ${relationshipKind}`} />;
52+
}
53+
54+
const isEditAllowed = permission.update.isAllowed;
55+
const isDissociateAllowed = canDissociateRelationship({
56+
parentSchema,
57+
relationshipName,
58+
relationshipsCount,
59+
});
4860

4961
return (
5062
<Popover open={showPropertiesModal} onOpenChange={setShowPropertiesModal}>
@@ -82,17 +94,19 @@ export function RelationshipActionsCell({
8294
</div>
8395
</Tooltip>
8496

85-
<Tooltip enabled={!isEditAllowed} content={permission.update.message} side="left">
86-
<div>
87-
<DropdownMenuItem
88-
disabled={!isEditAllowed}
89-
onClick={() => isEditAllowed && setShowDissociateModal(true)}
90-
>
91-
<Icon icon="mdi:link-variant-remove" className="text-base" />
92-
Dissociate
93-
</DropdownMenuItem>
94-
</div>
95-
</Tooltip>
97+
{isDissociateAllowed && (
98+
<Tooltip enabled={!isEditAllowed} content={permission.update.message} side="left">
99+
<div>
100+
<DropdownMenuItem
101+
disabled={!isEditAllowed}
102+
onClick={() => isEditAllowed && setShowDissociateModal(true)}
103+
>
104+
<Icon icon="mdi:link-variant-remove" className="text-base" />
105+
Dissociate
106+
</DropdownMenuItem>
107+
</div>
108+
</Tooltip>
109+
)}
96110
</DropdownMenuContent>
97111
</DropdownMenu>
98112
</TableCell>
@@ -110,7 +124,7 @@ export function RelationshipActionsCell({
110124
<SlideOver
111125
title={
112126
<SlideOverTitle
113-
schema={schema}
127+
schema={parentSchema}
114128
currentObjectLabel={relationshipLabel}
115129
title={`Edit ${relationshipLabel}`}
116130
/>

frontend/app/src/entities/nodes/relationships/ui/relationship-table/relationship-table.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export function RelationshipTable({
3030
...props,
3131
});
3232

33+
const flatData = React.useMemo(() => data?.pages?.flat() ?? [], [data]);
34+
3335
const columns = React.useMemo(() => {
3436
return [
3537
...getObjectTableColumns(relationshipSchema, { disabled: true }),
@@ -38,10 +40,10 @@ export function RelationshipTable({
3840
parentKind,
3941
relationshipName,
4042
permission: PERMISSION_ALLOW_ALL,
43+
relationshipsCount: flatData.length,
4144
}),
4245
];
43-
}, [relationshipSchema.hash]);
44-
const flatData = React.useMemo(() => data?.pages?.flat() ?? [], [data]);
46+
}, [relationshipSchema.hash, flatData.length]);
4547

4648
return (
4749
<InfiniteDataTable

0 commit comments

Comments
 (0)