Core.Blueprint.UI.Web/src/app/role/[id]/page.tsx
Sergio Matias Urquin 3609d1fa20 first commit
2025-04-29 18:47:35 -06:00

386 lines
11 KiB
TypeScript

"use client";
import { createRole, updateRole, useRoleItem } from "@/hooks/role";
import { Module, Permission, Role } from "@/lib/interfaces";
import { usePathname, useRouter } from "next/navigation";
import Link from "next/link";
import { useEffect, useState } from "react";
import { Status } from "@/lib/Enums";
import { Applications } from "@/lib/Enums";
import { usePermissionItems } from "@/hooks/permission";
import { useModuleItems } from "@/hooks/module";
export default function RoleDetails() {
const [item, setItem] = useState<Role>();
const pathName = usePathname();
const router = useRouter();
let isUpdateMode = false;
let selectedApplications: string[];
const [permissions, setPermissions] = useState<Permission[]>([]);
const [modules, setModules] = useState<Module[]>([]);
let initialPermissions: string[];
let initialApplications: string[];
let initialModules: string[];
const setSelectedValuesGlobal = (values: string[]) => {
selectedApplications = values;
};
let selectedPermissions: string[];
const setSelectedPermissionsGlobal = (values: string[]) => {
selectedPermissions = values;
};
let selectedModules: string[];
const setSelectedModulesGlobal = (values: string[]) => {
selectedModules = values;
};
const formatDate = (date: Date) =>
new Intl.DateTimeFormat("en-US").format(date);
const StatusDropDown = (data: any) => {
return (
<select
id="status"
className="p-3 rounded"
defaultValue={data.statusCode}
>
<option value={Status.Active}>{Status.Active}</option>
<option value={Status.Inactive}>{Status.Inactive}</option>
<option value={Status.Deleted}>{Status.Deleted}</option>
</select>
);
};
const ApplicationsDropDown = ({
selectedApplications,
}: {
selectedApplications: string[];
}) => {
const [localSelectedValues, setLocalSelectedValues] =
useState<string[]>(selectedApplications);
const handleSelection = (event: React.ChangeEvent<HTMLSelectElement>) => {
const selectedOptions = Array.from(event.target.selectedOptions);
const values = selectedOptions.map((option) => option.value);
setLocalSelectedValues(values);
setSelectedValuesGlobal(values);
};
return (
<select
id="applications"
className="p-3 rounded"
multiple
value={localSelectedValues}
onChange={handleSelection}
>
<option value={Applications.LSAWebPortal}>
{Applications.LSAWebPortal}
</option>
<option value={Applications.CustomerDashboard}>
CustomerDashboard
</option>
<option value={Applications.Discover}>{Applications.Discover}</option>
<option value={Applications.LSAMobile}>{Applications.LSAMobile}</option>
<option value={Applications.BluePrint}>{Applications.BluePrint}</option>
</select>
);
};
const PermissionsDropDown = ({
selectedPermissions,
}: {
selectedPermissions: string[];
}) => {
const [localSelectedValues, setLocalSelectedValues] =
useState<string[]>(selectedPermissions);
useEffect(() => {
setLocalSelectedValues(selectedPermissions);
}, [selectedPermissions]);
const handleSelection = (event: React.ChangeEvent<HTMLSelectElement>) => {
const selectedOptions = Array.from(event.target.selectedOptions);
const values = selectedOptions.map((option) => option.value);
setLocalSelectedValues(values);
setSelectedPermissionsGlobal(values);
};
if (!selectedPermissions) setSelectedPermissionsGlobal(selectedPermissions);
return (
<select
id="permissions"
className="p-3 rounded"
multiple
value={localSelectedValues}
onChange={handleSelection}
>
{permissions.map((permission) => (
<option key={permission.id} value={`${permission.id}`}>
{permission.name} ({permission.accessLevel})
</option>
))}
</select>
);
};
const ModulesDropDown = ({
selectedModules,
}: {
selectedModules: string[];
}) => {
const [localSelectedValues, setLocalSelectedValues] =
useState<string[]>(selectedModules);
useEffect(() => {
setLocalSelectedValues(selectedModules);
}, [selectedModules]);
const handleSelection = (event: React.ChangeEvent<HTMLSelectElement>) => {
const selectedOptions = Array.from(event.target.selectedOptions);
const values = selectedOptions.map((option) => option.value);
setLocalSelectedValues(values);
setSelectedModulesGlobal(values);
};
if (!selectedModules) setSelectedModulesGlobal(selectedModules);
return (
<select
id="modules"
className="p-3 rounded"
multiple
value={localSelectedValues}
onChange={handleSelection}
>
{modules.map((module) => (
<option key={module.id} value={`${module.id}`}>
{module.name} ({module.application})
</option>
))}
</select>
);
};
const handleSaveClick = () => {
let id = (document.getElementById("id") as HTMLInputElement)?.value;
let name = (document.getElementById("name") as HTMLInputElement)?.value;
let description = (
document.getElementById("description") as HTMLInputElement
)?.value;
let applications = selectedApplications
? selectedApplications
: initialApplications;
let permissions = selectedPermissions
? selectedPermissions
: initialPermissions;
let modules = selectedModules ? selectedModules : initialModules;
let status = (document.getElementById("status") as HTMLSelectElement)
?.value;
let updatedRole = {
id,
name,
description,
applications,
permissions,
modules,
status,
} as unknown as Role;
if (isUpdateMode) {
updateRole(updatedRole);
} else {
updatedRole.id = null;
createRole(updatedRole);
}
setItem(updatedRole);
router.push("/role");
};
const renderForm = (role: Role) => {
return (
<>
<div className="flex flex-col p-5">
<label>Id:</label>
<div className="flex pt-2 flex-col">
<input
id="id"
className="p-2 rounded"
type="text"
defaultValue={role.id ?? ""}
readOnly
placeholder={role.id ?? ""}
/>
</div>
</div>
<div className="flex flex-col p-5">
<label>Name:</label>
<div className="flex pt-2 flex-col">
<input
id="name"
className="p-2 rounded"
type="text"
defaultValue={role.name}
/>
</div>
</div>
<div className="flex flex-col p-5">
<label>Description:</label>
<div className="flex pt-2 flex-col">
<input
id="description"
className="p-2 rounded"
type="text"
defaultValue={role.description}
/>
</div>
</div>
<div className="flex flex-col p-5">
<label>Applications:</label>
<div className="flex pt-2 flex-col">
<ApplicationsDropDown selectedApplications={role.applications} />
</div>
</div>
<div className="flex flex-col p-5">
<label>Permissions:</label>
<div className="flex pt-2 flex-col">
<PermissionsDropDown selectedPermissions={role.permissions} />
</div>
</div>
<div className="flex flex-col p-5">
<label>Modules:</label>
<div className="flex pt-2 flex-col">
<ModulesDropDown selectedModules={role.modules} />
</div>
</div>
<div className="flex flex-col p-5">
<label>CreatedAt:</label>
<div className="flex pt-2 flex-col">
<input
id="createdAt"
className="p-2 rounded"
type="text"
readOnly
defaultValue={formatDate(new Date(role.createdAt))}
/>
</div>
</div>
<div className="flex flex-col p-5">
<label>CreatedBy:</label>
<div className="flex pt-2 flex-col">
<input
id="createdBy"
className="p-2 rounded"
type="text"
readOnly
defaultValue={role.createdBy}
/>
</div>
</div>
<div className="flex flex-col p-5">
<label>UpdatedAt:</label>
<div className="flex pt-2 flex-col">
<input
id="updatedAt"
className="p-2 rounded"
type="text"
readOnly
defaultValue={formatDate(new Date(role.updatedAt))}
/>
</div>
</div>
<div className="flex flex-col p-5">
<label>UpdatedBy:</label>
<div className="flex pt-2 flex-col">
<input
id="updatedBy"
className="p-2 rounded"
type="text"
readOnly
defaultValue={role.updatedBy}
/>
</div>
</div>
<div className="flex flex-col p-5">
<label>Status:</label>
<div className="flex pt-2 flex-col">
<StatusDropDown statusCode={role.status}></StatusDropDown>
</div>
</div>
</>
);
};
const ItemData = () => {
const id = pathName.split("/");
const idValue = id[id.length - 1];
isUpdateMode = idValue != "create";
if (isUpdateMode) {
const { item, isLoading, error } = useRoleItem(idValue);
const {
items: permissionItems,
error: permissionError,
isLoading: isPermissionLoading,
mutate: mutatePermission,
} = usePermissionItems();
const {
items: moduleItems,
error: moduleError,
isLoading: isModuleLoading,
mutate: mutateModule,
} = useModuleItems();
initialApplications = item.applications;
initialPermissions = item.permissions;
initialModules = item.modules;
useEffect(() => {
if (permissionItems && permissionItems.length > 0) {
setPermissions(permissionItems); // Solo actualiza si hay cambios
}
}, [permissionItems]); // Solo se ejecuta si permissionItems cambia
useEffect(() => {
if (moduleItems && moduleItems.length > 0) {
setModules(moduleItems); // Solo actualiza si hay cambios
}
}, [moduleItems]);
if (!isLoading && !error && item) {
return renderForm(item);
} else return <>Loading</>;
} else {
return renderForm({
id: "",
name: "",
description: "",
applications: [],
permissions: [],
modules: [],
status: Status.Active,
createdAt: new Date(),
createdBy: "",
updatedAt: new Date(),
updatedBy: "",
});
}
};
return (
<div id="formContainer" className="flex flex-col">
<div>
<ItemData></ItemData>
<div className="flex flex-row justify-center pb-10">
<a onClick={handleSaveClick} className="button saveBtn">
Save
</a>
<Link className="button cancelBtn" href="../role">
Cancel
</Link>
</div>
</div>
</div>
);
}