Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 31 additions & 52 deletions Website/components/datamodelview/entity/CascadeConfiguration.tsx
Original file line number Diff line number Diff line change
@@ -1,65 +1,44 @@
'use client'

import { Tooltip } from "@mui/material";
import { CascadeConfigurationType, CascadeType } from "@/lib/Types";

export function CascadeConfiguration({ config }: { config: CascadeConfigurationType | null }): JSX.Element {
if (!config) {
return <span>None</span>
}
const actions = ["Assign", "Reparent", "Delete", "Share", "Unshare", "Merge", "Archive", "RollupView"] as const;
const configurableActions = ["Assign", "Reparent", "Share", "Unshare"] as const;

if (isReferential(config)) {
return <span>Referential</span>
export function getRelationshipBehavior(config: CascadeConfigurationType): "Referential" | "Parental" | "Custom" {
// Merge depends on table support; Archive and RollupView are independent settings.
// They remain visible in the details without changing the behavior family.
if (configurableActions.every(action => config[action] === CascadeType.None) &&
(config.Delete === CascadeType.RemoveLink || config.Delete === CascadeType.Restrict)) {
return "Referential";
}

if (isReferentialRestrictDelete(config)) {
return <span>Referential, Restrict Delete</span>
if (configurableActions.every(action => config[action] === CascadeType.Cascade) &&
config.Delete === CascadeType.Cascade) {
return "Parental";
}
return "Custom";
}

if (isParential(config)) {
return <span>Parential</span>
export function CascadeConfiguration({ config }: { config: CascadeConfigurationType | null }): JSX.Element {
if (!config) {
return <span>None</span>
}

return (
<div className="grid grid-cols-[auto_1fr] gap-x-2 whitespace-nowrap">
<span>Assign:</span>
<span>{CascadeType[config.Assign]}</span>
<span>Reparent:</span>
<span>{CascadeType[config.Reparent]}</span>
<span>Delete:</span>
<span>{CascadeType[config.Delete]}</span>
<span>Share:</span>
<span>{CascadeType[config.Share]}</span>
<span>Unshare:</span>
<span>{CascadeType[config.Unshare]}</span>
<span>Merge:</span>
<span>{CascadeType[config.Merge]}</span>
</div>
<Tooltip describeChild title={
<dl className="grid grid-cols-[auto_1fr] gap-x-2 whitespace-nowrap">
{actions.map(action => (
<div key={action} className="contents">
<dt>{action === "RollupView" ? "Rollup View" : action}:</dt>
<dd>{config[action] == null ? "Not specified" : CascadeType[config[action]] ?? `Unknown (${config[action]})`}</dd>
</div>
))}
</dl>
}>
<span tabIndex={0} className="cursor-help underline decoration-dotted underline-offset-4">
{getRelationshipBehavior(config)}
</span>
</Tooltip>
)
}

function isReferential(config: CascadeConfigurationType): boolean {
return config.Assign === CascadeType.None &&
config.Delete === CascadeType.RemoveLink &&
config.Merge === CascadeType.None &&
config.Reparent === CascadeType.None &&
config.Share === CascadeType.None &&
config.Unshare === CascadeType.None;
}

function isReferentialRestrictDelete(config: CascadeConfigurationType): boolean {
return config.Assign === CascadeType.None &&
config.Delete === CascadeType.Restrict &&
config.Merge === CascadeType.None &&
config.Reparent === CascadeType.None &&
config.Share === CascadeType.None &&
config.Unshare === CascadeType.None;
}

function isParential(config: CascadeConfigurationType): boolean {
return config.Assign === CascadeType.Cascade &&
config.Delete === CascadeType.Cascade &&
config.Merge === CascadeType.None &&
config.Reparent === CascadeType.Cascade &&
config.Share === CascadeType.Cascade &&
config.Unshare === CascadeType.Cascade;
}
Loading