iipbs_cs #16

Merged
chanii8 merged 44 commits from iipbs_cs into main 2025-04-30 17:09:18 +09:00
5 changed files with 49 additions and 24 deletions
Showing only changes of commit 837f448a7f - Show all commits
@@ -5,6 +5,7 @@ import {
type OrganizationFormData, type OrganizationFormData,
type OrganizationService, type OrganizationService,
type OrganizationTree, type OrganizationTree,
type OrganizationTreeForDnd,
} from "../model/organization-interface"; } from "../model/organization-interface";
export class OrganizationApiService implements OrganizationService { export class OrganizationApiService implements OrganizationService {
@@ -22,8 +23,8 @@ export class OrganizationApiService implements OrganizationService {
return response.data; return response.data;
} }
public async createOrganization(form: OrganizationFormData): Promise<void> { public async createOrganization(data: OrganizationFormData): Promise<void> {
await client.post<void>(`${ENDPOINT.CMS_SERVICE.ORGANIZATIONS}`, form); await client.post<void>(`${ENDPOINT.CMS_SERVICE.ORGANIZATIONS}`, data);
} }
public async deleteOrganization(ognzSn: number): Promise<void> { public async deleteOrganization(ognzSn: number): Promise<void> {
@@ -44,11 +45,20 @@ export class OrganizationApiService implements OrganizationService {
public async updateOrganization( public async updateOrganization(
ognzSn: number, ognzSn: number,
form: OrganizationFormData, data: OrganizationFormData,
): Promise<void> { ): Promise<void> {
await client.put<void>( await client.put<void>(
`${ENDPOINT.CMS_SERVICE.ORGANIZATIONS}/${ognzSn}`, `${ENDPOINT.CMS_SERVICE.ORGANIZATIONS}/${ognzSn}`,
form, data,
);
}
public async updateOrganizationByDnd(
data: OrganizationTreeForDnd,
): Promise<void> {
await client.put<void>(
`${ENDPOINT.CMS_SERVICE.ORGANIZATIONS}/dnd/tree`,
data,
); );
} }
} }
@@ -3,5 +3,6 @@ export {
organizationFormSchema, organizationFormSchema,
type OrganizationTree, type OrganizationTree,
type OrganizationFormData, type OrganizationFormData,
type OrganizationTreeForDnd,
} from "./model/organization-interface"; } from "./model/organization-interface";
export { generateOrganizationTreeData, handleDropNode } from "./lib/utils"; export { generateOrganizationTreeData, handleDropNode } from "./lib/utils";
+18 -17
View File
@@ -1,5 +1,8 @@
import type { DropOptions, NodeModel } from "@minoru/react-dnd-treeview"; import type { DropOptions, NodeModel } from "@minoru/react-dnd-treeview";
import type { OrganizationTree } from "../model/organization-interface"; import type {
OrganizationTree,
OrganizationTreeForDnd,
} from "../model/organization-interface";
export const generateOrganizationTreeData = ( export const generateOrganizationTreeData = (
data: OrganizationTree[], data: OrganizationTree[],
@@ -22,41 +25,39 @@ export const generateOrganizationTreeData = (
}, []); }, []);
}; };
export const generateNewOrganizationTreeData = ( export const generateDndOrganizationTreeData = (
treeData: NodeModel<OrganizationTree>[], treeData: NodeModel<OrganizationTree>[],
options: DropOptions<OrganizationTree>, options: DropOptions<OrganizationTree>,
): OrganizationTree | null => { ): OrganizationTreeForDnd | null => {
const { dragSourceId, dragSource, dropTargetId } = options; const { dragSourceId, dragSource, dropTargetId } = options;
if (!dragSource?.data) return null; if (!dragSource?.data) return null;
const siblings = treeData.filter((node) => node.parent === dropTargetId); const siblings = treeData.filter((node) => node.parent === dropTargetId);
const dragSourceIndex = siblings.findIndex( const dragSourceIndex = siblings.findIndex(
(node) => node.id === dragSourceId, (node) => node.id === dragSourceId,
); );
const prevSibling = siblings[dragSourceIndex - 1]; const prevSibling = siblings[dragSourceIndex - 1];
const newSortSeq = const newSortSeq =
dragSourceIndex === 0 ? 1 : (prevSibling?.data?.sortSeq ?? 0) + 1; dragSourceIndex === 0 ? 1 : (prevSibling?.data?.sortSeq ?? 0) + 1;
const childNodes = treeData.filter( const treeNode: OrganizationTreeForDnd = {
(node) => node.parent === dragSourceId && node.data, ognzSn: dragSource.data.ognzSn,
); ognzNm: dragSource.data.ognzNm,
ognzExpln: dragSource.data.ognzExpln,
const treeNode: OrganizationTree = {
...dragSource.data,
upOgnzSn: dropTargetId === 0 ? null : (dropTargetId as number), upOgnzSn: dropTargetId === 0 ? null : (dropTargetId as number),
sortSeq: newSortSeq, sortSeq: newSortSeq,
}; };
const result: OrganizationTree = { const childNodes = treeData.filter(
(node) => node.parent === dragSourceId && node.data,
);
const result: OrganizationTreeForDnd = {
...treeNode, ...treeNode,
children: children:
childNodes?.map((child) => ({ childNodes?.map((child) => ({
...child.data, ognzSn: child.data?.ognzSn,
ognzNm: child.data?.ognzNm ?? "", ognzNm: child.data?.ognzNm ?? "",
ognzExpln: child.data?.ognzExpln,
upOgnzSn: child.data?.upOgnzSn === 0 ? null : (dragSourceId as number), upOgnzSn: child.data?.upOgnzSn === 0 ? null : (dragSourceId as number),
sortSeq: child.data?.sortSeq ?? 1, sortSeq: child.data?.sortSeq ?? 1,
})) ?? [], })) ?? [],
@@ -66,12 +67,12 @@ export const generateNewOrganizationTreeData = (
}; };
export const handleDropNode = export const handleDropNode =
(callback: (newTree: OrganizationTree) => void) => (callback: (newTree: OrganizationTreeForDnd) => void) =>
( (
newTree: NodeModel<OrganizationTree>[], newTree: NodeModel<OrganizationTree>[],
options: DropOptions<OrganizationTree>, options: DropOptions<OrganizationTree>,
) => { ) => {
const newTreeData = generateNewOrganizationTreeData(newTree, options); const newTreeData = generateDndOrganizationTreeData(newTree, options);
if (!newTreeData) return; if (!newTreeData) return;
callback(newTreeData); callback(newTreeData);
}; };
@@ -18,12 +18,14 @@ export type OrganizationFormData = z.infer<typeof organizationFormSchema>;
export type OrganizationTree = Organization & { export type OrganizationTree = Organization & {
children?: OrganizationTree[]; children?: OrganizationTree[];
}; };
export type OrganizationTreeForDnd = Omit<OrganizationTree, "useYn">;
export interface OrganizationService { export interface OrganizationService {
getOrganizationsTreeList(): Promise<OrganizationTree[]>; getOrganizationsTreeList(): Promise<OrganizationTree[]>;
getOrganizationInfo(ognzSn: number): Promise<Organization>; getOrganizationInfo(ognzSn: number): Promise<Organization>;
createOrganization(form: OrganizationFormData): Promise<void>; createOrganization(data: OrganizationFormData): Promise<void>;
deleteOrganization(ognzSn: number): Promise<void>; deleteOrganization(ognzSn: number): Promise<void>;
updateOrganizationName(ognzSn: number, name: string): Promise<Organization>; updateOrganizationName(ognzSn: number, name: string): Promise<Organization>;
updateOrganization(ognzSn: number, form: OrganizationFormData): Promise<void>; updateOrganization(ognzSn: number, data: OrganizationFormData): Promise<void>;
updateOrganizationByDnd(data: OrganizationTreeForDnd): Promise<void>;
} }
@@ -15,6 +15,7 @@ import {
handleDropNode, handleDropNode,
type OrganizationFormData, type OrganizationFormData,
type OrganizationTree, type OrganizationTree,
type OrganizationTreeForDnd,
} from "@/entities/organization"; } from "@/entities/organization";
import { ENDPOINT } from "@/shared/config"; import { ENDPOINT } from "@/shared/config";
import { useAlertStore } from "@/shared/lib/use-alert-store"; import { useAlertStore } from "@/shared/lib/use-alert-store";
@@ -95,6 +96,16 @@ function OrganizationPage() {
}, },
}); });
const { mutateAsync: updateOrganizationByDnd } = useMutation({
mutationFn: (data: OrganizationTreeForDnd) =>
OrganizationApi.updateOrganizationByDnd(data),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: [ENDPOINT.CMS_SERVICE.ORGANIZATIONS],
});
},
});
const form = useForm<OrganizationFormData>({ const form = useForm<OrganizationFormData>({
resolver: zodResolver(organizationFormSchema), resolver: zodResolver(organizationFormSchema),
defaultValues: { defaultValues: {
@@ -199,7 +210,7 @@ function OrganizationPage() {
/> />
)} )}
handleSelectNode={handleNodeSelect} handleSelectNode={handleNodeSelect}
handleDropNode={handleDropNode(console.log)} handleDropNode={handleDropNode(updateOrganizationByDnd)}
updateNodeName={async (id, name) => { updateNodeName={async (id, name) => {
await updateOrganizationName({ ognzSn: id as number, name }); await updateOrganizationName({ ognzSn: id as number, name });
}} }}