feat: add createAuditLog endpoint and integrate audit logging for screen copy operations

- Implemented a new endpoint for creating audit logs directly from the frontend, allowing for detailed tracking of actions related to screen copying.
- Enhanced the existing screen management functionality by removing redundant audit logging within the copy operations and centralizing it through the new createAuditLog endpoint.
- Updated the frontend to log group copy actions, capturing relevant details such as resource type, resource ID, and changes made during the operation.

Made-with: Cursor
This commit is contained in:
kjs
2026-03-12 10:41:57 +09:00
parent 014979bebf
commit f65b57410c
7 changed files with 98 additions and 68 deletions

View File

@@ -429,29 +429,31 @@ export function TabsWidget({
})) as any;
return (
<ResponsiveGridRenderer
components={componentDataList}
canvasWidth={canvasWidth}
canvasHeight={canvasHeight}
renderComponent={(comp) => (
<DynamicComponentRenderer
{...restProps}
component={comp}
formData={formData}
onFormDataChange={onFormDataChange}
menuObjid={menuObjid}
isDesignMode={false}
isInteractive={true}
selectedRowsData={localSelectedRowsData}
onSelectedRowsChange={handleSelectedRowsChange}
parentTabId={tab.id}
parentTabsComponentId={component.id}
{...(screenInfoMap[tab.id]
? { tableName: screenInfoMap[tab.id].tableName, screenId: screenInfoMap[tab.id].id }
: {})}
/>
)}
/>
<div className="flex min-h-0 flex-1 flex-col">
<ResponsiveGridRenderer
components={componentDataList}
canvasWidth={canvasWidth}
canvasHeight={canvasHeight}
renderComponent={(comp) => (
<DynamicComponentRenderer
{...restProps}
component={comp}
formData={formData}
onFormDataChange={onFormDataChange}
menuObjid={menuObjid}
isDesignMode={false}
isInteractive={true}
selectedRowsData={localSelectedRowsData}
onSelectedRowsChange={handleSelectedRowsChange}
parentTabId={tab.id}
parentTabsComponentId={component.id}
{...(screenInfoMap[tab.id]
? { tableName: screenInfoMap[tab.id].tableName, screenId: screenInfoMap[tab.id].id }
: {})}
/>
)}
/>
</div>
);
};
@@ -496,7 +498,7 @@ export function TabsWidget({
</TabsList>
</div>
<div className="relative flex-1 overflow-auto">
<div className="relative flex flex-1 flex-col overflow-auto">
{visibleTabs.map((tab) => {
const shouldRender = mountedTabs.has(tab.id);
const isActive = selectedTab === tab.id;
@@ -506,7 +508,7 @@ export function TabsWidget({
key={tab.id}
value={tab.id}
forceMount
className={cn("h-full overflow-auto", !isActive && "hidden")}
className={cn("flex min-h-0 flex-1 flex-col overflow-auto", !isActive && "hidden")}
>
{shouldRender && renderTabContent(tab)}
</TabsContent>