Compare commits

..

7 Commits

Author SHA1 Message Date
gpt-engineer-app[bot]
6087b54213 Changes 2025-11-12 15:23:55 +00:00
gpt-engineer-app[bot]
68384156ab Fix selective-approval RPC params
Update edge function to call process_approval_transaction with correct parameters:
- remove p_trace_id and p_parent_span_id
- add p_approval_mode: 'selective' and p_idempotency_key: idempotencyKey
This aligns with database function signature and resolves 500 error.

X-Lovable-Edit-ID: edt-6e45b77e-1d54-4173-af1a-dcbcd886645d
2025-11-12 15:12:31 +00:00
gpt-engineer-app[bot]
5cc5d3eab6 testing changes with virtual file cleanup 2025-11-12 15:12:30 +00:00
gpt-engineer-app[bot]
706e36c847 Add staggered expand animation
Implement sequential delays for detailed view expansions:
- Add staggerIndex prop support to DetailedViewCollapsible and apply per-item animation delays.
- Pass item index in SubmissionItemsList when rendering detailed sections.
- Ensure each detailed view expands with a 50ms incremental delay (up to a max) for a staggered effect.

X-Lovable-Edit-ID: edt-6eb47d5c-853d-43ab-96a7-16a5cc006c30
2025-11-12 14:56:11 +00:00
gpt-engineer-app[bot]
a1beba6996 testing changes with virtual file cleanup 2025-11-12 14:56:11 +00:00
gpt-engineer-app[bot]
d7158756ef Animate detailed view transitions
Improve user experience by adding smooth animation transitions to expand/collapse of All Fields (Detailed View) sections, enhance collapsible base to support animation, and apply transitions to detailed view wrapper and chevron indicators.

X-Lovable-Edit-ID: edt-9a567ba5-b52f-46b3-bdef-b847b9ba7963
2025-11-12 14:53:19 +00:00
gpt-engineer-app[bot]
3330a8fac9 testing changes with virtual file cleanup 2025-11-12 14:53:18 +00:00
5 changed files with 27 additions and 9 deletions

View File

@@ -10,6 +10,7 @@ interface DetailedViewCollapsibleProps {
children: React.ReactNode;
fieldCount?: number;
className?: string;
staggerIndex?: number;
}
/**
@@ -21,8 +22,11 @@ export function DetailedViewCollapsible({
onToggle,
children,
fieldCount,
className
className,
staggerIndex = 0
}: DetailedViewCollapsibleProps) {
// Calculate stagger delay: 50ms per item, max 300ms
const staggerDelay = Math.min(staggerIndex * 50, 300);
return (
<Collapsible open={!isCollapsed} onOpenChange={() => onToggle()}>
<div className={cn("mt-6 pt-6 border-t", className)}>
@@ -59,7 +63,13 @@ export function DetailedViewCollapsible({
</Button>
</CollapsibleTrigger>
<CollapsibleContent className="mt-3">
<CollapsibleContent
className="mt-3"
style={{
animationDelay: `${staggerDelay}ms`,
transitionDelay: `${staggerDelay}ms`
}}
>
{children}
</CollapsibleContent>
</div>

View File

@@ -135,7 +135,7 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
}
// Render item with appropriate display component
const renderItem = (item: SubmissionItemData) => {
const renderItem = (item: SubmissionItemData, index: number = 0) => {
// SubmissionItemData from submissions.ts has item_data property
const entityData = item.item_data;
const actionType = item.action_type || 'create';
@@ -201,6 +201,7 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
isCollapsed={isCollapsed}
onToggle={toggle}
fieldCount={countFields(entityData)}
staggerIndex={index}
>
<SubmissionChangesDisplay
item={item}
@@ -225,6 +226,7 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
isCollapsed={isCollapsed}
onToggle={toggle}
fieldCount={countFields(entityData)}
staggerIndex={index}
>
<SubmissionChangesDisplay
item={item}
@@ -249,6 +251,7 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
isCollapsed={isCollapsed}
onToggle={toggle}
fieldCount={countFields(entityData)}
staggerIndex={index}
>
<SubmissionChangesDisplay
item={item}
@@ -273,6 +276,7 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
isCollapsed={isCollapsed}
onToggle={toggle}
fieldCount={countFields(entityData)}
staggerIndex={index}
>
<SubmissionChangesDisplay
item={item}
@@ -297,6 +301,7 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
isCollapsed={isCollapsed}
onToggle={toggle}
fieldCount={countFields(entityData)}
staggerIndex={index}
>
<SubmissionChangesDisplay
item={item}
@@ -334,9 +339,9 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
)}
{/* Show regular submission items */}
{items.map((item) => (
{items.map((item, index) => (
<div key={item.id} className={view === 'summary' ? 'border-l-2 border-primary/20 pl-3' : ''}>
{renderItem(item)}
{renderItem(item, index)}
</div>
))}

View File

@@ -50,8 +50,10 @@ export function useDetailedViewState(): UseDetailedViewStateReturn {
});
}
if (data?.moderation_preferences) {
const prefs = data.moderation_preferences as ModerationPreferences;
// Type assertion needed until Supabase regenerates types after migration
const preferences = (data as any)?.moderation_preferences;
if (preferences) {
const prefs = preferences as ModerationPreferences;
setIsCollapsed(prefs.detailed_view_collapsed ?? true);
}
} else {

View File

@@ -7,6 +7,7 @@ import { twMerge } from "tailwind-merge";
*
* @param inputs - Class values to combine (strings, objects, arrays)
* @returns Merged class string with Tailwind conflicts resolved
* @example cn('px-2 py-1', 'px-4') // Returns 'py-1 px-4'
*/
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));

View File

@@ -207,8 +207,8 @@ const handler = async (req: Request, context: { supabase: any; user: any; span:
p_moderator_id: user.id,
p_submitter_id: submission.user_id,
p_request_id: requestId,
p_trace_id: rootSpan.traceId,
p_parent_span_id: rpcSpan.spanId
p_approval_mode: 'selective',
p_idempotency_key: idempotencyKey
}
);