Skip to content

Commit fcaa72f

Browse files
committed
Improve SN site deletion and UI consistency
Adds @transactional to SN site deletion API and ensures related facet entities are deleted via cascade. Refactors navigation menu initialization in the SN site page to handle new and existing sites correctly. Updates dialog and sidebar components for improved styling and import consistency.
1 parent ff9a7cc commit fcaa72f

File tree

5 files changed

+92
-62
lines changed

5 files changed

+92
-62
lines changed

turing-app/src/main/java/com/viglet/turing/api/sn/console/TurSNSiteAPI.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import org.springframework.context.annotation.ComponentScan;
3030
import org.springframework.http.MediaType;
31+
import org.springframework.transaction.annotation.Transactional;
3132
import org.springframework.web.bind.annotation.DeleteMapping;
3233
import org.springframework.web.bind.annotation.GetMapping;
3334
import org.springframework.web.bind.annotation.PathVariable;
@@ -47,6 +48,7 @@
4748
import com.viglet.turing.persistence.model.sn.genai.TurSNSiteGenAi;
4849
import com.viglet.turing.persistence.model.sn.locale.TurSNSiteLocale;
4950
import com.viglet.turing.persistence.repository.sn.TurSNSiteRepository;
51+
import com.viglet.turing.persistence.repository.sn.field.TurSNSiteFieldExtFacetRepository;
5052
import com.viglet.turing.persistence.repository.sn.genai.TurSNSiteGenAiRepository;
5153
import com.viglet.turing.persistence.repository.sn.locale.TurSNSiteLocaleRepository;
5254
import com.viglet.turing.properties.TurConfigProperties;
@@ -71,6 +73,7 @@
7173
public class TurSNSiteAPI {
7274
private final TurSNSiteRepository turSNSiteRepository;
7375
private final TurSNSiteLocaleRepository turSNSiteLocaleRepository;
76+
private final TurSNSiteFieldExtFacetRepository turSNSiteFieldExtFacetRepository;
7477
private final TurSNSiteGenAiRepository turSNSiteGenAiRepository;
7578
private final TurSNSiteExport turSNSiteExport;
7679
private final TurSNTemplate turSNTemplate;
@@ -81,6 +84,7 @@ public class TurSNSiteAPI {
8184

8285
public TurSNSiteAPI(TurSNSiteRepository turSNSiteRepository,
8386
TurSNSiteLocaleRepository turSNSiteLocaleRepository,
87+
TurSNSiteFieldExtFacetRepository turSNSiteFieldExtFacetRepository,
8488
TurSNSiteGenAiRepository turSNSiteGenAiRepository,
8589
TurSNSiteExport turSNSiteExport,
8690
TurSNTemplate turSNTemplate,
@@ -90,6 +94,7 @@ public TurSNSiteAPI(TurSNSiteRepository turSNSiteRepository,
9094
TurConfigProperties turConfigProperties) {
9195
this.turSNSiteRepository = turSNSiteRepository;
9296
this.turSNSiteLocaleRepository = turSNSiteLocaleRepository;
97+
this.turSNSiteFieldExtFacetRepository = turSNSiteFieldExtFacetRepository;
9398
this.turSNSiteGenAiRepository = turSNSiteGenAiRepository;
9499
this.turSNSiteExport = turSNSiteExport;
95100
this.turSNTemplate = turSNTemplate;
@@ -172,8 +177,9 @@ public TurSNSite turSNSiteUpdate(@PathVariable String id, @RequestBody TurSNSite
172177

173178
}
174179

180+
@Transactional
181+
@Operation(summary = "Delete a Semantic Navigation Site")
175182
@DeleteMapping("/{id}")
176-
177183
public boolean turSNSiteDelete(@PathVariable String id) {
178184
Optional<TurSNSite> turSNSite = turSNSiteRepository.findById(id);
179185
turSNSite.ifPresent(

turing-app/src/main/java/com/viglet/turing/persistence/model/sn/field/TurSNSiteFieldExt.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import java.util.HashSet;
2727
import java.util.Set;
2828

29+
import org.hibernate.annotations.OnDelete;
30+
import org.hibernate.annotations.OnDeleteAction;
2931
import org.hibernate.annotations.UuidGenerator;
3032

3133
import com.fasterxml.jackson.annotation.JsonBackReference;
@@ -76,8 +78,10 @@ public class TurSNSiteFieldExt implements Serializable {
7678
private String description;
7779
@Column(length = 50)
7880
private String facetName;
81+
7982
@Builder.Default
8083
@OneToMany(mappedBy = "turSNSiteFieldExt", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
84+
@OnDelete(action = OnDeleteAction.CASCADE)
8185
private Set<TurSNSiteFieldExtFacet> facetLocales = new HashSet<>();
8286
@Builder.Default
8387
@Column

turing-react/src/app/console/sn/sn.site.page.tsx

Lines changed: 73 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,62 +18,16 @@ import {
1818
import { useEffect, useState } from "react";
1919
import { useNavigate, useParams } from "react-router-dom";
2020
import { toast } from "sonner";
21-
22-
const turSNSiteService = new TurSNSiteService();
23-
const data = {
21+
let data = {
2422
navMain: [
2523
{
2624
title: "Settings",
2725
url: "/detail",
2826
icon: IconSettings,
29-
},
30-
{
31-
title: "Multi Languages",
32-
url: "/locale",
33-
icon: IconLanguage,
34-
},
35-
{
36-
title: "Fields",
37-
url: "/field",
38-
icon: IconAlignBoxCenterStretch,
39-
},
40-
{
41-
title: "Behavior",
42-
url: "/behavior",
43-
icon: IconScale,
44-
},
45-
{
46-
title: "Facet Ordering",
47-
url: "/facet-ordering",
48-
icon: IconReorder,
49-
},
50-
{
51-
title: "Generative AI",
52-
url: "/ai",
53-
icon: IconCpu2,
54-
},
55-
{
56-
title: "Result Ranking",
57-
url: "/result-ranking",
58-
icon: IconNumber123,
59-
},
60-
{
61-
title: "Merge Providers",
62-
url: "/merge-providers",
63-
icon: IconGitMerge,
64-
},
65-
{
66-
title: "Spotlight",
67-
url: "/spotlight",
68-
icon: IconSpeakerphone,
69-
},
70-
{
71-
title: "Top Search Terms",
72-
url: "/top-terms",
73-
icon: IconDashboard,
74-
},
75-
],
76-
}
27+
}]
28+
};
29+
const turSNSiteService = new TurSNSiteService();
30+
7731
export default function SNSitePage() {
7832
const { id } = useParams() as { id: string };
7933
const [snSite, setSnSite] = useState<TurSNSite>({} as TurSNSite);
@@ -83,17 +37,83 @@ export default function SNSitePage() {
8337
const urlBase = `${ROUTES.SN_INSTANCE}/${id}`;
8438
useEffect(() => {
8539
if (id !== "new") {
40+
data = {
41+
navMain: [
42+
{
43+
title: "Settings",
44+
url: "/detail",
45+
icon: IconSettings,
46+
},
47+
{
48+
title: "Multi Languages",
49+
url: "/locale",
50+
icon: IconLanguage,
51+
},
52+
{
53+
title: "Fields",
54+
url: "/field",
55+
icon: IconAlignBoxCenterStretch,
56+
},
57+
{
58+
title: "Behavior",
59+
url: "/behavior",
60+
icon: IconScale,
61+
},
62+
{
63+
title: "Facet Ordering",
64+
url: "/facet-ordering",
65+
icon: IconReorder,
66+
},
67+
{
68+
title: "Generative AI",
69+
url: "/ai",
70+
icon: IconCpu2,
71+
},
72+
{
73+
title: "Result Ranking",
74+
url: "/result-ranking",
75+
icon: IconNumber123,
76+
},
77+
{
78+
title: "Merge Providers",
79+
url: "/merge-providers",
80+
icon: IconGitMerge,
81+
},
82+
{
83+
title: "Spotlight",
84+
url: "/spotlight",
85+
icon: IconSpeakerphone,
86+
},
87+
{
88+
title: "Top Search Terms",
89+
url: "/top-terms",
90+
icon: IconDashboard,
91+
},
92+
],
93+
}
8694
turSNSiteService.get(id).then(setSnSite);
8795
setIsNew(false);
8896
}
97+
else {
98+
setSnSite({} as TurSNSite);
99+
setIsNew(true);
100+
data = {
101+
navMain: [
102+
{
103+
title: "Settings",
104+
url: "/detail",
105+
icon: IconSettings,
106+
}]
107+
};
108+
}
109+
89110
}, [id])
90111

91112
async function onDelete() {
92-
console.log("delete");
93113
try {
94114
if (await turSNSiteService.delete(snSite)) {
95115
toast.success(`The ${snSite.name} Search Engine was deleted`);
96-
navigate(urlBase);
116+
navigate(`${ROUTES.SN_INSTANCE}`);
97117
} else {
98118
toast.error(`The ${snSite.name} Search Engine was not deleted`);
99119
}

turing-react/src/components/dialog.delete.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Button } from "./ui/button";
2-
import React, { type Dispatch, type SetStateAction } from "react";
31
import { IconTrash } from "@tabler/icons-react";
2+
import React, { type Dispatch, type SetStateAction } from "react";
3+
import { Button } from "./ui/button";
44
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "./ui/dialog";
55

66
interface Props {
@@ -17,7 +17,7 @@ export const DialogDelete: React.FC<Props> = ({ feature, name, onDelete, open, s
1717
<DialogTrigger asChild>
1818
<Button variant={"outline"} className="mr-5"><IconTrash /></Button>
1919
</DialogTrigger>
20-
<DialogContent className="sm:max-w-[450px]">
20+
<DialogContent className="sm:max-w-150">
2121
<DialogHeader>
2222
<DialogTitle>Are you absolutely sure?</DialogTitle>
2323
<DialogDescription>
@@ -28,7 +28,7 @@ export const DialogDelete: React.FC<Props> = ({ feature, name, onDelete, open, s
2828
This action cannot be undone. This will permanently delete
2929
the {name} {feature}.
3030
</p>
31-
<DialogFooter>
31+
<DialogFooter className="sm:justify-center">
3232
<Button onClick={onDelete} variant="destructive">I understand
3333
the consequences, delete this {feature}</Button>
3434
</DialogFooter>

turing-react/src/components/sub.page.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { NavLink, Outlet, useLocation } from "react-router-dom";
21
import React, { type Dispatch, type SetStateAction } from "react";
2+
import { NavLink, Outlet, useLocation } from "react-router-dom";
3+
import { DialogDelete } from "./dialog.delete";
34
import { Card } from "./ui/card";
45
import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuButton, SidebarMenuItem, SidebarProvider } from "./ui/sidebar";
5-
import { DialogDelete } from "./dialog.delete";
66

77
interface NavMainItem {
88
title: string;
@@ -46,9 +46,9 @@ export const SubPage: React.FC<Props> = ({ icon: Icon, feature, name, urlBase, i
4646
<SidebarMenuItem>
4747
<SidebarMenuButton
4848
asChild
49-
className="data-[slot=sidebar-menu-button]:!p-1.5">
49+
className="data-[slot=sidebar-menu-button]:p-1.5!">
5050
<NavLink to="/admin">
51-
<Icon className="!size-5" />
51+
<Icon className="size-5!" />
5252
{isNew ? (<span
5353
className="text-base font-semibold">New {feature}</span>) : (
5454
<span className="text-base font-semibold">{name}</span>)}

0 commit comments

Comments
 (0)