summaryrefslogtreecommitdiff
path: root/lib/evaluation-criteria/table/reg-eval-criteria-delete-dialog.tsx
blob: aac7db29ba2673ae24241572061ef175d71a7c81 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
'use client';

/* IMPORT */
import { Button } from '@/components/ui/button';
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
} from '@/components/ui/dialog';
import {
  getRegEvalCriteriaWithDetails,
  removeRegEvalCriteria,
} from '../service';
import { LoaderCircle } from 'lucide-react';
import { toast } from 'sonner';
import {
  REG_EVAL_CRITERIA_CATEGORY,
  REG_EVAL_CRITERIA_ITEM,
  REG_EVAL_CRITERIA_SCORE_CATEGORY,
  type RegEvalCriteriaView,
  type RegEvalCriteriaWithDetails,
} from '@/db/schema';
import { useEffect, useState } from 'react';

// ----------------------------------------------------------------------------------------------------

/* TYPES */
interface RegEvalCriteriaDeleteDialogProps {
  open: boolean,
  onOpenChange: (open: boolean) => void,
  criteriaViewData: RegEvalCriteriaView,
  onSuccess: () => void,
}

// ----------------------------------------------------------------------------------------------------

/* REGULAR EVALUATION CRITERIA DELETE DIALOG COMPONENT */
function RegEvalCriteriaDeleteDialog(props: RegEvalCriteriaDeleteDialogProps) {
  const { open, onOpenChange, criteriaViewData, onSuccess } = props;
  const [isLoading, setIsLoading] = useState<boolean>(false);
  const [isDeleting, setIsDeleting] = useState<boolean>(false);
  const [targetData, setTargetData] = useState<RegEvalCriteriaWithDetails | null>();

  useEffect(() => {
    const fetchData = async () => {
      if (!criteriaViewData?.criteriaId) {
        return;
      }
      setIsLoading(true);
      try {
        const result = await getRegEvalCriteriaWithDetails(criteriaViewData.criteriaId);
        setTargetData(result);
      } catch (error) {
        console.error('Error in Loading Target Data for Deletion: ', error);
      } finally {
        setIsLoading(false);
      }
    }
    fetchData();
  }, [criteriaViewData.criteriaId]);
  
  const handleDelete = async () => {
    if (!criteriaViewData || !criteriaViewData.criteriaId) {
      return;
    }

    try {
      setIsDeleting(true);
      await removeRegEvalCriteria(criteriaViewData.criteriaId);
      toast.success('평가 기준이 삭제되었습니다.');
      onSuccess();
    } catch (error) {
      console.error('Error in Deleting Regular Evaluation Criteria: ', error);
      toast.error(
        error instanceof Error ? error.message : '삭제 중 오류가 발생했습니다.'
      );
    } finally {
      setIsDeleting(false);
    }
  }

  if (!criteriaViewData) {
    return null;
  }

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent>
        {isLoading ? (
          <div className="flex flex-col items-center justify-center h-32">
            <LoaderCircle className="h-8 w-8 animate-spin" />
            <p className="mt-4 text-base text-gray-700">Loading...</p>
          </div>
        ) : (
          <>
            <DialogHeader>
              <DialogTitle>협력업체 평가 기준 삭제</DialogTitle>
              <DialogDescription>
                정말로 이 협력업체 평가 기준을 삭제하시겠습니까?
                <br />
                <br />
                <strong>삭제될 평가 기준:</strong>
                <br />
                • 평가부문: {REG_EVAL_CRITERIA_CATEGORY.find((c) => c.value === criteriaViewData.category)?.label ?? '-'}
                <br />
                • 점수구분: {REG_EVAL_CRITERIA_SCORE_CATEGORY.find((c) => c.value === criteriaViewData.scoreCategory)?.label ?? '-'}
                <br />
                • 항목: {REG_EVAL_CRITERIA_ITEM.find((c) => c.value === criteriaViewData.item)?.label ?? '-'}
                <br />
                • 구분: {criteriaViewData.classification || '-'}
                <br />
                • 범위: {criteriaViewData.range || '-'}
                <br />
                <br />
                <b>이 작업은 되돌릴 수 없으며</b>, 평가기준과 그에 속한 <b>{targetData?.criteriaDetails.length}개의 평가항목도 함께 삭제</b>됩니다.
              </DialogDescription>
            </DialogHeader>
            <DialogFooter>
              <Button
                variant="outline"
                onClick={() => onOpenChange(false)}
                disabled={isDeleting}
              >
                Cancel
              </Button>
              <Button
                variant="destructive"
                onClick={handleDelete}
                disabled={isDeleting}
              >
                {isDeleting ? 'Deleting...' : 'Delete'}
              </Button>
            </DialogFooter>
          </>
        )}
      </DialogContent>
    </Dialog>
  )
}

// ----------------------------------------------------------------------------------------------------

/* EXPORT */
export default RegEvalCriteriaDeleteDialog;