260322:1648 Correct Coresspondence / Doing RFA / Correct CI
CI Pipeline / build (push) Failing after 12m41s
Build and Deploy / deploy (push) Failing after 2m44s

This commit is contained in:
admin
2026-03-22 16:48:12 +07:00
parent e5deedb42e
commit 11984bfa29
683 changed files with 105251 additions and 29068 deletions
+13 -21
View File
@@ -1,11 +1,11 @@
"use client";
'use client';
import { Card } from "@/components/ui/card";
import { Label } from "@/components/ui/label";
import { Checkbox } from "@/components/ui/checkbox";
import { Button } from "@/components/ui/button";
import { SearchFilters as FilterType } from "@/types/search";
import { useState } from "react";
import { Card } from '@/components/ui/card';
import { Label } from '@/components/ui/label';
import { Checkbox } from '@/components/ui/checkbox';
import { Button } from '@/components/ui/button';
import { SearchFilters as FilterType } from '@/types/search';
import { useState } from 'react';
interface SearchFiltersProps {
onFilterChange: (filters: FilterType) => void;
@@ -19,9 +19,7 @@ export function SearchFilters({ onFilterChange }: SearchFiltersProps) {
const handleTypeChange = (type: string, checked: boolean) => {
const currentTypes = filters.types || [];
const newTypes = checked
? [...currentTypes, type]
: currentTypes.filter((t) => t !== type);
const newTypes = checked ? [...currentTypes, type] : currentTypes.filter((t) => t !== type);
const newFilters = { ...filters, types: newTypes };
setFilters(newFilters);
@@ -30,9 +28,7 @@ export function SearchFilters({ onFilterChange }: SearchFiltersProps) {
const handleStatusChange = (status: string, checked: boolean) => {
const currentStatuses = filters.statuses || [];
const newStatuses = checked
? [...currentStatuses, status]
: currentStatuses.filter((s) => s !== status);
const newStatuses = checked ? [...currentStatuses, status] : currentStatuses.filter((s) => s !== status);
const newFilters = { ...filters, statuses: newStatuses };
setFilters(newFilters);
@@ -50,7 +46,7 @@ export function SearchFilters({ onFilterChange }: SearchFiltersProps) {
<div>
<h3 className="font-semibold mb-3">Document Type</h3>
<div className="space-y-2">
{["correspondence", "rfa", "drawing"].map((type) => (
{['correspondence', 'rfa', 'drawing'].map((type) => (
<div key={type} className="flex items-center space-x-2">
<Checkbox
id={`type-${type}`}
@@ -68,7 +64,7 @@ export function SearchFilters({ onFilterChange }: SearchFiltersProps) {
<div>
<h3 className="font-semibold mb-3">Status</h3>
<div className="space-y-2">
{["DRAFT", "PENDING", "APPROVED", "REJECTED", "IN_REVIEW"].map((status) => (
{['DRAFT', 'PENDING', 'APPROVED', 'REJECTED', 'IN_REVIEW'].map((status) => (
<div key={status} className="flex items-center space-x-2">
<Checkbox
id={`status-${status}`}
@@ -76,18 +72,14 @@ export function SearchFilters({ onFilterChange }: SearchFiltersProps) {
onCheckedChange={(checked) => handleStatusChange(status, checked as boolean)}
/>
<Label htmlFor={`status-${status}`} className="text-sm capitalize">
{status.replace("_", " ").toLowerCase()}
{status.replace('_', ' ').toLowerCase()}
</Label>
</div>
))}
</div>
</div>
<Button
variant="outline"
className="w-full"
onClick={clearFilters}
>
<Button variant="outline" className="w-full" onClick={clearFilters}>
Clear Filters
</Button>
</Card>
+18 -23
View File
@@ -1,11 +1,11 @@
"use client";
'use client';
import { Card } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import Link from "next/link";
import { FileText, Clipboard, Image, Loader2 } from "lucide-react";
import { SearchResult } from "@/types/search";
import { format } from "date-fns";
import { Card } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import Link from 'next/link';
import { FileText, Clipboard, Image, Loader2 } from 'lucide-react';
import { SearchResult } from '@/types/search';
import { format } from 'date-fns';
interface SearchResultsProps {
results: SearchResult[];
@@ -25,18 +25,18 @@ export function SearchResults({ results, query, loading }: SearchResultsProps) {
if (results.length === 0) {
return (
<Card className="p-12 text-center text-muted-foreground">
{query ? `No results found for "${query}"` : "Enter a search term to start"}
{query ? `No results found for "${query}"` : 'Enter a search term to start'}
</Card>
);
}
const getIcon = (type: string) => {
switch (type) {
case "correspondence":
case 'correspondence':
return FileText;
case "rfa":
case 'rfa':
return Clipboard;
case "drawing":
case 'drawing':
return Image;
default:
return FileText;
@@ -53,10 +53,7 @@ export function SearchResults({ results, query, loading }: SearchResultsProps) {
const Icon = getIcon(result.type);
return (
<Card
key={`${result.type}-${result.uuid}-${index}`}
className="p-6 hover:shadow-md transition-shadow group"
>
<Card key={`${result.type}-${result.uuid}-${index}`} className="p-6 hover:shadow-md transition-shadow group">
<Link href={getLink(result)}>
<div className="flex gap-4">
<div className="flex-shrink-0 mt-1">
@@ -68,23 +65,21 @@ export function SearchResults({ results, query, loading }: SearchResultsProps) {
<h3
className="text-lg font-semibold group-hover:text-primary transition-colors"
dangerouslySetInnerHTML={{
__html: result.highlight || result.title
__html: result.highlight || result.title,
}}
/>
<Badge variant="secondary" className="capitalize">{result.type}</Badge>
<Badge variant="secondary" className="capitalize">
{result.type}
</Badge>
<Badge variant="outline">{result.status}</Badge>
</div>
<p className="text-sm text-muted-foreground mb-2 line-clamp-2">
{result.description}
</p>
<p className="text-sm text-muted-foreground mb-2 line-clamp-2">{result.description}</p>
<div className="flex gap-4 text-xs text-muted-foreground">
<span className="font-medium">{result.documentNumber}</span>
<span></span>
<span>
{format(new Date(result.createdAt), "dd MMM yyyy")}
</span>
<span>{format(new Date(result.createdAt), 'dd MMM yyyy')}</span>
</div>
</div>
</div>