Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Dependencies
node_modules/
.turbo/

# Build outputs
dist/
.next/
generated/

# Logs
*.log

# Environment files
.env*

# Database specific files to exclude from formatting
packages/db/prisma/seed/frameworkEditorSchemas.js
packages/db/prisma/seed/seed.js
packages/db/src/index.js
packages/db/src/types.js

# Other generated files
coverage/
.DS_Store
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,11 @@ export function FrameworkCard({
const statusBadge = getStatusBadge(complianceScore);

// Calculate last activity date - use current date as fallback
const lastActivityDate = new Date().toLocaleDateString();
const lastActivityDate = new Date().toLocaleDateString('en-US', {
year: 'numeric',
month: 'short',
day: '2-digit',
});

return (
<Link href={`/${orgId}/frameworks/${frameworkInstance.id}`} className="group block">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export function MemberRow({ member, onRemove, onUpdateRole }: MemberRowProps) {
</div>
</div>
<div className="flex items-center gap-2">
<div className="flex max-w-[150px] flex-wrap justify-end gap-1">
<div className="flex max-w-[150px] flex-wrap justify-end gap-1 hidden md:block">
{currentRoles.map((role) => (
<Badge key={role} variant="secondary" className="text-xs">
{(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export function PendingInvitationRow({ invitation, onCancel }: PendingInvitation
<div>
<div className="flex items-center gap-2 font-medium">
<span>{invitation.email}</span>
<Badge variant="outline" className="flex items-center gap-1 text-xs">
<Badge variant="outline" className="hidden md:flex items-center gap-1 text-xs">
<Clock className="mr-1 h-3 w-3" />
Pending
</Badge>
Expand All @@ -92,7 +92,7 @@ export function PendingInvitationRow({ invitation, onCancel }: PendingInvitation
</div>
</div>
<div className="flex items-center gap-2">
<div className="flex max-w-[150px] flex-wrap justify-end gap-1">
<div className="max-w-[150px] flex-wrap justify-end gap-1 hidden md:flex">
{(Array.isArray(invitation.role)
? invitation.role
: typeof invitation.role === 'string' && invitation.role.includes(',')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use client';

import { createApiKeyAction } from '@/actions/organization/create-api-key-action';
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@comp/ui/accordion';
import { Button } from '@comp/ui/button';
import {
Drawer,
Expand All @@ -14,7 +15,7 @@ import { Input } from '@comp/ui/input';
import { ScrollArea } from '@comp/ui/scroll-area';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select';
import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@comp/ui/sheet';
import { Check, Copy, Loader2, X } from 'lucide-react';
import { Check, Copy, X } from 'lucide-react';
import { useAction } from 'next-safe-action/hooks';
import { useState } from 'react';
import { toast } from 'sonner';
Expand Down Expand Up @@ -82,49 +83,58 @@ export function CreateApiKeyDialog({ open, onOpenChange, onSuccess }: CreateApiK

// Form content for reuse in both Dialog and Sheet/Drawer
const renderFormContent = () => (
<form onSubmit={handleSubmit} className="space-y-4 p-1">
<div className="space-y-2">
<label htmlFor="name" className="text-sm leading-none font-medium">
{'Name'}
</label>
<Input
id="name"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder={'Enter a name for this API key'}
required
className="w-full"
/>
</div>
<div className="space-y-2">
<label htmlFor="expiration" className="text-sm leading-none font-medium">
{'Expiration'}
</label>
<Select
value={expiration}
onValueChange={(value) => setExpiration(value as 'never' | '30days' | '90days' | '1year')}
>
<SelectTrigger id="expiration" className="w-full">
<SelectValue placeholder={'Select expiration'} />
</SelectTrigger>
<SelectContent>
<SelectItem value="never">{'Never'}</SelectItem>
<SelectItem value="30days">{'30 days'}</SelectItem>
<SelectItem value="90days">{'90 days'}</SelectItem>
<SelectItem value="1year">{'1 year'}</SelectItem>
</SelectContent>
</Select>
</div>
<div className="flex flex-col justify-end gap-2 pt-2 sm:flex-row">
<Button type="button" variant="outline" onClick={handleClose}>
{'Cancel'}
</Button>
<Button type="submit" disabled={isCreating === 'executing'} className="w-full sm:w-auto">
{isCreating === 'executing' && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
{'New API Key'}
</Button>
</div>
</form>
<div className="scrollbar-hide h-[calc(100vh-250px)] overflow-auto">
<Accordion type="multiple" defaultValue={['api-key']}>
<AccordionItem value="api-key">
<AccordionTrigger>{'API Key'}</AccordionTrigger>
<AccordionContent>
<form onSubmit={handleSubmit} className="space-y-4">
<div className="space-y-2">
<label htmlFor="name" className="text-sm leading-none font-medium">
{'Name'}
</label>
<div className="mt-3">
<Input
id="name"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder={'Enter a name for this API key'}
required
className="w-full"
/>
</div>
</div>
<div className="space-y-2">
<label htmlFor="expiration" className="text-sm leading-none font-medium">
{'Expiration'}
</label>
<div className="mt-3">
<Select
value={expiration}
onValueChange={(value) =>
setExpiration(value as 'never' | '30days' | '90days' | '1year')
}
>
<SelectTrigger id="expiration" className="w-full">
<SelectValue placeholder={'Select expiration'} />
</SelectTrigger>
<SelectContent>
<SelectItem value="never">{'Never'}</SelectItem>
<SelectItem value="30days">{'30 days'}</SelectItem>
<SelectItem value="90days">{'90 days'}</SelectItem>
<SelectItem value="1year">{'1 year'}</SelectItem>
</SelectContent>
</Select>
</div>
</div>
<Button type="submit" className="justify-self-end w-full">
{'Create'}
</Button>
</form>
</AccordionContent>
</AccordionItem>
</Accordion>
</div>
);

// Created key content for reuse in both Dialog and Sheet/Drawer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { createContextEntryAction } from '@/actions/context-hub/create-context-entry-action';
import { updateContextEntryAction } from '@/actions/context-hub/update-context-entry-action';
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@comp/ui/accordion';
import { Button } from '@comp/ui/button';
import { Input } from '@comp/ui/input';
import { Label } from '@comp/ui/label';
Expand Down Expand Up @@ -44,33 +45,45 @@ export function ContextForm({ entry, onSuccess }: { entry?: Context; onSuccess?:
}

return (
<form action={onSubmit} className="flex flex-col gap-4 space-y-4 p-1">
<input type="hidden" name="id" value={entry?.id} />
<div className="space-y-2">
<Label htmlFor="question">Question</Label>
<Input
id="question"
name="question"
placeholder="What is the company's mission?"
defaultValue={entry?.question}
required
/>
</div>
<div className="space-y-2">
<Label htmlFor="answer">Answer</Label>
<Textarea
id="answer"
name="answer"
placeholder="Our mission is to provide the best possible service to our customers."
defaultValue={entry?.answer}
required
/>
</div>

<Button type="submit" disabled={isPending} className="justify-self-end">
{entry ? 'Update' : 'Create'}{' '}
{isPending && <Loader2 className="ml-2 h-4 w-4 animate-spin" />}
</Button>
</form>
<div className="scrollbar-hide h-[calc(100vh-250px)] overflow-auto">
<Accordion type="multiple" defaultValue={['context']}>
<AccordionItem value="context">
<AccordionTrigger>{'Context Entry'}</AccordionTrigger>
<AccordionContent>
<form action={onSubmit} className="flex flex-col gap-4 space-y-4">
<input type="hidden" name="id" value={entry?.id} />
<div className="space-y-2">
<Label htmlFor="question">Question</Label>
<div className="mt-3">
<Input
id="question"
name="question"
placeholder="What is the company's mission?"
defaultValue={entry?.question}
required
/>
</div>
</div>
<div className="space-y-2">
<Label htmlFor="answer">Answer</Label>
<div className="mt-3">
<Textarea
id="answer"
name="answer"
placeholder="Our mission is to provide the best possible service to our customers."
defaultValue={entry?.answer}
required
/>
</div>
</div>
<Button type="submit" disabled={isPending} className="justify-self-end">
{entry ? 'Update' : 'Create'}{' '}
{isPending && <Loader2 className="ml-2 h-4 w-4 animate-spin" />}
</Button>
</form>
</AccordionContent>
</AccordionItem>
</Accordion>
</div>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export function TaskBody({
<input
value={title}
onChange={onTitleChange}
className="h-auto shrink-0 border-none bg-transparent p-0 text-2xl font-semibold tracking-tight shadow-none focus-visible:ring-0"
className="h-auto shrink-0 border-none bg-transparent p-0 md:text-lg font-semibold tracking-tight shadow-none focus-visible:ring-0"
placeholder="Task Title"
disabled={disabled || isUploadingFile || !!busyAttachmentId}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export function TaskMainContent({ task, comments, attachments }: TaskMainContent
};

return (
<div className="flex flex-1 flex-col gap-4 lg:mx-auto lg:max-w-3xl lg:py-8">
<div className="flex flex-1 flex-col gap-4 lg:mx-auto lg:max-w-3xl">
<TaskBody
taskId={task.id}
title={title}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client';

import type { Member, User, Vendor } from '@comp/db/types';
import type { GlobalVendors, Member, User, Vendor } from '@comp/db/types';
import { Button } from '@comp/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card';
import { PencilIcon } from 'lucide-react';
Expand All @@ -11,9 +11,11 @@ import { UpdateSecondaryFieldsForm } from './update-secondary-fields-form';
export function SecondaryFields({
vendor,
assignees,
globalVendor,
}: {
vendor: Vendor & { assignee: { user: User | null } | null };
assignees: (Member & { user: User })[];
globalVendor: GlobalVendors | null;
}) {
const [_, setOpen] = useQueryState('vendor-overview-sheet');

Expand All @@ -36,7 +38,7 @@ export function SecondaryFields({
<CardDescription>{vendor.description}</CardDescription>
</div>
</CardHeader>
<CardContent>
<CardContent className="space-y-4">
<UpdateSecondaryFieldsForm vendor={vendor} assignees={assignees} />
</CardContent>
</Card>
Expand Down
Loading
Loading