diff --git a/Modules/Client/Http/Controllers/Api/ClaimController.php b/Modules/Client/Http/Controllers/Api/ClaimController.php index f58efa52..0ed4533c 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimController.php @@ -2,13 +2,21 @@ namespace Modules\Client\Http\Controllers\Api; +use Illuminate\Support\Facades\DB; use App\Helpers\Helper; use App\Models\Claim; +use App\Models\CorporateEmployee; +use App\Models\Icd; +use App\Models\ClaimHistoryCare; +use App\Models\Corporate; use App\Services\ClaimService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Modules\Client\Transformers\ClaimShowResource; +use PhpOffice\PhpSpreadsheet\Spreadsheet; +use Illuminate\Support\Facades\Storage; +use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class ClaimController extends Controller { @@ -20,7 +28,7 @@ class ClaimController extends Controller { $claims = $this->claimService->getCountClaimRequestPerStatus($corporate_id); - dd($claims); + // dd($claims); return Helper::responseJson([ 'count_requested' => 0, @@ -133,4 +141,124 @@ class ClaimController extends Controller { // } + + public function export($corporate_id){ + $corporate = Corporate::where('id', $corporate_id)->with(['currentPolicy'])->first(); + $member_id = CorporateEmployee::where('corporate_id', $corporate_id)->get('member_id')->toArray(); + // dd($member_id); + $claim = Claim::whereIn('member_id', $member_id)->with(['member', 'member.plans'])->get(); + $data = []; + + if (count( $claim) > 0){ + $temp = []; + foreach($claim as $c) { + + $diagnosis = ClaimHistoryCare::where('claim_id', 34)->with('icd')->get(); + $diagnosisName = ''; + if (count($diagnosis) > 0){ + $tempDiagnosis = []; + foreach($diagnosis as $key => $d){ + $diagnosis = Icd::where('id', $d['main_diagnosis_id'])->first(); + array_push($tempDiagnosis, $diagnosis->name); + } + + $diagnosisName = implode(", ", $tempDiagnosis); + + } + $temp['id'] = $c['id']; + $temp['plan_id'] = $c['member']['plans'][0]['code']; + $temp['payor_id'] = $c['member']['payor_id']; + $temp['corporate_id'] = $corporate->name; + $temp['policy_number'] = $corporate->currentPolicy->code; + $temp['member_id'] = $c['member']['member_id']; + $temp['benefit_code'] = $c['benefit_code']; + $temp['benefit_desc'] = $c['benefit_desc']; + $temp['amount_incurred'] = $c['amount_incurred']; + $temp['amount_approved'] = $c['amount_approved']; + $temp['amount_not_approved'] = $c['amount_not_approved']; + $temp['excess_paid'] = $c['excess_paid']; + $temp['diganosis'] = $diagnosisName; + array_push($data, $temp); + } + + $headers = [ + ['value' => 'Plan ID', 'cell' => 'A1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Payor ID', 'cell' => 'B1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Corporate ID', 'cell' => 'C1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Policy Number', 'cell' => 'D1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Member ID', 'cell' => 'E1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Benefit Code', 'cell' => 'F1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Benefit Desc', 'cell' => 'G1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Amt Incurred', 'cell' => 'H1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Amt Approved', 'cell' => 'I1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Amt Not Approved', 'cell' => 'J1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Excess Paid', 'cell' => 'K1', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Diagnosis', 'cell' => 'L1', 'mergeCell' => false, 'mergeToCell' => 'J2'], + + ]; + + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + foreach ($headers as $header) { + $sheet->setCellValue($header['cell'], $header['value']); + + if ($header['mergeCell'] === true) { + $sheet->mergeCells($header['cell'] . ':' . $header['mergeToCell']); + } + + $sheet->getStyle($header['cell'])->getFont()->setBold(true); + $sheet->getStyle($header['cell'])->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER); + } + + $startFrom = 2; + + foreach($data as $i => $d){ + $sheet->setCellValue('A' . $startFrom, $d['plan_id'] ?? '-'); + $sheet->setCellValue('B' . $startFrom, $d['payor_id'] ?? '-'); + $sheet->setCellValue('C' . $startFrom, $d['corporate_id'] ?? '-'); + $sheet->setCellValue('D' . $startFrom, $d['policy_number'] ?? '-'); + $sheet->setCellValue('E' . $startFrom, $d['member_id'] ?? '-'); + $sheet->setCellValue('F' . $startFrom, $d['benefit_code'] ?? '-'); + $sheet->setCellValue('G' . $startFrom, $d['benefit_desc'] ?? '-'); + $sheet->setCellValue('H' . $startFrom, $d['amount_incurred'] ?? '-'); + $sheet->setCellValue('I' . $startFrom, $d['amount_approved'] ?? '-'); + $sheet->setCellValue('J' . $startFrom, $d['amount_not_approved'] ?? '-'); + $sheet->setCellValue('K' . $startFrom, $d['excess_paid'] ?? '-'); + $sheet->setCellValue('L' . $startFrom, $d['diganosis'] ?? '-'); + + $startFrom++; + } + + foreach (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K'] as $header) { + if ($header === 'A') { + $spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(35, 'px'); + } elseif ($header === 'H' || $header === 'I') { + $spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(100, 'px'); + } else { + $spreadsheet->getActiveSheet()->getColumnDimension($header)->setAutoSize(true); + } + } + + $spreadsheet->getActiveSheet()->getStyle('A2:A' . $startFrom)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER); + + $sheet->getDefaultRowDimension()->setRowHeight(-1); + $sheet->setTitle('Alarm Center Report'); + + $writer = new Xlsx($spreadsheet); + ob_start(); + $writer->save('php://output'); + $content = ob_get_contents(); + ob_end_clean(); + + $fileName = 'result-' . now()->getPreciseTimestamp(3) . '-alarm-center-report.xlsx'; + Storage::disk('public')->put('temp/' . $fileName, $content); + + $fileUrl = url('storage/temp/' . $fileName); + + return Helper::responseJson([ + "file_url" => $fileUrl + ]); + } + } } diff --git a/Modules/Client/Http/Controllers/Api/ClaimReportController.php b/Modules/Client/Http/Controllers/Api/ClaimReportController.php index a8b43216..560d38a8 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimReportController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimReportController.php @@ -2,62 +2,275 @@ namespace Modules\Client\Http\Controllers\Api; -use Illuminate\Http\Request; +use App\Helpers\Helper; use App\Http\Controllers\Controller; +use App\Models\ClaimRequest; +use Modules\Client\Transformers\ClaimReport\ShowResources; +use Illuminate\Support\Facades\Crypt; +use Illuminate\Support\Facades\DB; +use App\Models\File; +use Illuminate\Http\Request; class ClaimReportController extends Controller { - /** - * Display a listing of the resource. - * - * @return \Illuminate\Http\Response - */ - public function index() + public function claimStatus($corporateId) { + $requesteds = ClaimRequest::query() + ->whereHas('member', function ($query) use ($corporateId) { + $query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) { + $corporateEmployee->where('corporate_id', $corporateId); + }); + }) + ->where('status', 'requested') + ->get(); + $approveds = ClaimRequest::query() + ->whereHas('member', function ($query) use ($corporateId) { + $query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) { + $corporateEmployee->where('corporate_id', $corporateId); + }); + }) + ->whereHas('claim', fn ($query) => $query->where('status', 'approved')) + ->where('status', 'approved') + ->get(); + + $rejecteds = ClaimRequest::query() + ->whereHas('member', function ($query) use ($corporateId) { + $query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) { + $corporateEmployee->where('corporate_id', $corporateId); + }); + }) + ->whereHas('claim', fn ($query) => $query->where('status', 'declined')) + ->where('status', 'approved') + ->get(); + + $disbrusments = ClaimRequest::query() + ->whereHas('member', function ($query) use ($corporateId) { + $query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) { + $corporateEmployee->where('corporate_id', $corporateId); + }); + }) + ->whereHas('claim', fn ($query) => $query->where('status', 'disbrusmented')) + ->where('status', 'approved') + ->get(); + + return Helper::responseJson([ + 'requesteds' => count($requesteds), + 'approveds' => count($approveds), + 'rejecteds' => count($rejecteds), + 'disbrusments' => count($disbrusments) + ]); } - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) + public function claimDetail($corporate_id, $claimRequestId) { - // + $claimRequestId = Crypt::decrypt($claimRequestId); + + $status = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->where('corporate_employees.corporate_id', '=', $corporate_id) + ->where('claim_requests.id', '=', $claimRequestId) + ->select( + 'claim_requests.submission_date', + DB::raw(' + CASE + WHEN claim_requests.status = "requested" THEN "requested" + WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" + ELSE "" + END AS status + ') + ) + ->first(); + $results['status'] = $status; + $timeline = DB::table('claim_logs') + ->where('claim_logs.claim_request_id', '=', $claimRequestId) + ->select( + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "Request" + WHEN claim_logs.status = "reviewed" THEN "Review" + WHEN claim_logs.status = "approved" THEN "Approval" + WHEN claim_logs.status = "declined" THEN "Decline" + ELSE "-" + END AS txt_status + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#159C9C" + WHEN claim_logs.status = "reviewed" THEN "#0C53B7" + WHEN claim_logs.status = "approved" THEN "#229A16" + WHEN claim_logs.status = "declined" THEN "#FF4842" + ELSE "-" + END AS txt_status_color + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#00AB5529" + WHEN claim_logs.status = "reviewed" THEN "#1890FF29" + WHEN claim_logs.status = "approved" THEN "#54D62C29" + WHEN claim_logs.status = "declined" THEN "#FF48427A" + ELSE "-" + END AS txt_status_backgroundColor + '), + 'claim_logs.date', + 'claim_logs.description', + 'claim_logs.status' + ) + ->orderBy('claim_logs.id', 'desc') + ->get(); + $results['timeline'] = $timeline; + $request_files = DB::table('claim_request_files') + ->where('claim_request_files.claim_request_id', '=', $claimRequestId) + ->select( + 'claim_request_files.*', + DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), + ) + ->get(); + $results['request_files'] = $request_files; + $documents = DB::table('files') + ->where('fileable_type', 'App\Models\ClaimRequest') + ->where('fileable_id', $claimRequestId) + ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') + ->orderBy('id', 'desc') + ->get(); + $results['documents'] = $documents; + + return Helper::responseJson($results); } - /** - * Display the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show($id) + public function requestFiles(Request $request, $corporate_id, $claim_id) { - // + $claim_id = Crypt::decrypt($claim_id); + if ($request->hasFile('fileDiagnosis')) { + foreach ($request->fileDiagnosis as $file) { + $pathFile = File::storeFile('claim-diagnosis', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-diagnosis', + 'name' => File::getFileName('claim-diagnosis', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileKondisis')) { + foreach ($request->fileKondisis as $file) { + $pathFile = File::storeFile('claim-kondisi', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-kondisi', + 'name' => File::getFileName('claim-kondisi', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileResults')) { + foreach ($request->fileResults as $file) { + $pathFile = File::storeFile('claim-result', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-result', + 'name' => File::getFileName('claim-result', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); } - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response - */ - public function update(Request $request, $id) + public function claimDetailHistory($corporate_id, $claimRequestId) { - // + $claimRequestId = Crypt::decrypt($claimRequestId); + + $member = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->where('corporate_employees.corporate_id', '=', $corporate_id) + ->where('claim_requests.id', '=', $claimRequestId) + ->select( + 'claim_requests.code','members.member_id', 'members.name' + ) + ->first(); + $results['member'] = $member; + $claim_item = DB::table('claim_items') + ->leftJoin('claims','claim_items.claim_id', '=', 'claims.id') + ->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id') + ->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->where('corporate_employees.corporate_id', '=', $corporate_id) + ->where('claim_requests.id', '=', $claimRequestId) + ->select( + 'claim_items.nominal_ditagihkan', + 'claim_items.nominal_dicover', + 'benefits.description', + 'claim_requests.submission_date' + ) + ->orderBy('claim_items.id', 'desc') + ->get(); + $results['claim_item'] = $claim_item; + $tot_claim_item = DB::table('claim_items') + ->leftJoin('claims','claim_items.claim_id', '=', 'claims.id') + ->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id') + ->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->where('corporate_employees.corporate_id', '=', $corporate_id) + ->where('claim_requests.id', '=', $claimRequestId) + ->select( + DB::raw('SUM(claim_items.nominal_ditagihkan) AS nominal_ditagihkan'), + DB::raw('SUM(claim_items.nominal_dicover) AS nominal_dicover'), + DB::raw('(SUM(claim_items.nominal_ditagihkan) - SUM(claim_items.nominal_dicover)) AS difference'), + ) + ->groupBy('claim_items.id') + ->orderBy('claim_items.id', 'desc') + ->first(); + $results['tot_claim_item'] = $tot_claim_item; + + + return Helper::responseJson($results); } - /** - * Remove the specified resource from storage. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function destroy($id) + public function show($corporateId, $claimRequestId) { - // + $data = ClaimRequest::query() + ->with([ + 'histories:historiable_type,historiable_id,title,description,created_at', + 'member:id,person_id,name_prefix,name,name_suffix' => [ + 'person:id,name_prefix,name,name_suffix,gender' + ], + 'claim:id,status', + 'claimResults', + 'claimConditions', + 'claimDiagnosis' + ]) + ->find($claimRequestId, ['id', 'submission_date', 'member_id', 'claim_id', 'status']); + + return Helper::responseJson(new ShowResources($data)); } } diff --git a/Modules/Client/Http/Controllers/Api/ClaimRequestController.php b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php new file mode 100644 index 00000000..de3899d5 --- /dev/null +++ b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php @@ -0,0 +1,254 @@ +validate([ + 'member_id' => 'required|array', + 'member_id.*' => 'required', + 'service_code.*' => 'required|in:OP,IP' + ]); + if ($request->member_id){ + foreach($request->member_id as $key => $member_id){ + + $code = $this->getNextCode(); + $member = Member::find($member_id); + + DB::beginTransaction(); + + try { + $newClaimRequest = ClaimRequestService::storeClaimRequest( + row: [], + code: $code, + member: $member, + paymentType: 'reimbursement', + serviceCode: $request->service_code[$key], + ); + + ClaimRequested::dispatch($newClaimRequest); + + // Log History + $newClaimRequest->histories()->create([ + 'title' => 'New Claim Requested', + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'type' => 'info', + 'system_origin' => 'client-portal' + ]); + + // Claim Log + DB::table('claim_logs') + ->insert([ + 'claim_request_id' => $newClaimRequest->id, + 'status' => 'requested', + 'date' => date('Y-m-d H:i:s'), + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'system_origin' => 'hospital-portal', + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at'=> date('Y-m-d H:i:s'), + ]); + + $storage_path = storage_path() . "/app/public"; + $folder = "claim/"; + + if (is_dir($storage_path . "/" . $folder) == false) { + mkdir($storage_path . "/" . $folder, 0770, true); + } + + if (isset($_FILES['laboratorium'])) { + foreach ($_FILES['laboratorium']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $new_file_name = "claim-result-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['laboratorium']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['laboratorium']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['laboratorium']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-result', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + } + } + + if (isset($_FILES['prescription'])) { + foreach ($_FILES['prescription']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $new_file_name = "claim-diagnosis-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['prescription']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['prescription']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['prescription']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-diagnosis', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + } + } + + if (isset($_FILES['invoice'])) { + foreach ($_FILES['invoice']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $new_file_name = "claim-kondisi-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['invoice']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['invoice']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['invoice']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-kondisi', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + } + } + + DB::commit(); + } + catch (\Throwable $th) { + DB::rollBack(); + + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + } + } + + return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!'); + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('client::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('client::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } + + public static function getNextCode() + { + // $last_number = ClaimRequest::max('code'); + // $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1); + // return self::makeCode($next_number); + + $last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, "-", -1) AS SIGNED)) as max_numeric_code')) + ->whereRaw('SUBSTRING_INDEX(code, "-", -1) REGEXP "^[0-9]+$"') + ->value('max_numeric_code'); + // $next_number = 1; + if ($last_numeric_code) { + // // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir + // $parts = explode('-', $last_code); + // $last_number = (int) end($parts); + $next_number = $last_numeric_code + 1; + } + + return self::makeCode($next_number); + } + + + public static function makeCode($next_number) + { + // Pastikan $next_number adalah integer positif + $next_number = max(1, (int) $next_number); + + // Menghasilkan kode dengan format yang diinginkan + return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT); + } +} diff --git a/Modules/Client/Http/Controllers/Api/CorporateCurrentController.php b/Modules/Client/Http/Controllers/Api/CorporateCurrentController.php new file mode 100644 index 00000000..52d88d3b --- /dev/null +++ b/Modules/Client/Http/Controllers/Api/CorporateCurrentController.php @@ -0,0 +1,87 @@ +with('currentPolicy', 'subCorporates') + ->withCount([ + 'employees', + 'corporateBenefits', + 'corporatePlans', + + // 'claims' + ]) + // ->where('type', 'corporate') + ->where('id', $id) + ->paginate(1); + + return $corporates; + } + + public function update(Request $request, $id) + { + + $validate = $request->validate([ + 'reason' => 'required', + ]); + + + try { + DB::beginTransaction(); + //karena pake formdata + $linkingRules = $request->linking_rules; + $linkingRules = explode(',', $linkingRules); + $corporate = Corporate::findOrFail($id); + $corporate->fill($request->all()); + $corporate->linking_rules = $linkingRules; + $corporate->save(); + + if ($request->hasFile('logo')) { + $pathFileAvatar = File::storeFile('avatar', $corporate->id, $request->file('logo')); + + $corporate->files()->updateOrCreate([ + 'type' => 'avatar', + 'name' => File::getFileName('avatar', $corporate->id, $request->file('logo')), + 'extension' => $request->file('logo')->getClientOriginalExtension(), + 'path' => $pathFileAvatar, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + throw $e; + } + + return $corporate; + } +} diff --git a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php index ba85ae78..5ea7b0e7 100644 --- a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php @@ -4,14 +4,22 @@ namespace Modules\Client\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\Member; +use App\Models\Claim; +use App\Models\ClaimRequest; +use App\Models\CorporateEmployee; use App\Services\CorporateMemberService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMemberResources; +use Modules\Client\Transformers\AlarmCenter\DataListClaimMemberResource; +use Modules\Client\Transformers\AlarmCenter\DataServiceMonitoring; +use Modules\Client\Transformers\Dashboard\MemberResources as ClaimSubmitMemberResources; use Modules\Client\Transformers\Dashboard\MemberResources as DashboardMemberResources; use Modules\Client\Transformers\Dashboard\MemberAlarmCenterResources as DashboardMemberAlarmResources; +use Modules\Client\Transformers\Dashboard\MemberEmployeeDataResources as DashboardMemberEmployeeDataResources; use Modules\Client\Transformers\DataMemberResource; +use Illuminate\Support\Facades\DB; class CorporateMemberController extends Controller { @@ -26,12 +34,15 @@ class CorporateMemberController extends Controller public function index(Request $request, $corporate_id) { switch ($request->input('type')) { + case 'employee-data': + $members = $this->corporateMemberService->getAllMemberEmployeeData($corporate_id, $request); + return response()->json(Helper::paginateResources(DashboardMemberEmployeeDataResources::collection($members))); case 'claim-report': $members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request); return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members))); case 'claim-submit': - $members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request); - return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members))); + $members = $this->corporateMemberService->getAllMemberClaimSubmits($corporate_id, $request); + return response()->json(Helper::paginateResources(ClaimSubmitMemberResources::collection($members))); case 'alarm-center': $members = $this->corporateMemberService->getAllMemberAlarmCenter($corporate_id, $request); return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members))); @@ -46,16 +57,68 @@ class CorporateMemberController extends Controller public function show($corporate_id, $person_id) { - $data = Member::with(['claims', 'person', 'employeds', 'currentPlan.benefits']) - ->where('person_id', $person_id) - ->whereHas('employeds', function ($query) use ($corporate_id) { - $query->where('corporate_id', $corporate_id); - }) - ->first(); + $data = Member::with(['claims', 'person', 'employeds', 'currentPlan.benefits', 'person.currentAddress']) + ->where('person_id', $person_id) + ->whereHas('employeds', function ($query) use ($corporate_id) { + $query->where('corporate_id', $corporate_id); + }) + ->first(); + $totalClaims = $data->claims->sum('total_claim'); $data->total_claims = $totalClaims; + //Get Family + + $data_family = DB::table('members') + ->join('persons', 'members.person_id', '=', 'persons.id') + ->select('members.*', 'persons.phone') + ->where('principal_id', $data->member_id) + ->get(); + if ($data_family->isEmpty()) { + $principal_id = DB::table('members') + ->where('member_id', $data->member_id) + ->select('principal_id') + ->first(); + $data_family = DB::table('members') + ->join('persons', 'members.person_id', '=', 'persons.id') + ->select('members.*', 'persons.phone') + ->where('principal_id', $principal_id->principal_id) + ->where('members.member_id', '<>', $data->member_id) + ->orWhere('members.member_id', $principal_id->principal_id) + ->get(); + } + + $data->family = $data_family; + + //Claim History + $data_claim_history = DB::table('claim_requests') + ->join('claims', 'claims.claim_request_id', '=', 'claim_requests.id') + ->join('claim_items', 'claim_items.claim_id', '=', 'claims.id') + ->join('benefits', 'benefits.id', '=', 'claim_items.claim_itemable_id') + ->select('claim_requests.status', 'claim_requests.submission_date', 'benefits.description') + ->where('claim_requests.member_id', $data->id) + ->get(); + $data->claim_history = $data_claim_history; + return response()->json(DataMemberResource::make($data)); + + } + + public function showPerMember($corporate_id, $member_id){ + $data = ClaimRequest::where(['member_id' => $member_id]) + ->whereNotNull('claim_id') + ->paginate(10); + return response()->json(Helper::paginateResources(DataListClaimMemberResource::collection($data))); + } + + public function serviceMonitoring($corporate_id, $claim_id) + { + $data = Claim::where('id', $claim_id)->first(); + return Helper::responseJson(DataServiceMonitoring::make($data)); + } + + } + diff --git a/Modules/Client/Http/Controllers/Api/DataController.php b/Modules/Client/Http/Controllers/Api/DataController.php index 6999959f..ae383356 100644 --- a/Modules/Client/Http/Controllers/Api/DataController.php +++ b/Modules/Client/Http/Controllers/Api/DataController.php @@ -3,6 +3,7 @@ namespace Modules\Client\Http\Controllers\Api; use App\Models\Person; +use App\Models\Member; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -29,4 +30,39 @@ class DataController extends Controller return response()->json(['error' => 'Failed to update data'], 500); } } + + public function updateFamily(Request $request) + { + try { + // Ambil data keluarga dari payload + $familyData = $request->json()->all(); + + // Loop melalui data keluarga + foreach ($familyData as $familyMember) { + // Ambil ID anggota keluarga dari payload + $person_id = $familyMember['person_id']; + + // Perbarui data anggota keluarga sesuai dengan payload + Member::where('person_id', $person_id)->update([ + 'name' => $familyMember['name'], + 'email' => $familyMember['email'], + 'relation_with_principal' => $familyMember['relation_with_principal'], + 'birth_date' => $familyMember['birth_date'], + ]); + + Person::where('id', $person_id)->update([ + 'name' => $familyMember['name'], + 'email' => $familyMember['email'], + 'phone' => $familyMember['phone'], + 'birth_date' => $familyMember['birth_date'] + ]); + } + + // Respon sukses jika pembaruan berhasil + return response()->json([$person_id => 'Data keluarga berhasil diperbarui'], 200); + } catch (\Exception $e) { + // Tangani kesalahan jika ada yang terjadi + return response()->json(['error' => 'Gagal memperbarui data keluarga: ' . $e->getMessage()], 500); + } + } } diff --git a/Modules/Client/Http/Controllers/Api/MemberController.php b/Modules/Client/Http/Controllers/Api/MemberController.php new file mode 100644 index 00000000..1c6b6fa0 --- /dev/null +++ b/Modules/Client/Http/Controllers/Api/MemberController.php @@ -0,0 +1,93 @@ +when($request->search, function ($query, $search) { + return $query->where('name', 'LIKE', '%' . $search . '%') + ->orWhere('member_id', 'LIKE', '%' . $search . '%'); + }) + ->with('currentPlan', 'currentCorporate') + ->paginate(); + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + // + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('internal::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('internal::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } + + public function benefits($member_id) + { + $member = Member::findOrFail($member_id); + + return response()->json($member->currentPlan->benefits()->select(['description', 'code', 'id'])->get()); + } +} diff --git a/Modules/Client/Routes/api.php b/Modules/Client/Routes/api.php index 856d2637..43b08350 100644 --- a/Modules/Client/Routes/api.php +++ b/Modules/Client/Routes/api.php @@ -4,14 +4,16 @@ use Modules\Client\Http\Controllers\Api\AuthController; use Modules\Client\Http\Controllers\Api\CorporateDivisionController; use Modules\Client\Http\Controllers\Api\CorporateManageController; use Modules\Client\Http\Controllers\Api\CorporateMemberController; +use Modules\Client\Http\Controllers\Api\CorporateCurrentController; +use Modules\Client\Http\Controllers\Api\MemberController; use Modules\Client\Http\Controllers\Api\CorporatePolicyController; use Modules\Client\Http\Controllers\Api\UserController; use Modules\Client\Http\Controllers\Api\ClaimController; use Modules\Client\Http\Controllers\Api\TopUpController; use Modules\Internal\Http\Controllers\ClaimEncounterController; -use App\Models\Encounter; +use Modules\Client\Http\Controllers\Api\ClaimReportController; +use Modules\Client\Http\Controllers\Api\ClaimRequestController; use Modules\Client\Http\Controllers\Api\DataController; -use Modules\Internal\Transformers\EncounterResource; /* |-------------------------------------------------------------------------- @@ -36,21 +38,38 @@ Route::prefix('client')->group(function () { Route::get('user', [UserController::class, 'index']); Route::get('data/{id}', [DataController::class, 'show']); Route::put('data/{id}', [DataController::class, 'update']); + Route::post('update-family', [DataController::class, 'updateFamily']); Route::get('corporate-manage', [CorporateManageController::class, 'index']); Route::get('corporate-manage/{corporate_id}', [CorporateManageController::class, 'show']); Route::prefix('{corporate_id}')->group(function () { + Route::post('search-member', [MemberController::class, 'index']); Route::get('policy', [CorporatePolicyController::class, 'index']); Route::get('division', [CorporateDivisionController::class, 'index']); Route::get('members', [CorporateMemberController::class, 'index']); Route::get('members/{id}', [CorporateMemberController::class, 'show']); + Route::get('alarm-center-members/{id}', [CorporateMemberController::class, 'showPerMember']); + Route::get('service-monitoring/{id}', [CorporateMemberController::class, 'serviceMonitoring']); Route::get('claims/status', [ClaimController::class, 'status']); Route::get('claims', [ClaimController::class, 'index']); + Route::get('claims/export', [ClaimController::class, 'export']); Route::get('claims/{claim_id}/encounters', [ClaimEncounterController::class, 'getEncounterData']); Route::get('topup', [TopUpController::class, 'index']); // Route::get('topup', [TopUpController::class, 'get']); Route::post('topup', [TopUpController::class, 'store']); + Route::get('claim-report/claim-status', [ClaimReportController::class, 'claimStatus']); + Route::get('claim-report/detail/{id}', [ClaimReportController::class, 'claimDetail']); + Route::get('claim-report/detail-history/{id}', [ClaimReportController::class, 'claimDetailHistory']); + Route::post('claim-report/{id}/request-files', [ClaimReportController::class, 'requestFiles']); + + Route::get('corporate', [CorporateCurrentController::class, 'index']); + Route::put('corporate-update', [CorporateCurrentController::class, 'update']); + + }); Route::get('claims/{id}', [ClaimController::class, 'show']); + + Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store'); + Route::post('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); }); }); diff --git a/Modules/Client/Transformers/AlarmCenter/DataListClaimMemberResource.php b/Modules/Client/Transformers/AlarmCenter/DataListClaimMemberResource.php new file mode 100644 index 00000000..988ebb55 --- /dev/null +++ b/Modules/Client/Transformers/AlarmCenter/DataListClaimMemberResource.php @@ -0,0 +1,37 @@ +member_id); + + return [ + 'id' => $this->id, + 'admission_date' => $this->submission_date, + 'discharge_date' => $this->submission_date, + 'code' => $this->code, + 'service_type' => $this->service_code == 'IP' ? 'Inpatient' : 'Outpatient', + 'status' => $this->service_code == 'approved' ? 'Done' : 'OnGoing', + 'claim_id' => $this->claim_id, + // 'memberId' => $this->member_id, + 'fullName' => $member->name, + // 'division' => $this->division_name ?? '', + // 'status' => $this->status, + // 'claimRequestId' => $this->claim_request_id, + // 'submissionDate' => $this->submission_date, + ]; + } +} diff --git a/Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php b/Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php new file mode 100644 index 00000000..40863b23 --- /dev/null +++ b/Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php @@ -0,0 +1,184 @@ +claim_request_id); + $member = Member::findOrFail($this->member_id); + + + // History Care Hospital + $historyCareHospital = ClaimHistoryCare::where('claim_id', $this->id)->first(); + if ($historyCareHospital) { + $hospital = Organization::findOrFail($historyCareHospital->organization_id)->name; + $mainDianosis = Icd::findOrFail($historyCareHospital->main_diagnosis_id)->name; + $mainDianosisCode = Icd::findOrFail($historyCareHospital->main_diagnosis_id)->code; + + $comporatationDiagnosis = DiagnosisSecondaryClaimHistoryCare::where('claim_history_care_id', $historyCareHospital->id)->first(); + + $comporatationDiagnosisName = Icd::findOrFail($comporatationDiagnosis->icd_id)->name; + $comporatationDiagnosisCode = Icd::findOrFail($comporatationDiagnosis->icd_id)->code; + + $admissionDate = $historyCareHospital->admission_date; + $dischargeDate = $historyCareHospital->discharge_date; + $serviceCode = $historyCareHospital->service_code; + } else { + $hospital = '-'; + $mainDianosis = '-'; + $mainDianosisCode = '-'; + $comporatationDiagnosisName = '-'; + $comporatationDiagnosisCode = '-'; + $admissionDate = '-'; + $dischargeDate = '-'; + $serviceCode = '-'; + } + + + + + + + $dailyMonitoring = DailyMonitoring::where('claim_id', $claim_request->claim_id)->get()->toArray(); + $laboratoriumResult = LaboratoriumResult::where('claim_id', $claim_request->claim_id)->get()->toArray(); + + // Handle Daily Monitoring + $dataDailyMonitoring = []; + if (count($dailyMonitoring) > 0){ + $temp = []; + foreach($dailyMonitoring as $data){ + $temp['date'] = Helper::formatDateOnly($data['created_at']); + $temp['time'] = Helper::formatTimeOnly($data['created_at']); + $temp['status'] = 'Done'; + $temp['subject_title'] = $data['subject']; + $temp['body_temperature'] = $data['body_temperature']. 'mm[Hg]'; + $temp['sistole'] = $data['sistole']. 'mm[Hg]'; + $temp['diastole'] = $data['diastole']. 'mm[Hg]'; + $temp['respiration_rate'] = $data['respiration_rate']. 'mm[Hg]'; + $temp['analisis_title'] = $data['analysis']; + + $medicalPlan = MedicalPlan::where('claim_daily_monitoring_id', $data['id'])->get('plan')->toArray(); + if (count( $medicalPlan) > 0){ + $temp['Perencanaan'] = []; + foreach($medicalPlan as $item){ + array_push($temp['Perencanaan'], $item['plan']); + } + + } else { + $temp['Perencanaan'] = []; + } + array_push($dataDailyMonitoring, $temp); + } + } + + // Handle Laboratorium Result + $dataLaboratoruiumResult = []; + if (count($laboratoriumResult) > 0){ + $tempLab = []; + foreach($laboratoriumResult as $data){ + $tempLab['datetime'] = $data['date']; + $tempLab['reimbursement_code'] = "RE-0" . $data['id']; + $tempLab['examination'] = $data['examination']; + $tempLab['location'] = $data['location']; + + if (count($data['lab_result_file']) > 0){ + $tempLab['file'] = $data['lab_result_file'][0]['lab_result_file_obj']->path; // masih dumy untuk download nya belum bisa multiple + } + array_push($dataLaboratoruiumResult, $tempLab); + } + } + + $data = [ + "id" => $this->id, + "company_name" => $member->currentCorporate->name, + "member_name" => $member->name, + "member_code" => $member->member_id, + "member_id" => $member->id, + "phone" => $member->person->phone, + "email" => $member->email, + "birth_date" => $member->birth_date, + "symptoms" => $historyCareHospital->symptoms ? $historyCareHospital->symptoms : '-' , + "sign" => $historyCareHospital->sign ? $historyCareHospital->sign : '-', + "main_diagnose" => $mainDianosis, + "main_diagnose_code" => $mainDianosisCode, + "comparative_diagnosis" => $comporatationDiagnosisName, + "comparative_diagnosis_code" => $comporatationDiagnosisCode, + "service_name" => $serviceCode, + "benefit_name" => "Konsultasi Dokter", + "hospital" => $hospital, + "admission_date" => $admissionDate, + "discharge_date" => $dischargeDate, + "dialy_monitoring" => $dataDailyMonitoring, + // "laboratorium_result" => [ + // "0" => [ + // [ + // "datetime" => "2023-10-05 10:00", + // "reimbursement_code" => "RE-011", + // "examination" => "SGOT", + // "location" => "Pramita Jakarta Ragunan", + // "files" => "https:://test.com" + // ], + // [ + // "datetime" => "2023-10-05 09:00", + // "reimbursement_code" => "RE-010", + // "examination" => "SGOT", + // "location" => "Pramita Jakarta Ragunan", + // "files" => "https:://test.com" + // ], + // ], + // "1" => [ + // [ + // "datetime" => "2023-10-04 10:00", + // "reimbursement_code" => "RE-09", + // "examination" => "Hematologi Lengkap", + // "location" => "Pramita Jakarta Ragunan", + // "files" => "https:://test.com" + // ], + // [ + // "datetime" => "2023-10-04 09:00", + // "reimbursement_code" => "RE-08", + // "examination" => "Hematologi Lengkap", + // "location" => "Pramita Jakarta Ragunan", + // "files" => "https:://test.com" + // ] + // ] + + // ], + + "laboratorium_result" => [$dataLaboratoruiumResult], // + + + ]; + + + return $data; + } +} diff --git a/Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php b/Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php new file mode 100644 index 00000000..5ad24d34 --- /dev/null +++ b/Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php @@ -0,0 +1,24 @@ + $this->id, + 'fileName' => $this->name, + 'fileUrl' => url(Storage::url($this->path)) + ]; + } +} diff --git a/Modules/Client/Transformers/ClaimReport/MemberResources.php b/Modules/Client/Transformers/ClaimReport/MemberResources.php index 088f3510..aae5a707 100644 --- a/Modules/Client/Transformers/ClaimReport/MemberResources.php +++ b/Modules/Client/Transformers/ClaimReport/MemberResources.php @@ -3,6 +3,7 @@ namespace Modules\Client\Transformers\ClaimReport; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Facades\Crypt; class MemberResources extends JsonResource { @@ -16,11 +17,13 @@ class MemberResources extends JsonResource { return [ 'id' => $this->id, - 'memberId' => $this->member_id, - 'fullName' => $this->full_name, - 'division' => $this->division_name ?? '', - 'submission_date' => '', - 'status' => $this->active, + 'code' => $this->code, + 'member_id' => $this->member_id, + 'full_name' => $this->full_name, + 'division_name' => $this->division_name ?? '', + 'status' => $this->status, + 'claimRequestId' => Crypt::encrypt($this->claim_request_id), + 'submission_date' => $this->submission_date, ]; } } diff --git a/Modules/Client/Transformers/ClaimReport/ShowResources.php b/Modules/Client/Transformers/ClaimReport/ShowResources.php new file mode 100644 index 00000000..d00c15f9 --- /dev/null +++ b/Modules/Client/Transformers/ClaimReport/ShowResources.php @@ -0,0 +1,31 @@ + $this->id, + 'claimId' => $this->claim_id, + 'submissionDate' => $this->submission_date, + 'histories' => $this->whenLoaded('histories'), + 'fullName' => $this->whenLoaded('member', $this->member->full_name), + 'status' => $this->status, + 'files' => [ + 'claimResults' => ClaimReportFileShowResources::collection($this->whenLoaded('claimResults')), + 'claimConditions' => ClaimReportFileShowResources::collection($this->whenLoaded('claimConditions')), + 'claimDiagnosis' => ClaimReportFileShowResources::collection($this->whenLoaded('claimDiagnosis')) + ] + ]; + } +} diff --git a/Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php b/Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php new file mode 100644 index 00000000..23d66c0e --- /dev/null +++ b/Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php @@ -0,0 +1,27 @@ + $this->id, + 'personId' => $this->person_id, + 'memberId' => $this->member_id, + 'fullName' => $this->full_name, + 'service' => $this->service_code, + 'start_date' => $this->start_date, + 'end_date' => $this->end_date, + 'status' => $this->active, + ]; + } +} diff --git a/Modules/Client/Transformers/Dashboard/MemberResources.php b/Modules/Client/Transformers/Dashboard/MemberResources.php index b5fbd836..d53d88ea 100644 --- a/Modules/Client/Transformers/Dashboard/MemberResources.php +++ b/Modules/Client/Transformers/Dashboard/MemberResources.php @@ -14,6 +14,7 @@ class MemberResources extends JsonResource */ public function toArray($request) { + // dd($this->currentPlans); return [ 'id' => $this->id, 'memberId' => $this->member_id, @@ -25,6 +26,7 @@ class MemberResources extends JsonResource 'percentage' => (!empty($this->currentPlan->limit_rules ?? 0)) ? (($this->claims_sum_total_claim / $this->currentPlan->limit_rules) * 100) : 0 ], 'status' => $this->active, + 'service_type' => $this->currentPlans, ]; } } diff --git a/Modules/Client/Transformers/DataMemberResource.php b/Modules/Client/Transformers/DataMemberResource.php index f9ece3c6..9f13d32b 100644 --- a/Modules/Client/Transformers/DataMemberResource.php +++ b/Modules/Client/Transformers/DataMemberResource.php @@ -25,10 +25,21 @@ class DataMemberResource extends JsonResource 'name' => $this->name, 'name_suffix' => $this->name_suffix, 'birth_date' => $this->birth_date, + 'birth_place' => $this->person->birth_place, + 'last_weight_kg' => $this->person->last_weight_kg, + 'last_height_cm'=> $this->person->last_height_cm, + 'phone' => $this->person->phone, + 'nik' => $this->person->nik, + 'religion' => $this->person->religion, + 'marital_status' => $this->person->marital_status, + 'last_education' => $this->person->last_education, + 'current_employment' => $this->person->current_employment, + 'main_address_id' => $this->person->currentAddress->text, + 'family' => $this->family, + 'claim_history' => $this->claim_history, 'gender' => $this->gender, 'language' => $this->language, 'race' => $this->race, - 'marital_status' => $this->marital_status, 'record_type' => $this->record_type, 'principal_id' => $this->principal_id, 'relation_with_principal' => $this->relation_with_principal, diff --git a/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php b/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php index 1d03ab6c..54d56720 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php @@ -16,6 +16,9 @@ use Illuminate\Routing\Controller; use Modules\HospitalPortal\Transformers\ClaimRequestResource; use Modules\HospitalPortal\Transformers\ClaimRequestShowResource; use PDF; +use Illuminate\Support\Facades\DB; +use Modules\HospitalPortal\Helpers\ApiResponse; +use Illuminate\Support\Facades\Validator; class ClaimRequestController extends Controller { @@ -23,6 +26,7 @@ class ClaimRequestController extends Controller * Display a listing of the resource. * @return Renderable */ + private static $code_prefix = 'CRQ-H'; public function index(request $request) { $claimRequests = ClaimRequest::query() @@ -60,70 +64,93 @@ class ClaimRequestController extends Controller */ public function store(Request $request) { - $request->validate([ + $data = [ + 'request_logs_id' => $request->request_logs_id, + 'member_id' => $request->member_id, + 'service_code' => $request->service_code + ]; + $validator = Validator::make($request->all(), [ + 'request_logs_id' => 'required', 'member_id' => 'required', - 'service_code' => 'required|in:OP,IP' + 'service_code' => 'required' + ], [ + 'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Log ID']), + 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), + 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']) ]); - - $member = Member::find($request->member_id); - $newClaimRequest = ClaimRequestService::storeClaimRequest(member: $member, paymentType: 'reimbursement', serviceCode: $request->service_code); - - ClaimRequested::dispatch($newClaimRequest); - - // Log History - $newClaimRequest->histories()->create([ - 'title' => 'New Claim Requested', - 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", - 'type' => 'info', - 'system_origin' => 'hospital-portal' - ]); - - if ($request->hasFile('result_files')) { - foreach ($request->result_files as $file) { - $pathFile = File::storeFile('claim-result', $newClaimRequest->id, $file); - $newClaimRequest->files()->updateOrCreate([ - 'type' => 'claim-result', - 'name' => File::getFileName('claim-result', $newClaimRequest->id, $file), - 'original_name' => $file->getClientOriginalName(), - 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, - 'created_by' => auth()->user()->id, - 'updated_by' => auth()->user()->id, - ]); - } + if ($validator->fails()) + { + return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); } - - if ($request->hasFile('diagnosa_files')) { - foreach ($request->diagnosa_files as $file) { - $pathFile = File::storeFile('claim-diagnosis', $newClaimRequest->id, $file); - $newClaimRequest->files()->updateOrCreate([ - 'type' => 'claim-diagnosis', - 'name' => File::getFileName('claim-diagnosis', $newClaimRequest->id, $file), - 'original_name' => $file->getClientOriginalName(), - 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, - 'created_by' => auth()->user()->id, - 'updated_by' => auth()->user()->id, - ]); + else + { + $check_claim_requests = DB::table('claim_requests') + ->where('claim_requests.request_log_id', '=', $request->request_logs_id) + ->first(); + if(!$check_claim_requests) + { + try { + DB::beginTransaction(); + $code = $this->getNextCode(); + $member = Member::find($request->member_id); + $newClaimRequest = ClaimRequestService::storeClaimRequest( + row: [], + code: $code, + member: $member, + paymentType: 'reimbursement', + serviceCode: $request->service_code, + requestLogID: $request->request_logs_id, + ); + // Log History + $newClaimRequest->histories()->create([ + 'title' => 'New Claim Requested', + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'type' => 'info', + 'system_origin' => 'hospital-portal' + ]); + + // Claim Log + DB::table('claim_logs') + ->insert([ + 'claim_request_id' => $newClaimRequest->id, + 'status' => 'requested', + 'date' => date('Y-m-d H:i:s'), + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'system_origin' => 'hospital-portal', + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at'=> date('Y-m-d H:i:s'), + ]); + + + if ($request->hasFile('additional_files')) { + foreach ($request->additional_files as $file) { + $pathFile = File::storeFile('additional-files', $newClaimRequest->id, $file); + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'additional-files', + 'name' => File::getFileName('additional-files', $newClaimRequest->id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + DB::commit(); + return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200); + } + catch (\Exception $e) { + DB::rollback(); + return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500); + } } - } - - if ($request->hasFile('kondisi_files')) { - foreach ($request->result_files as $file) { - $pathFile = File::storeFile('claim-kondisi', $newClaimRequest->id, $file); - $newClaimRequest->files()->updateOrCreate([ - 'type' => 'claim-kondisi', - 'name' => File::getFileName('claim-kondisi', $newClaimRequest->id, $file), - 'original_name' => $file->getClientOriginalName(), - 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, - 'created_by' => auth()->user()->id, - 'updated_by' => auth()->user()->id, - ]); + else + { + return ApiResponse::apiResponse("Error", $data, trans('Message.already_exists'), 409); } + } - - return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!'); } /** @@ -137,7 +164,8 @@ class ClaimRequestController extends Controller $claimRequest->load([ 'histories' => function ($history) { $history->latest(); - } + }, + 'files', ]); return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest)); @@ -178,16 +206,260 @@ class ClaimRequestController extends Controller { $claimRequest = ClaimRequest::findOrFail($claim_request_id); + $service_code = $claimRequest->service_code; if ($claimRequest->status != 'approved') { throw new Exception("Belum Teverifikasi", 1); } $member = Member::findOrFail($claimRequest->member_id) - ->load(['currentPlan', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']); + ->load([ + // 'currentPlan', + 'currentPlan' => function ($plan) use ($claim_request_id, $service_code) { + $plan->where('plans.service_code', $service_code); + }, + 'currentPolicy', + 'currentPlan.corporateBenefits', + 'currentPlan.corporateBenefits.benefit' + ]); $pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'claimRequest')); return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf'); return $claimRequest; } + + public static function getNextCode() + { + $last_number = ClaimRequest::withTrashed()->max('code'); + $last_number_parts = explode('-', $last_number); + $next_number = count($last_number_parts) < 3 ? 1 : ((int) $last_number_parts[2] + 1); + return self::makeCode($next_number); + } + + public static function makeCode($next_number) + { + // Pastikan $next_number adalah integer positif + $next_number = max(1, (int) $next_number); + + // Menghasilkan kode dengan format yang diinginkan + return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT); + } + + public function get_claim_requests(Request $request) + { + + $limit = $request->has('per_page') ? $request->input('per_page') : 10; + + $results = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->when($request->input('search'), function ($query, $search) { + $query->where(function ($query) use ($search) { + $query->orWhere('claim_requests.code', 'like', "%" . ($search == 'outpatient' || $search == 'Outpatient' ? 'OP' : 'IP') . "%") + ->orWhere('members.member_id', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%") + ->orWhere('corporate_divisions.name', 'like', "%" . $search . "%") + ->orWhere('claim_requests.status', 'like', "%" . $search . "%") + ->orWhere('claim_requests.submission_date', 'like', "%" . $search . "%") + ->orWhere('claims.status', 'like', "%" . $search . "%"); + }); + }) + ->when($request->has('orderBy'), function ($query) use ($request) { + $orderBy = $request->orderBy; + $direction = $request->order ?? 'asc'; + + $query->orderBy($orderBy, $direction); + }) + ->when($request->input('start_date') && !$request->input('end_date'), function ($query, $start_date) { + $query->where(function ($query) use ($start_date) { + $query->where('claim_requests.submission_date', '<', $start_date); + }); + }) + ->when($request->input('status'), function ($query, $status) { + $query->where(function ($query) use ($status) { + + if ($status === 'requested') { + $query->where('claim_requests.status', '=', 'requested'); + } + + if ($status === 'reviewed') { + $query->where('claim_requests.status', '=', 'approved'); + $query->where('claims.status', '=', 'received'); + } + + if ($status === 'approved') { + $query->where('claim_requests.status', '=', 'approved'); + $query->where('claims.status', '=', 'approved'); + } + + if ($status === 'declined') { + $query->where('claim_requests.status', '=', 'approved'); + $query->where('claims.status', '=', 'declined'); + } + + }); + }) + ->select( + 'members.id', + 'claim_requests.code', + 'members.member_id', + 'members.name as full_name', + 'corporate_divisions.name AS division_name', + DB::raw(' + CASE + WHEN claim_requests.status = "requested" THEN "requested" + WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" + ELSE "" + END AS status + '), + 'claim_requests.id AS claim_request_id', + 'claim_requests.submission_date', + DB::raw(' + CASE + WHEN service_code = "OP" THEN "Outpatient" + WHEN service_code = "IP" THEN "Inpatient" + ELSE "" + END AS service_type + ') + ) + ->paginate($limit); + return response()->json(Helper::paginateResources($results)); + } + + public function detail_claim_requests($claimRequestId) + { + + $status = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->where('claim_requests.id', '=', $claimRequestId) + ->select( + 'claim_requests.submission_date', + DB::raw(' + CASE + WHEN claim_requests.status = "requested" THEN "requested" + WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" + ELSE "" + END AS status + ') + ) + ->first(); + $results['status'] = $status; + $timeline = DB::table('claim_logs') + ->where('claim_logs.claim_request_id', '=', $claimRequestId) + ->select( + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "Request" + WHEN claim_logs.status = "reviewed" THEN "Review" + WHEN claim_logs.status = "approved" THEN "Approval" + WHEN claim_logs.status = "declined" THEN "Decline" + ELSE "-" + END AS txt_status + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#159C9C" + WHEN claim_logs.status = "reviewed" THEN "#0C53B7" + WHEN claim_logs.status = "approved" THEN "#229A16" + WHEN claim_logs.status = "declined" THEN "#FF4842" + ELSE "-" + END AS txt_status_color + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#00AB5529" + WHEN claim_logs.status = "reviewed" THEN "#1890FF29" + WHEN claim_logs.status = "approved" THEN "#54D62C29" + WHEN claim_logs.status = "declined" THEN "#FF48427A" + ELSE "-" + END AS txt_status_backgroundColor + '), + 'claim_logs.date', + 'claim_logs.description', + 'claim_logs.status' + ) + ->orderBy('claim_logs.id', 'desc') + ->get(); + $results['timeline'] = $timeline; + $request_files = DB::table('claim_request_files') + ->where('claim_request_files.claim_request_id', '=', $claimRequestId) + ->select( + 'claim_request_files.*', + DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), + ) + ->get(); + $results['request_files'] = $request_files; + + return Helper::responseJson($results); + } + + public function requestFiles(Request $request, $claim_id) + { + + if ($request->hasFile('fileDiagnosis')) { + foreach ($request->fileDiagnosis as $file) { + $pathFile = File::storeFile('claim-diagnosis', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-diagnosis', + 'name' => File::getFileName('claim-diagnosis', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileKondisis')) { + foreach ($request->fileKondisis as $file) { + $pathFile = File::storeFile('claim-kondisi', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-kondisi', + 'name' => File::getFileName('claim-kondisi', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileResults')) { + foreach ($request->fileResults as $file) { + $pathFile = File::storeFile('claim-result', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-result', + 'name' => File::getFileName('claim-result', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); + } } diff --git a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php index de33a43a..4a69d876 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php @@ -9,6 +9,7 @@ use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Validator; use Modules\HospitalPortal\Helpers\ApiResponse; +use Illuminate\Support\Facades\DB; class MemberController extends Controller { @@ -26,8 +27,8 @@ class MemberController extends Controller 'no_polis' => 'required', 'birth_date' => 'required' ], [ - 'no_polis.required' => trans('validation.required',['attribute' => 'Member ID']), - 'birth_date.required' => trans('validation.required',['attribute' => 'Birth Date']), + 'no_polis.required' => trans('Validation.required',['attribute' => 'Member ID']), + 'birth_date.required' => trans('Validation.required',['attribute' => 'Birth Date']), ]); if ($validator->fails()) { @@ -35,20 +36,74 @@ class MemberController extends Controller } else { - $res_data = Member::query() - ->where('member_id', $request->no_polis) - ->where('birth_date', $request->birth_date) - ->with(['person', 'currentCorporate', - // 'currentCorporate.corporateServices' => function ($corporateService) { - // $corporateService->where('status', 'active'); - // }, - // 'currentCorporate.corporateServices.service' - // 'currentPlan.benefits', - // 'currentPlan.corporateBenefit.plan', - 'currentPlan.corporateBenefits.benefit' - ]) - ->firstOrFail(); - return ApiResponse::apiResponse("Success", $res_data, trans('message.success'), 200); + $members = DB::table('members') + ->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id') + ->leftJoin('persons', 'persons.id', '=', 'members.person_id') + ->where('members.member_id', '=', $request->no_polis) + ->where('members.birth_date', '=', $request->birth_date) + ->select( + 'members.id', + 'members.name', + 'members.member_id', + 'member_policies.policy_id', + 'persons.nik', + 'members.email', + 'members.birth_date', + 'members.gender', + 'members.marital_status', + 'members.language', + 'members.race', + 'members.relation_with_principal') + ->first(); + if($members) + { + $res_data['members'] = $members; + + $benefits = DB::table('member_plans') + ->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id') + ->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id') + ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') + ->leftJoin('services', 'services.code', '=', 'plans.service_code') + ->where('member_plans.member_id', '=', $members->id) + ->select( + 'benefits.description', + 'benefits.code', + 'corporate_benefits.corporate_id', + 'plans.service_code' + ) + ->get(); + $res_data['benefits'] = $benefits; + + $services = DB::table('member_plans') + ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') + ->leftJoin('services', 'services.code', '=', 'plans.service_code') + ->where('member_plans.member_id', $members->id) + ->select('plans.service_code', 'services.name') + ->get(); + $res_data['services'] = $services; + + // Group Services + $groupServices = []; + foreach ($res_data['benefits'] as $benefit) { + $serviceCode = $benefit->service_code; + $groupServices[$serviceCode][] = [ + 'description' => $benefit->description, + 'code' => $benefit->code, + ]; + } + + $res_data['groupServices'] = $groupServices; + + $res_data['type'] = $request->type; + + + return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200); + } + else + { + return ApiResponse::apiResponse("Data Not Found", $data, trans('Message.not_found'), 404); + } + } } } diff --git a/Modules/HospitalPortal/Http/Controllers/Api/NotificationController.php b/Modules/HospitalPortal/Http/Controllers/Api/NotificationController.php new file mode 100644 index 00000000..7a5096d5 --- /dev/null +++ b/Modules/HospitalPortal/Http/Controllers/Api/NotificationController.php @@ -0,0 +1,86 @@ + $hospital_id, + ]; + if (!$hospital_id) + { + return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404); + } + else + { + try { + $notifications = DB::table('notifications') + ->join('notification_types', 'notification_types.id', '=', 'notifications.type') + ->select( + 'notifications.id', + 'notifications.title', + 'notifications.description', + 'notifications.avatar', + 'notification_types.type', + DB::raw('DATE_FORMAT(notifications.created_at, "%Y-%m-%dT%H:%i:%s.000+07:00") as createdAt'), + 'notifications.isUnRead', + ) + ->where('hospital_id', '=', $hospital_id) + ->get(); + $res_data['notifications'] = $notifications; + return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200); + } + catch (\Exception $e) { + return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500); + } + } + } + + public function setReadNotification(Request $request) + { + $data = [ + 'hospital_id' => $request->hospital_id, + 'id' => $request->id, + 'isUnRead'=> 0, + ]; + $validator = Validator::make($request->all(), [ + 'hospital_id' => 'required', + 'id' => 'required' + ], [ + 'hospital_id.required' => trans('Validation.required',['attribute' => 'Hospital ID']), + 'id.required' => trans('Validation.required',['attribute' => 'ID']), + ]); + if ($validator->fails()) + { + return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); + } + else + { + try { + DB::beginTransaction(); + DB::table('notifications') + ->where('notifications.id', '=', $request->id) + ->update($data); + DB::commit(); + return ApiResponse::apiResponse("Success", $data, trans('Message.read_notification'), 200); + + } + catch (\Exception $e) { + DB::rollback(); + return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500); + } + } + } + +} \ No newline at end of file diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php new file mode 100644 index 00000000..a3d8ea35 --- /dev/null +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -0,0 +1,284 @@ + $request->member_id, + 'service_code' => $request->service_code + ]; + $validator = Validator::make($request->all(), [ + 'member_id' => 'required', + 'service_code' => 'required' + ], [ + 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), + 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), + ]); + if ($validator->fails()) + { + return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); + } + else + { + + $requestLogControllerInstance = new PrimeCenterRequestLog(); + $response = $requestLogControllerInstance->createNew($request); + + if($response->original['statusCode'] == 200) + { + return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200); + } + else + { + return ApiResponse::apiResponse('Server Error', $data, trans('Message.server_error'), 500); + } + } + } + + public function getRequestLog(Request $request) + { + + $limit = $request->has('per_page') ? $request->input('per_page') : 10; + + $results = DB::table('request_logs') + ->leftJoin('members', 'request_logs.member_id', '=', 'members.id') + ->when($request->input('search'), function ($query, $search) { + $query->where(function ($query) use ($search) { + $query->orWhere('request_logs.code', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%") + ->orWhere('request_logs.submission_date', 'like', "%" . $search . "%"); + }); + }) + ->when($request->has('orderBy'), function ($query) use ($request) { + $orderBy = $request->orderBy; + $direction = $request->order ?? 'asc'; + + $query->orderBy($orderBy, $direction); + }) + ->when($request->input('start_date') && !$request->input('end_date'), function ($query, $start_date) { + $query->where(function ($query) use ($start_date) { + $query->where('request_logs.submission_date', '<', $start_date); + }); + }) + ->when($request->input('status'), function ($query, $status) { + $query->where(function ($query) use ($status) { + + if ($status === 'requested') { + $query->where('request_logs.status', '=', 'requested'); + } + + if ($status === 'reviewed') { + $query->where('request_logs.status', '=', 'approved'); + } + + if ($status === 'approved') { + $query->where('request_logs.status', '=', 'approved'); + } + + if ($status === 'declined') { + $query->where('request_logs.status', '=', 'declined'); + } + + }); + }) + ->select( + 'request_logs.id', + 'request_logs.final_log', + 'request_logs.code', + 'members.name as full_name', + 'members.member_id as no_polis', + 'members.birth_date', + DB::raw(' + CASE + WHEN request_logs.status = "requested" THEN "requested" + WHEN request_logs.status = "approved" THEN "approved" + WHEN request_logs.status = "declined" THEN "declined" + WHEN request_logs.status = "reviewed" THEN "reviewed" + ELSE "" + END AS status + '), + 'request_logs.submission_date') + ->paginate($limit); + return response()->json(Helper::paginateResources($results)); + } + + public function getFinalLog(Request $request) + { + + $limit = $request->has('per_page') ? $request->input('per_page') : 10; + + $results = DB::table('request_logs') + ->leftJoin('members', 'request_logs.member_id', '=', 'members.id') + ->when($request->input('search'), function ($query, $search) { + $query->where(function ($query) use ($search) { + $query->orWhere('request_logs.code', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%") + ->orWhere('request_logs.submission_date', 'like', "%" . $search . "%") + ->orWhere('request_logs.service_code', 'like', "%" . ($search == 'outpatient' || $search == 'Outpatient' ? 'OP' : 'IP') . "%"); + }); + }) + ->when($request->has('orderBy'), function ($query) use ($request) { + $orderBy = $request->orderBy; + $direction = $request->order ?? 'asc'; + + $query->orderBy($orderBy, $direction); + }) + ->when($request->input('start_date') && !$request->input('end_date'), function ($query, $start_date) { + $query->where(function ($query) use ($start_date) { + $query->where('request_logs.submission_date', '<', $start_date); + }); + }) + ->when($request->input('status'), function ($query, $status) { + $query->where(function ($query) use ($status) { + + if ($status === 'requested') { + $query->where('request_logs.status_final_log', '=', 'requested'); + } + + if ($status === 'reviewed') { + $query->where('request_logs.status_final_log', '=', 'approved'); + } + + if ($status === 'approved') { + $query->where('request_logs.status_final_log', '=', 'approved'); + } + + if ($status === 'declined') { + $query->where('request_logs.status_final_log', '=', 'declined'); + } + + }); + }) + ->where('request_logs.final_log', '=', 1) + ->select( + 'request_logs.id', + 'request_logs.final_log', + 'request_logs.code', + 'members.name as full_name', + 'members.member_id as no_polis', + 'members.id AS member_id', + 'request_logs.service_code', + 'members.birth_date', + DB::raw(' + CASE + WHEN request_logs.status_final_log = "requested" THEN "requested" + WHEN request_logs.status_final_log = "approved" THEN "approved" + WHEN request_logs.status_final_log = "declined" THEN "declined" + WHEN request_logs.status_final_log = "reviewed" THEN "reviewed" + ELSE "" + END AS status + '), + 'request_logs.submission_date', + DB::raw(' + CASE + WHEN service_code = "OP" THEN "Outpatient" + WHEN service_code = "IP" THEN "Inpatient" + ELSE "" + END AS service_type + '), + DB::raw(' + (Select request_log_id FROM claim_requests WHERE claim_requests.request_log_id = request_logs.id LIMIT 1) AS check_claim + ') + ) + ->paginate($limit); + return response()->json(Helper::paginateResources($results)); + } + + public function requestFinalLog(Request $request) + { + $data = [ + 'request_logs_id' => $request->request_logs_id + ]; + $validator = Validator::make($request->all(), [ + 'request_logs_id' => 'required' + ], [ + 'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Logs ID']) + ]); + if ($validator->fails()) + { + return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); + } + else + { + try { + DB::beginTransaction(); + DB::table('request_logs') + ->where('request_logs.id', '=', $request->request_logs_id) + ->update([ + 'status_final_log' => 'requested', + 'final_log' => 1 + ]); + if ($request->hasFile('result_files')) { + foreach ($request->result_files as $file) { + $pathFile = File::storeFile('final-log-result', $request->request_logs_id, $file); + File::updateOrCreate([ + 'fileable_type' => 'App\Models\RequestLog', + 'fileable_id' => $request->request_logs_id, + 'type' => 'final-log-result', + 'name' => File::getFileName('final-log-result', $request->request_logs_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + if ($request->hasFile('diagnosa_files')) { + foreach ($request->diagnosa_files as $file) { + $pathFile = File::storeFile('final-log-diagnosis', $request->request_logs_id, $file); + File::updateOrCreate([ + 'fileable_type' => 'App\Models\RequestLog', + 'fileable_id' => $request->request_logs_id, + 'type' => 'final-log-diagnosis', + 'name' => File::getFileName('final-log-diagnosis', $request->request_logs_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + if ($request->hasFile('kondisi_files')) { + foreach ($request->kondisi_files as $file) { + $pathFile = File::storeFile('final-log-kondisi', $request->request_logs_id, $file); + File::updateOrCreate([ + 'fileable_type' => 'App\Models\RequestLog', + 'fileable_id' => $request->request_logs_id, + 'type' => 'final-log-kondisi', + 'name' => File::getFileName('final-log-kondisi', $request->request_logs_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + DB::commit(); + return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200); + } + catch (\Exception $e) { + DB::rollback(); + return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500); + } + } + } +} diff --git a/Modules/HospitalPortal/Http/Middleware/Authorization.php b/Modules/HospitalPortal/Http/Middleware/Authorization.php index 430258bb..de3dfd1d 100644 --- a/Modules/HospitalPortal/Http/Middleware/Authorization.php +++ b/Modules/HospitalPortal/Http/Middleware/Authorization.php @@ -27,11 +27,11 @@ class Authorization // Add language if(!$locale) { - return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Accept-Language']), 401); + return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept-Language']), 401); } if($locale !== 'en-US' && $locale !== 'id-ID') { - return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Accept-Language']), 400); + return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept-Language']), 400); } if ($locale === 'en-US') { @@ -46,25 +46,25 @@ class Authorization // Validate authorization if (empty($authorization) || strpos($authorization, 'Bearer ') !== 0) { - return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Authorization']), 401); + return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Authorization']), 401); } // Validate type accept & content type if (!$acceptHeader) { - return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Accept']), 401); + return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept']), 401); } - if (!$contentType) + if (!$contentType && $request->isMethod('post')) { - return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Content-Type']), 401); + return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Content-Type']), 401); } if ($acceptHeader !== 'application/json') { - return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Accept']), 400); + return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept']), 400); } - if($contentType !== 'application/json') + if($contentType !== 'application/json' && $request->isMethod('post')) { - return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Content-Type']), 400); + return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Content-Type']), 400); } return $next($request); } diff --git a/Modules/HospitalPortal/Routes/api.php b/Modules/HospitalPortal/Routes/api.php index 3ff6dc32..fabf81c9 100644 --- a/Modules/HospitalPortal/Routes/api.php +++ b/Modules/HospitalPortal/Routes/api.php @@ -5,6 +5,8 @@ use Modules\HospitalPortal\Http\Controllers\Api\AuthController; use Modules\HospitalPortal\Http\Controllers\Api\ClaimRequestController; use Modules\HospitalPortal\Http\Controllers\Api\MemberController; use Modules\HospitalPortal\Http\Controllers\ClaimController; +use Modules\HospitalPortal\Http\Controllers\Api\NotificationController; +use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController; use Modules\HospitalPortal\Http\Middleware\Authentication; use Modules\HospitalPortal\Http\Middleware\Authorization; @@ -42,15 +44,40 @@ Route::prefix('v1')->group(function() { Route::get('claims', [ClaimController::class, 'index']); Route::middleware(Authorization::class)->group(function () { + //Search Member Route::controller(MemberController::class)->group(function () { Route::post('search-member', 'search'); }); + // Request LOG + Route::controller(RequestLogController::class)->group(function () { + Route::post('request-log', 'requestLog'); + Route::get('get-request-log', 'getRequestLog'); + Route::get('get-final-log', 'getFinalLog'); + Route::post('request-final-log', 'requestFinalLog'); + }); + //Notification + Route::controller(NotificationController::class)->group(function() { + //get notifications + Route::get('notifications/{hospital_id}', 'getNotifications'); + //Set read notification + Route::post('set-read-notification', 'setReadNotification'); + }); + }); + // Request Final LOG + Route::controller(RequestLogController::class)->group(function () { + Route::post('request-final-log', 'requestFinalLog'); + }); + // Claim Submit + Route::controller(ClaimRequestController::class)->group(function () { + Route::post('claim-requests', 'store'); }); - Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index'); - Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store'); + // Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store'); Route::get('claim-requests/{claim_request_id}/log', [ClaimRequestController::class, 'generateLog'])->name('claim-requests.generate-log'); Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); + Route::get('get-claim-requests', [ClaimRequestController::class, 'get_claim_requests'])->name('claim-requests.get_claim_requests'); + Route::get('detail-claim-requests/{id}', [ClaimRequestController::class, 'detail_claim_requests'])->name('claim-requests.detail_claim_requests'); + Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']); }); }); }); diff --git a/Modules/HospitalPortal/Transformers/ClaimRequestShowResource.php b/Modules/HospitalPortal/Transformers/ClaimRequestShowResource.php index 6bda3c8e..6ce23566 100644 --- a/Modules/HospitalPortal/Transformers/ClaimRequestShowResource.php +++ b/Modules/HospitalPortal/Transformers/ClaimRequestShowResource.php @@ -3,6 +3,7 @@ namespace Modules\HospitalPortal\Transformers; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Str; class ClaimRequestShowResource extends JsonResource { @@ -25,6 +26,12 @@ class ClaimRequestShowResource extends JsonResource 'histories' => $histories ]; } + + // Map Files by type + $filesGroupByType = $this->files->mapToGroups(function($file) { + return [Str::slug($file->type, '_') => $file]; + }); + $data['files_by_type'] = $filesGroupByType; return $data; } diff --git a/Modules/Internal/Http/Controllers/Api/AuditTrailController.php b/Modules/Internal/Http/Controllers/Api/AuditTrailController.php index dd5ca4e4..4c720002 100644 --- a/Modules/Internal/Http/Controllers/Api/AuditTrailController.php +++ b/Modules/Internal/Http/Controllers/Api/AuditTrailController.php @@ -4,6 +4,7 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\AuditTrail; +use App\Models\ExclusionRules; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -19,7 +20,7 @@ class AuditTrailController extends Controller { $audittrails = AuditTrail::query() ->where('model', '=', $request->model) ->where('model_id', '=', $id) - // ->latest() + ->latest() ->paginate(1000); return response()->json(Helper::paginateResources(AuditTrailResource::collection($audittrails))); } diff --git a/Modules/Internal/Http/Controllers/Api/ClaimController.php b/Modules/Internal/Http/Controllers/Api/ClaimController.php index c339e819..5b84078c 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimController.php @@ -8,13 +8,22 @@ use App\Models\Claim; use App\Models\Icd; use App\Models\Member; use App\Models\Organization; +use App\Models\ClaimHistoryCare; +use App\Models\DiagnosisSecondaryClaimHistoryCare; use App\Services\ClaimService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Modules\HospitalPortal\Helpers\ApiResponse; +use Illuminate\Support\Facades\Validator; use Modules\Internal\Transformers\ClaimShowResource; +use Modules\Internal\Transformers\ClaimEditResource; +use Modules\Internal\Transformers\ClaimHistoryCareResource; use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\View; + use PDF; class ClaimController extends Controller @@ -23,21 +32,41 @@ class ClaimController extends Controller * Display a listing of the resource. * @return Renderable */ - public function index() + public function index(Request $request) { + // $serviceCode = 'IP'; $claims = Claim::with([ - 'member', - 'diagnoses' => function ($diagnosis) { - return $diagnosis->where('type', 'primary'); - }, - 'diagnoses.icd', - 'plan', - 'benefit', - 'claimRequest', - 'claimRequest.service' - ]) - ->latest() - ->paginate(10); + 'member', + 'member.currentCorporate', + 'member.currentCorporate.currentPolicy', + // 'member.currentPlan' => function($memberPlan) use ($serviceCode) { + // $memberPlan->where('plans.service_code', $serviceCode); + // }, + 'member.currentPlan' => function($memberPlan) { + $memberPlan->join('claim_requests', 'claim_requests.service_code', '=', 'plans.service_code'); + }, + 'diagnoses' => function ($diagnosis) { + $diagnosis->where('type', 'primary'); + }, + 'diagnoses.icd', + 'benefit', + 'claimRequest', + 'claimRequest.service', + ]) + ->when($request->search, function ($q, $search) { + $q->where(function ($subQuery) use ($search) { + $subQuery->whereHas('claimRequest', function ($claimRequest) use ($search) { + $claimRequest->where('code', 'LIKE', "%" . $search . "%"); + }) + ->orWhereHas('member', function ($member) use ($search) { + $member->where('name', 'LIKE', "%" . $search . "%"); + }); + }); + }) + ->where('status', '!=', 'requested') // Penjagaan agar approve baru masuk ke claim management + ->latest() + ->paginate(10); + return response()->json($claims); } @@ -96,8 +125,50 @@ class ClaimController extends Controller { $claim = Claim::query() ->with([ - 'member', - 'member.currentPlan', + 'member', + // 'member.currentPlan', + // 'member.currentPlan.benefits', + 'member.currentCorporate', + // 'member.currentPolicy', + // // 'diagnosis', + // 'diagnoses', + // 'diagnoses.icd', + // 'benefit', + // 'files', + // 'claimRequest', + // 'claimRequest.files', + // 'items', + // 'items.claim_itemable', + // 'encounters', + // 'encounters.doctors', + // 'encounters.primaryDiagnoses', + // 'encounters.primaryDiagnoses.diagnosis', + // 'encounters.healthcare', + 'historyHospitalCare', + 'historyHospitalCare.person', + 'historyHospitalCare.practitioner', + 'historyHospitalCare.organization', + 'historyHospitalCare.icd', + 'historyHospitalCare.comparativeDiagnosis', + 'historyHospitalCare.comparativeDiagnosis.icd', + ]) + ->findOrFail($id); + + return Helper::responseJson(ClaimShowResource::make($claim)); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + $claim = Claim::query() + ->with([ + 'member', + 'plan', + 'member.currentPlan', 'member.currentPlan.benefits', 'member.currentCorporate', 'member.currentPolicy', @@ -118,17 +189,7 @@ class ClaimController extends Controller ]) ->findOrFail($id); - return Helper::responseJson(ClaimShowResource::make($claim)); - } - - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ - public function edit($id) - { - return view('internal::edit'); + return Helper::responseJson(ClaimEditResource::make($claim)); } /** @@ -139,7 +200,42 @@ class ClaimController extends Controller */ public function update(Request $request, $id) { - // + $customMessages = [ + 'required' => 'Kolom :attribute wajib diisi.', + 'numeric' => 'Kolom :attribute harus berupa angka.', + ]; + + $data = [ + 'benefit_desc' => $request->benefit_desc, + 'amount_incurred' => $request->amount_incurred, + 'amount_approved' => $request->amount_approved, + 'amount_not_approved' => $request->amount_not_approved, + 'excess_paid' => $request->excess_paid, + ]; + + $validator = Validator::make($request->all(), [ + 'benefit_desc' => 'required', + 'amount_incurred' => 'required|numeric', + 'amount_approved' => 'required|numeric', + 'amount_not_approved' => 'required|numeric', + 'excess_paid' => 'required|numeric', + ], $customMessages); + + if ($validator->fails()) { + return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); + } + + // Validasi berhasil, lanjutkan dengan pembaruan data + $claim = Claim::findOrFail($id); + $claim->fill([ + 'benefit_desc' => $request->benefit_desc, + 'amount_incurred' => $request->amount_incurred, + 'amount_approved' => $request->amount_approved, + 'amount_not_approved' => $request->amount_not_approved, + 'excess_paid' => $request->excess_paid, + ])->save(); + + return $claim; } /** @@ -170,12 +266,12 @@ class ClaimController extends Controller return $claim; } - + public function updateItems(Request $request, $id) { $request->validate([]); $claim = Claim::findOrFail($id); - + $order = 1; $data = []; $claim->items()->forceDelete(); @@ -201,7 +297,7 @@ class ClaimController extends Controller // Update total $claim->total_claim = $totalClaim; $claim->save(); - + return Helper::responseJson([], message: "Item Claim berhasil di update"); } @@ -215,7 +311,7 @@ class ClaimController extends Controller foreach ($request->primary as $diagnosisId) { $claim->diagnoses()->create([ 'claim_id' => $claim->id, - 'type' => 'primary', + 'type' => 'primary', 'diagnosis_id' => $diagnosisId, 'note' => '', 'description' => '', @@ -227,7 +323,7 @@ class ClaimController extends Controller foreach ($request->secondary as $diagnosisId) { $claim->diagnoses()->create([ 'claim_id' => $claim->id, - 'type' => 'secondary', + 'type' => 'secondary', 'diagnosis_id' => $diagnosisId, 'note' => '', 'description' => '', @@ -240,56 +336,179 @@ class ClaimController extends Controller public function decline($id) { - $claim = Claim::findOrFail($id); - $claim->status = 'declined'; - $claim->save(); + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $id) + ->select('claim_requests.id') + ->first(); + $id = $data_claim_requests->id; - return Helper::responseJson($claim, message: "Claim berhasil di decline"); + DB::table('claims') + ->where('claim_request_id', $id) + ->update( + [ + 'status' => 'declined' + ] + ); + + // Claim Log + DB::table('claim_logs') + ->insert([ + 'claim_request_id' => $id, + 'status' => 'declined', + 'date' => date('Y-m-d H:i:s'), + 'description' => "Claim Requested Declined", + 'system_origin' => 'prime-center', + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at'=> date('Y-m-d H:i:s'), + ]); + + return Helper::responseJson([], message: "Claim berhasil di decline"); } public function approve($id) { - $claim = Claim::findOrFail($id); - $claim->status = 'approved'; - $claim->save(); + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $id) + ->select('claim_requests.id') + ->first(); + $id = $data_claim_requests->id; - return Helper::responseJson($claim, message: "Claim berhasil di approve"); + DB::table('claims') + ->where('claim_request_id', $id) + ->update( + [ + 'status' => 'approved' + ] + ); + + // Claim Log + DB::table('claim_logs') + ->insert([ + 'claim_request_id' => $id, + 'status' => 'approved', + 'date' => date('Y-m-d H:i:s'), + 'description' => "Claim Requested Successfully Approved", + 'system_origin' => 'prime-center', + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at'=> date('Y-m-d H:i:s'), + ]); + + return Helper::responseJson([], message: "Claim berhasil di approve"); } public function reOpen($id) { - $claim = Claim::findOrFail($id); - $claim->status = 'received'; - $claim->save(); + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $id) + ->select('claim_requests.id') + ->first(); + $id = $data_claim_requests->id; - return Helper::responseJson($claim, message: "Claim berhasil di approve"); + DB::table('claims') + ->where('claim_request_id', $id) + ->update( + [ + 'status' => 'received' + ] + ); + + // Claim Log + DB::table('claim_logs') + ->where('claim_request_id', $id) + ->where(function ($query) { + $query->where('status', 'declined') + ->orWhere('status', 'approved'); + }) + ->delete(); + + return Helper::responseJson([], message: "Claim berhasil di re-open"); } public function downloadFinalLog($id) { - $claim = Claim::findOrFail($id); + //Claim + $claim = DB::table("claims") + ->where('claims.id', '=', $id) + ->select( + 'claims.code', + 'claims.created_at', + 'claims.member_id', + 'claims.plan_id', + ) + ->first(); - $hospital = $claim->finalEncounter->healthcare ?? null; + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $id) + ->select('claim_requests.id') + ->first(); + $id = $data_claim_requests->id; + + //Hospital + $hospital = $hospital = DB::table('claim_services') + ->leftJoin('corporate_hospitals', 'claim_services.hospital_id', '=', 'corporate_hospitals.id') + ->leftJoin('organizations','organizations.id', '=', 'corporate_hospitals.organization_id') + ->leftJoin('addresses', 'addresses.id', '=', 'organizations.main_address_id') + ->where('claim_services.claim_request_id', '=', $id) + ->select('corporate_hospitals.name', 'addresses.text AS address') + ->first(); + + //Memeber + $member = DB::table('members') + ->leftJoin('member_plans', 'member_plans.member_id', '=', 'members.id') + ->where('members.id', '=', $claim->member_id) + ->where('member_plans.plan_id', '=', $claim->plan_id) + ->select( + 'members.name', + DB::raw('(SELECT room_class_coverage FROM corporate_benefits WHERE corporate_benefits.plan_id = '.$claim->plan_id.' LIMIT 1) as room_class_coverage'), + 'members.birth_date', + 'members.gender', + 'members.payor_id', + DB::raw('(SELECT corporates.name FROM corporates INNER JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id WHERE corporate_employees.member_id = '.$claim->member_id.' LIMIT 1) AS corporate_name'), + DB::raw('(SELECT services.name FROM services INNER JOIN plans ON plans.service_code = services.code WHERE plans.id = '.$claim->plan_id.' LIMIT 1) AS services'), + DB::raw('(SELECT member_policies.end FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS periode_policy'), + DB::raw('(SELECT member_policies.status FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS status_policy'), + ) + ->first(); + + //Benfit Claim + $benefit = DB::table('claim_service_benefits') + ->leftJoin('benefits', 'benefits.id', '=', 'claim_service_benefits.benefit_id') + ->leftJoin('claim_services', 'claim_services.id', '=', 'claim_service_benefits.claim_service_id') + ->where('claim_services.claim_request_id', '=', $id) + ->select('benefits.description', 'claim_service_benefits.amount_incurred AS biaya_diajukan', 'claim_service_benefits.amount_approved AS biaya_disetujui', 'claim_service_benefits.amount_not_approved AS biaya_tidak_disetujui') + ->get(); // TODO Fix this tipu tipu - $inpationBenefit = $claim->member->currentPlan->benefits()->first(); - + //$inpationBenefit = $claim->member->currentPlan->benefits()->first(); + $pdf = PDF::loadView('pdf.final_log', [ 'claim' => $claim, - 'member' => $claim->member, - 'dateOfAdmission' => $claim->start, + 'member' => $member, + // 'dateOfAdmission' => $claim->start, 'hospital' => $hospital, - 'inpationBenefit' => $inpationBenefit + 'benefit' => $benefit, + //'inpationBenefit' => $inpationBenefit ]); - - return $pdf->download('Final LOG '.$claim->code.'.pdf'); + + return $pdf->download('Final LOG.pdf'); $view = view('pdf.final_log', [ 'claim' => $claim, - 'member' => $claim->member, - 'dateOfAdmission' => $claim->start, + 'member' => $member, + // 'dateOfAdmission' => $claim->start, 'hospital' => $hospital, - 'inpationBenefit' => $inpationBenefit + 'benefit' => $benefit, + // 'inpationBenefit' => $inpationBenefit ]); return $view; @@ -300,8 +519,8 @@ class ClaimController extends Controller // Membuat penulis entitas Spout $writer = WriterEntityFactory::createXLSXWriter(); // Membuka penulis untuk menulis ke file - $writer->openToFile(public_path('files/CorporatePlan&BenefitImportData.xlsx')); - + $writer->openToFile(public_path('files/Benefit Usage Report.xlsx')); + // Sheet 1 $writer->getCurrentSheet()->setName('Worksheet'); $headers_map_to_table_fields = Claim::$listing_doc_headers; @@ -317,10 +536,11 @@ class ClaimController extends Controller return $diagnosis->where('type', 'primary'); }, 'diagnoses.icd', - 'plan', + 'plan', 'benefit', 'claimRequest', - 'claimRequest.service' + 'claimRequest.service', + 'encounters', ]) // ->latest() ->get()->toArray(); @@ -328,7 +548,7 @@ class ClaimController extends Controller $rowData = [ '', // Count of Usage $row['code'], // Claim Number - '', // Insurar Code + $row['member']? $row['member']['payor_id'] : '-', // Insurar Code $row['member']['current_policy']? $row['member']['current_policy']['code'] : '', // Policy no $row['member']['current_corporate']? $row['member']['current_corporate']['name'] : '', // Corporate Name $row['member']['current_plan']? $row['member']['current_plan']['code'] : '', // Plan Code @@ -339,7 +559,7 @@ class ClaimController extends Controller $row['member']['current_corporate']? $row['member']['current_corporate']['code'] : '', // Institution Code '', // Invoice Line Number $row['status'], // Claim Status - '', // Admission Date + $row['claim_request']? $row['claim_request']['submission_date'] : '-', // Admission Date '', // Discharge Date '', // Date Of Service '', // Place Of Service @@ -354,7 +574,7 @@ class ClaimController extends Controller $row['claim_request'] ? $row['claim_request']['service']['description'] : '', // ServiceDescription '', // UnitPrice '', // Quantity - '', // Tarif + $row['member']['current_policy']['latest_limit_journal'] ? abs($row['member']['current_policy']['latest_limit_journal']['total_credit']): '', // Tarif '', // Claimable amount '', // Paid by customer '', // HD Disc @@ -369,7 +589,7 @@ class ClaimController extends Controller '', // Claimable Status $row['claim_request'] ? $row['claim_request']['service']['description'] : '', // ServiceDescription, // Benefit Code ]; - + // dd($rowData); $row = WriterEntityFactory::createRowFromArray($rowData); $writer->addRow($row); } @@ -437,14 +657,521 @@ class ClaimController extends Controller // ]; // $row = WriterEntityFactory::createRowFromArray($rowData); // $writer->addRow($row); - + // } $writer->close(); return Helper::responseJson([ 'file_name' => "Data Claim Report " . date('Y-m-d h:i:s'), - "file_url" => url('files/CorporatePlan&BenefitImportData.xlsx') + "file_url" => url('files/Benefit Usage Report.xlsx') ]); } + + public function getDetailClaims($claim_id) + { + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $claim_id) + ->select('claim_requests.id') + ->first(); + $claim_id = $data_claim_requests->id; + + $customer_data = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id') + ->where('claim_requests.id', '=', $claim_id) + ->select( + 'claim_requests.code', + 'claim_requests.submission_date', + 'claims.status', + 'members.name', + 'members.payor_id', + 'members.member_id', + 'claim_requests.payment_type', + 'corporates.name AS coporate_name', + ) + ->first(); + $results['customer_data'] = $customer_data; + + $documents = DB::table('files') + ->where('fileable_type', 'App\Models\ClaimRequest') + ->where('fileable_id', $claim_id) + ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') + ->orderBy('id', 'desc') + ->get(); + $results['documents'] = $documents; + + $request_documents = DB::table('claim_request_files') + ->where('claim_request_id', $claim_id) + ->get(); + $results['request_documents'] = $request_documents; + + $claim_services = DB::table('claim_services') + ->where('claim_services.claim_request_id', $claim_id) + ->select( + 'claim_services.id', + 'claim_services.addmission_date', + 'claim_services.discharge_date', + 'claim_services.service_id', + DB::raw('(SELECT services.name FROM services WHERE id = claim_services.service_id LIMIT 1) AS name_services'), + 'claim_services.hospital_id', + DB::raw('(SELECT corporate_hospitals.name FROM corporate_hospitals WHERE id = claim_services.hospital_id LIMIT 1) AS name_hospitals'), + ) + ->groupBy('claim_services.id') + ->first(); + $results['claim_services'] = $claim_services; + + if($claim_services && $claim_services->id) + { + $claim_service_benefits = DB::table('claim_service_benefits') + ->where('claim_service_id', $claim_services->id) + ->select( + 'claim_service_benefits.claim_service_id', + 'claim_service_benefits.benefit_id', + DB::raw('(SELECT benefits.description FROM benefits WHERE id = claim_service_benefits.benefit_id LIMIT 1) AS name_benefits') + ) + ->get(); + foreach ($claim_service_benefits as $item) { + $claimServiceId = $item->claim_service_id; + $nameBenefits = $item->name_benefits; + $benefitId = $item->benefit_id.""; + if (!isset($output[$claimServiceId])) { + $output[$claimServiceId] = (object)[ + "claim_service_id" => $claimServiceId, + "name_benefits" => $nameBenefits, + "benefit_id" => [$benefitId], + ]; + } else { + $output[$claimServiceId]->name_benefits .= ", " . $nameBenefits; + $output[$claimServiceId]->benefit_id[] = $benefitId.""; + } + } + $output = array_values($output); + + $results['claim_service_benefits'] = $output[0]; + } + else + { + $results['claim_service_benefits'] = null; + } + + $dialog_submits = DB::table('claim_requests') + ->leftJoin('members', 'claim_requests.member_id','=', 'members.id') + ->where('claim_requests.id', $claim_id) + ->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status') + ->first(); + $results['dialog_submits'] = $dialog_submits; + + + return Helper::responseJson($results); + } + + public function getServices($claim_id) + { + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $claim_id) + ->select('claim_requests.id', 'claim_requests.member_id') + ->first(); + $claim_id = $data_claim_requests->id; + + //Corporate_id + $corporate_id = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id') + ->where('claim_requests.id', '=', $claim_id) + ->select('corporates.id') + ->first(); + + //Service Type + $service_type = DB::table('claim_requests') + ->leftJoin('services','claim_requests.service_code', 'services.code') + ->where('claim_requests.id', $claim_id) + ->select('services.name', 'services.code', 'services.id') + ->get(); + $results['service_type'] = $service_type; + + //Member Plans + $plan_id = DB::table('claims') + ->where('claims.claim_request_id', $claim_id) + ->select('claims.plan_id') + ->first(); + + //Benefit Name + $benefit_name = DB::table('member_plans') + ->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id') + ->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id') + ->where('member_plans.member_id', '=', $data_claim_requests->member_id) + ->where('member_plans.plan_id', '=', $plan_id->plan_id) + ->select('benefits.code', 'benefits.description', 'benefits.id') + ->get(); + $results['benefit_name'] = $benefit_name; + + //Hospital + $hospital = DB::table('corporate_hospitals') + ->where('corporate_hospitals.corporate_id', $corporate_id->id) + ->where('corporate_hospitals.active', 1) + ->select('corporate_hospitals.code', 'corporate_hospitals.name', 'corporate_hospitals.id') + ->get(); + $results['hospital'] = $hospital; + + return Helper::responseJson($results); + } + + public function saveServices(Request $request) + { + $request->validate([ + 'claim_request_id' => 'required', + 'dateAdd' => 'required', + 'dateDisc' => 'required', + 'serviceType' => 'required', + 'hospital' => 'required', + 'benefitName' => 'required', + ]); + + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $request->claim_request_id) + ->select('claim_requests.id') + ->first(); + $claim_id = $data_claim_requests->id; + + + if($request->flagAddService === 'add') + { + $data = [ + 'claim_request_id' => $claim_id, + 'service_id' => $request->serviceType, + 'hospital_id' => $request->hospital, + 'addmission_date' => $request->dateAdd, + 'discharge_date' => $request->dateDisc, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => null, + ]; + $id = DB::table('claim_services') + ->insertGetId($data); + foreach ($request->benefitName as $value) + { + DB::table('claim_service_benefits') + ->insert([ + 'claim_service_id' => $id, + 'benefit_id' => $value, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]); + } + } + else if($request->flagAddService === 'edit') + { + $data = [ + 'claim_request_id' => $claim_id, + 'service_id' => $request->serviceType, + 'hospital_id' => $request->hospital, + 'addmission_date' => $request->dateAdd, + 'discharge_date' => $request->dateDisc, + 'created_by' =>auth()->user()->id, + 'created_at' => null, + 'updated_at' => date('Y-m-d H:i:s'), + ]; + DB::table('claim_services') + ->where('claim_services.id', $request->idService) + ->update($data); + + DB::table('claim_service_benefits') + ->where('claim_service_id', $request->idService) + ->delete(); + + foreach ($request->benefitName as $value) + { + DB::table('claim_service_benefits') + ->insert([ + 'claim_service_id' => $request->idService, + 'benefit_id' => $value, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]); + } + } + + return Helper::responseJson([]); + } + + public function requestDocuments(Request $request) + { + $request->validate([ + 'claim_id' => 'required', + 'note' => 'required', + ]); + + //Get claim request id + $data_claim_requests = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->where('claims.id', $request->claim_id) + ->select('claim_requests.id') + ->first(); + + $claim_id = $data_claim_requests->id; + + $condition = $request->input('condition'); + $diagnosis = $request->input('diagnosis'); + $result = $request->input('result'); + $note = $request->input('note'); + + $dataToInsert = []; + $description = ""; + if ($condition) { + $dataToInsert[] = [ + 'claim_request_id' => $claim_id, + 'date' => date('Y-m-d H:i:s'), + 'type' => 'claim-kondisi', + 'description' => $note, + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + $description = "Condition"; + $this->sendNotif($description); + } + if ($diagnosis) { + $dataToInsert[] = [ + 'claim_request_id' => $claim_id, + 'date' => date('Y-m-d H:i:s'), + 'type' => 'claim-diagnosis', + 'description' => $note, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + $description = "Diagnosis"; + $this->sendNotif($description); + } + if ($result) { + $dataToInsert[] = [ + 'claim_request_id' => $claim_id, + 'date' => date('Y-m-d H:i:s'), + 'type' => 'claim-result', + 'description' => $note, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + $description = "Result"; + $this->sendNotif($description); + } + DB::table('claim_request_files')->insert($dataToInsert); + + return Helper::responseJson([]); + } + + public function sendNotif($description) + { + // Insert data notifications + $dataNotif = [ + 'hospital_id' => 1, + 'title' => 'Request Document', + 'description' => 'Please enter the document '.$description, + 'type' => 1, + 'isUnRead' => true, + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + $sendNotif = Helper::insertNotification($dataNotif); + // Send Email after insert notifications + if($sendNotif) + { + //Beluma ada Data Users + $dataEmail = [ + 'email' => 'akun.kerja.ivan@gmail.com', + 'name' => 'Ivan Julian', + 'subject' => 'Enter Document '.$description, + 'body' => View::make('email/notif_email', ['name' => 'Ivan Julian', 'link' => 'https://linkmedis.com/chat'])->render(), + ]; + Helper::sendEmail($dataEmail); + } + } + + //////////////////// History Care Hospital /////////////////////////// + + public function storeHistoryCare(Request $request, $id){ + $request->validate([ + 'service_code' => 'required', + 'admission_date' => 'required', + 'discharge_date' => 'required', + 'organization_id' => 'required', + 'practitioner_id' => 'required', + 'medical_record_number' => 'required', + 'symptoms' => 'required', + 'sign' => 'required', + 'main_diagnosis_id' => 'required', + ]); + + $data = [ + 'service_code' => $request->service_code, + 'admission_date' => $request->admission_date, + 'discharge_date' => $request->discharge_date, + 'organization_id' => $request->organization_id, + 'practitioner_id' => $request->practitioner_id, + 'medical_record_number' => $request->medical_record_number, + 'symptoms' => $request->symptoms, + 'sign' => $request->sign, + 'claim_id' => $id, + 'main_diagnosis_id' => $request->main_diagnosis_id, + 'status' => 0, + ]; + + $claimHistoryCare = ClaimHistoryCare::create($data); + if (count($request->secondary_diagnosis_id)) { + foreach($request->secondary_diagnosis_id as $value){ + $dataSecondary = [ + 'claim_history_care_id' => $claimHistoryCare->id, + 'icd_id' => intval($value) + ]; + DiagnosisSecondaryClaimHistoryCare::create($dataSecondary); + } + } + + return Helper::responseJson($claimHistoryCare); + } + + public function updateHistoryCare(Request $request, $id){ + $data = $request->validate([ + 'service_code' => 'required', + 'admision_date' => 'required', + 'discharge_date' => 'required', + 'organization_id' => 'required', + 'practitioner_id' => 'required', + 'medical_record_number' => 'required', + 'symptoms' => 'required', + 'sign' => 'required', + 'main_diagnosis_id' => 'required', + ]); + + // $data['status'] = 0; + + $claimHistoryCare = ClaimHistoryCare::findOrFail($id); + $claimHistoryCare->update($data); + + // Hapus diagnosis sekunder yang terkait + DiagnosisSecondaryClaimHistoryCare::where('claim_history_care_id', $id)->delete(); + + if (count($request->secondary_diagnosis_id)) { + foreach ($request->secondary_diagnosis_id as $value) { + $dataSecondary = [ + 'claim_history_care_id' => $claimHistoryCare->id, + 'icd_id' => intval($value), + ]; + DiagnosisSecondaryClaimHistoryCare::create($dataSecondary); + } + } + + return Helper::responseJson(message: 'Data Berhasil di update'); + + } + + public function showHistoryCare($id){ + $data = ClaimHistoryCare::with(['organization', 'practitioner', 'practitioner.person', 'icd'])->find($id); + + return Helper::responseJson(ClaimHistoryCareResource::make($data)); + } + + public function approvalHistoryCare(Request $request){ + $request->validate([ + 'claim_id' => 'required' + ]); + + $claimHistoryCare = ClaimHistoryCare::findOrFail($request->claim_id); + $claimHistoryCare->status = $request->status; + $claimHistoryCare->save(); + + return Helper::responseJson(message: 'Data Berhasil di update'); + } + + /** + * Get Benefit Configuration + * + * Bagaskoro, BSD 03 November 2023 + */ + public function getBenefitConfiguration(Request $request, $claim_id) { + + $benefit_list = DB::table('claims') + ->leftJoin('claim_services', 'claims.claim_request_id', '=', 'claim_services.claim_request_id') + ->leftJoin('claim_service_benefits', 'claim_services.id', '=', 'claim_service_benefits.claim_service_id') + ->leftJoin('benefits', 'claim_service_benefits.benefit_id', '=', 'benefits.id') + ->select("claim_service_benefits.id AS claim_service_benefits_id", "benefits.description AS benefit_name", "claim_service_benefits.amount_incurred", "claim_service_benefits.amount_approved", "claim_service_benefits.amount_not_approved", "claim_service_benefits.excess_paid") + ->where("claims.id", "=", $claim_id) + ->get(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'benefit_list' => $benefit_list, + ] + ],200); + } + + /** + * Edit Benefit Configuration + * + * Bagaskoro, BSD 03 November 2023 + */ + public function editBenefitConfiguration(Request $request, $claim_service_benefits_id) { + $request->merge(['claim_service_benefits_id' => $claim_service_benefits_id]); + + // validation rule + $validator = Validator::make($request->all(),[ + 'claim_service_benefits_id' => 'required|exists:claim_service_benefits,id', + 'amount_incurred' => 'required|numeric', + 'amount_approved' => 'required|numeric', + 'amount_not_approved' => 'required|numeric', + 'excess_paid' => 'required|numeric', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'message' => $validator->getMessageBag() + ],400); + } + + try { + DB::table('claim_service_benefits')->where('id', $claim_service_benefits_id)->update([ + 'amount_incurred' => $request->amount_incurred, + 'amount_approved' => $request->amount_approved, + 'amount_not_approved' => $request->amount_not_approved, + 'excess_paid' => $request->excess_paid, + ]); + } + catch (\Throwable $th) { + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + + return Helper::responseJson(status: 'success', statusCode: 200, message: "data berhasil disimpan !"); + } + + protected function messages() + { + return [ + 'required' => ':attribute harus diisi', + 'integer' => ':attribute harus angka', + 'unique' => ':attribute (:input) sudah ada', + 'max' => ':attribute maximal :max karakter', + 'exists' => ':attribute (:input) tidak ditemukan', + 'numeric' => ':attribute harus angka', + 'digits_between'=> ':attribute maximal :max digit minimal :min digit' + ]; + } } diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 5f8f7812..20376706 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -4,17 +4,29 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\ClaimRequest; +use App\Models\Organization; use App\Services\ClaimService; +use App\Services\ImportService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Modules\Internal\Transformers\ClaimRequestResource; use Modules\Internal\Transformers\ClaimRequestShowResource; +use Illuminate\Support\Facades\Storage; +use App\Services\ClaimRequestService; +use App\Exceptions\ImportRowException; +use App\Events\ClaimRequested; + + use App\Models\File; use App\Models\FilesMcu; +use Illuminate\Support\Facades\DB; +use App\Models\Member; class ClaimRequestController extends Controller { + private static $code_prefix = 'CRQ-C'; + /** * Display a listing of the resource. * @return Renderable @@ -24,6 +36,9 @@ class ClaimRequestController extends Controller $claimRequests = ClaimRequest::query() ->when($request->search, function ($q, $search) { $q->where('code', 'LIKE', "%".$search."%"); + $q->orWhereHas('member', function ($subQuery) use ($search) { + $subQuery->where('name', 'LIKE', "%".$search.""); + }); }) ->when($request->orderBy, function ($q, $orderBy) use ($request) { if (in_array($orderBy, ['submission_date', 'code'])) { @@ -36,7 +51,7 @@ class ClaimRequestController extends Controller ->when($request->status, function($q, $status) { $q->where('status', $status); }) - ->with(['member', 'files', 'service']) + ->with(['member', 'files', 'service', 'member.currentPolicy']) ->paginate(); return Helper::paginateResources(ClaimRequestResource::collection($claimRequests)); @@ -52,13 +67,150 @@ class ClaimRequestController extends Controller } /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable + * Create New Calim Request + * + * Bagaskoro, BSD 03 November 2023 */ - public function store(Request $request) + public function createNew(Request $request) { - // + $request->validate([ + 'member_id' => 'required|array', + 'member_id.*' => 'required', + 'service_code.*' => 'required|in:OP,IP' + ]); + + if ($request->member_id){ + foreach($request->member_id as $key => $member_id){ + + $code = $this->getNextCode(); + $member = Member::find($member_id); + + DB::beginTransaction(); + + try { + $newClaimRequest = ClaimRequestService::storeClaimRequest( + row: [], + code: $code, + member: $member, + paymentType: 'reimbursement', + serviceCode: $request->service_code[$key], + ); + + ClaimRequested::dispatch($newClaimRequest); + + // Log History + $newClaimRequest->histories()->create([ + 'title' => 'New Claim Requested', + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'type' => 'info', + 'system_origin' => 'client-portal' + ]); + + // Claim Log + DB::table('claim_logs') ->insert([ + 'claim_request_id' => $newClaimRequest->id, + 'status' => 'requested', + 'date' => date('Y-m-d H:i:s'), + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'system_origin' => 'hospital-portal', + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at'=> date('Y-m-d H:i:s'), + ]); + + $storage_path = storage_path() . "/app/public"; + $folder = "claim/"; + + if (is_dir($storage_path . "/" . $folder) == false) { + mkdir($storage_path . "/" . $folder, 0770, true); + } + + if (isset($_FILES['file_penunjang'])) { + foreach ($_FILES['file_penunjang']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $new_file_name = "claim-result-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['file_penunjang']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['file_penunjang']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['file_penunjang']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-result', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + } + } + + if (isset($_FILES['file_diagnosa'])) { + foreach ($_FILES['file_diagnosa']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $new_file_name = "claim-diagnosis-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['file_diagnosa']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['file_diagnosa']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['file_diagnosa']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-diagnosis', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + } + } + + if (isset($_FILES['file_kondisi'])) { + foreach ($_FILES['file_kondisi']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $new_file_name = "claim-kondisi-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['file_kondisi']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['file_kondisi']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['file_kondisi']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-kondisi', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + } + } + + DB::commit(); + } + catch (\Throwable $th) { + DB::rollBack(); + + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + } + } + + return Helper::responseJson(status: 'success', statusCode: 201, message: 'Claim Request berhasil ajukan!', data: $request->toArray()); } /** @@ -73,7 +225,10 @@ class ClaimRequestController extends Controller 'histories' => function ($history) { $history->latest(); }, - 'files' + 'files', + 'member', + 'claim', + 'organization', ]); return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest)); @@ -97,7 +252,83 @@ class ClaimRequestController extends Controller */ public function update(Request $request, $id) { - // + $claimRequest = ClaimRequest::findOrFail($id); + $claimRequest->load([ + 'histories' => function ($history) { + $history->latest(); + }, + 'files', + 'member', + 'claim', + 'organization', + ]); + $organization = Organization::where('code', $request->provider_code)->first(); + if (!$organization) { + return response()->json(['error' => true, 'message' => 'Data tidak ditemukan'], 404); + } + + $updateClaimRequest = ClaimRequestService::updateClaimRequest(organization_id: $organization->id, claim_request_id: $id); + + ClaimRequested::dispatch($updateClaimRequest); + // Log History + $updateClaimRequest->histories()->create([ + 'title' => 'Update Claim Requested', + 'description' => "Update Claim Requested for Member : {$claimRequest->member->member_id} - ({$claimRequest->member->full_name})", + 'type' => 'update', + 'system_origin' => 'prime-center' + ]); + + if ($request->hasFile('result_files')) { + foreach ($request->result_files as $file) { + $pathFile = File::storeFile('claim-result', $id, $file); + $updateClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-result', + 'name' => File::getFileName('claim-result', $id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('diagnosa_files')) { + foreach ($request->diagnosa_files as $file) { + $pathFile = File::storeFile('claim-diagnosis', $id, $file); + $updateClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-diagnosis', + 'name' => File::getFileName('claim-diagnosis', $id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('kondisi_files')) { + foreach ($request->kondisi_files as $file) { + $pathFile = File::storeFile('claim-kondisi', $id, $file); + $updateClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-kondisi', + 'name' => File::getFileName('claim-kondisi', $id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + return response()->json([ + 'error' => false, + 'message' => 'Update succses', + 'data' => $updateClaimRequest], + 200); + } /** @@ -114,17 +345,17 @@ class ClaimRequestController extends Controller { $claimRequest = ClaimRequest::findOrFail($id); $member = $claimRequest->member; - + try { // Create New Claim $newClaim = ClaimService::storeClaim(member: $member, status: 'received', claimRequest: $claimRequest); - + // Update Claim Request Status & Link with Claim $claimRequest->status = 'approved'; $claimRequest->claim_id = $newClaim->id; $claimRequest->save(); - + // Store Generated Documents LOG $logContent = view('pdf.guaranted_leter', compact('member', 'claimRequest')); $claimRequest->generatedDocuments()->create([ @@ -135,8 +366,21 @@ class ClaimRequestController extends Controller 'system_origin' => 'primecenter' ]); - } catch (\Exception $e) { + // Claim Log + DB::table('claim_logs') + ->insert([ + 'claim_request_id' => $id, + 'status' => 'reviewed', + 'date' => date('Y-m-d H:i:s'), + 'description' => "Claim Requested Successfully Reviewed", + 'system_origin' => 'prime-center', + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at'=> date('Y-m-d H:i:s'), + ]); + } catch (\Exception $e) { + return $e->getMessage(); } return $claimRequest; @@ -164,7 +408,366 @@ class ClaimRequestController extends Controller { return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file member yang ditambahkan'); } - + } + public function importClaim(Request $request) + { + + $request->validate([ + 'file' => 'required|file|mimes:xls,xlsx,csv,txt', + ]); + $file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName(); + $file = $request->file('file')->storeAs('temp', $file_name); + $fileWrite = Storage::disk('public')->path('temp/result-' . $file_name); + $fileRead = Storage::path('temp/' . $file_name); + $import = new ImportService(); + $import->read($fileRead); + $import->write($fileWrite, 'xsls'); + foreach ($import->sheetsIterator() as $sheetIndex => $sheet) { + if ($sheetIndex == 1) { // Rename First Sheet to Writer + $firstWriterSheet = $import->writer->getCurrentSheet(); + $firstWriterSheet->setName($sheet->getName()); + } else { // Add New Sheet to Writer + $nextWriterSheet = $import->writer->addNewSheetAndMakeItCurrent(); + $nextWriterSheet->setName($sheet->getName()); + } + + $headers_map_to_table_fields = ClaimRequest::$doc_headers_to_field_map; + + // Write Header to File + $result_headers = array_keys($headers_map_to_table_fields); + $result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']); + + $import->addArrayToRow($result_headers); + $doc_headers_indexes = []; + foreach ($sheet->getRowIterator() as $index => $row) { + if ($index == 1) { // First Row Must be Header + foreach ($row->getCells() as $index => $cell) { + $title = $cell->getValue(); + $title = preg_replace("/\r|\n/", " ", $title); + $title = preg_replace('/\xc2\xa0/', " ", $title); + $title = rtrim($title); + $title = ltrim($title); + $doc_headers_indexes[$index] = $title; + } + // TODO Validate if First Row not Header + } else { // Next Row Should be Data + $row_data = []; + foreach ($row->getCells() as $header_index => $cell) { + if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]])) + $row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue(); + } + try { // Process the Row Data + $claimRequestService = new ClaimRequestService(); + + $claimRequestService->handleClaimRequestRow($row_data); + + // Write Success Result to File + // $import->read($fileRead); + // $import->write($fileWrite, 'xsls'); + $result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']); + + $import->addArrayToRow($result_headers, $sheet->getName()); + + } catch (ImportRowException $e) { + // Write Data Validation Error to File + // $import->read($fileRead); + // $import->write($fileWrite, 'xsls'); + + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => $e->getCode(), + 'Ingest Note' => $e->getMessage(), + ]), $sheet->getName()); + } + // catch (\Exception $e) { + // // throw new \Exception($e); + // // Write Server Error to File + // // $import->read($fileRead); + // // $import->write($fileWrite, 'xsls'); + // dd( $e->getMessage()); + // $import->addArrayToRow(array_merge($row_data, [ + // 'Ingest Code' => 500, + // 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error', + // ]), $sheet->getName()); + // } + } + } + } + $import->reader->close(); + Storage::delete('temp/' . $file_name); + $import->writer->close(); + + return [ + // 'total_successed_row' => $imported_plan_data, + // 'total_failed_row' => count($failed_plan_data), + // 'failed_row' => $failed_plan_data, + 'result_file' => [ + 'url' => Storage::disk('public')->url('temp/result-' . $file_name), + 'name' => 'result-' . $file_name, + ] + ]; + } + + public function claimRequestDetail($claimRequestId) + { + $status = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->where('claim_requests.id', '=', $claimRequestId) + ->select( + 'claim_requests.submission_date', + 'claim_requests.code', + DB::raw(' + CASE + WHEN claim_requests.status = "requested" THEN "requested" + WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" + ELSE "" + END AS status + ') + ) + ->first(); + $results['status'] = $status; + $timeline = DB::table('claim_logs') + ->where('claim_logs.claim_request_id', '=', $claimRequestId) + ->select( + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "Request" + WHEN claim_logs.status = "reviewed" THEN "Review" + WHEN claim_logs.status = "approved" THEN "Approval" + WHEN claim_logs.status = "declined" THEN "Decline" + ELSE "-" + END AS txt_status + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#159C9C" + WHEN claim_logs.status = "reviewed" THEN "#0C53B7" + WHEN claim_logs.status = "approved" THEN "#229A16" + WHEN claim_logs.status = "declined" THEN "#FF4842" + ELSE "-" + END AS txt_status_color + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#00AB5529" + WHEN claim_logs.status = "reviewed" THEN "#1890FF29" + WHEN claim_logs.status = "approved" THEN "#54D62C29" + WHEN claim_logs.status = "declined" THEN "#FF48427A" + ELSE "-" + END AS txt_status_backgroundColor + '), + 'claim_logs.date', + 'claim_logs.description', + 'claim_logs.status' + ) + ->orderBy('claim_logs.id', 'desc') + ->get(); + $results['timeline'] = $timeline; + $request_files = DB::table('claim_request_files') + ->where('claim_request_files.claim_request_id', '=', $claimRequestId) + ->select( + 'claim_request_files.*', + DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), + ) + ->get(); + $results['request_files'] = $request_files; + $documents = DB::table('files') + ->where('fileable_type', 'App\Models\ClaimRequest') + ->where('fileable_id', $claimRequestId) + ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') + ->orderBy('id', 'desc') + ->get(); + $results['documents'] = $documents; + $dialog_submits = DB::table('claim_requests') + ->leftJoin('members', 'claim_requests.member_id','=', 'members.id') + ->where('claim_requests.id', $claimRequestId) + ->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status') + ->first(); + $results['dialog_submits'] = $dialog_submits; + + return Helper::responseJson($results); + } + + public function invoiceFiles(Request $request, $claim_id) + { + if ($request->hasFile('invoice_files')) { + foreach ($request->invoice_files as $file) { + $pathFile = File::storeFile('claim-invoice', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-invoice', + 'name' => File::getFileName('claim-invoice', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + if($request->date) + { + DB::table('claim_requests') + ->where('id', $claim_id) + ->update(['invoice_date' => $request->date]); + + } + return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); + } + + /** + * Get Claim Member - Infinite Scroll + * + * Bagaskoro, BSD 31 Oktober 2023 + */ + public function getClaimMemberInfiniteScroll(Request $request) + { + $offset = 0; + $limit = 10; + $page = $request->get('page'); + $keyword = $request->get('keyword'); + + if ($page > 1) { + $offset = ($page*$limit)-$limit; + } + + $memberList = DB::table('members') + ->select('id','member_id','name') + ->where("name", "like", "%$keyword%") + ->orWhere("member_id", "like", "%$keyword%") + ->orderBy('created_at', 'asc') + ->offset($offset) + ->limit($limit) + ->get(); + + $data = []; + if(count($memberList)>0){ + $temp = []; + foreach($memberList as $d){ + $serviceType = $this->getServiceMember($d->id); + $temp['id'] = $d->id; + $temp['member_id'] = $d->member_id; + $temp['name'] = $d->name; + $temp['service_type'] = $serviceType; + + + array_push($data, $temp); + } + + } + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'member_list'=> $data, + ] + ],200); + } + + public function getServiceMember($id){ + $service = DB::table('member_plans') + ->select('plans.service_code as code', 'services.name') + ->join('plans', 'member_plans.plan_id', '=', 'plans.id') + ->join('services', 'plans.service_code', '=', 'services.code') + ->where('member_id', $id) + ->get() + ->toArray(); + return $service; + } + + public static function getNextCode() + { + // $last_number = ClaimRequest::max('code'); + // $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1); + // return self::makeCode($next_number); + + $last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, "-", -1) AS SIGNED)) as max_numeric_code')) + ->whereRaw('SUBSTRING_INDEX(code, "-", -1) REGEXP "^[0-9]+$"') + ->value('max_numeric_code'); + // $next_number = 1; + if ($last_numeric_code) { + // // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir + // $parts = explode('-', $last_code); + // $last_number = (int) end($parts); + $next_number = $last_numeric_code + 1; + } + + return self::makeCode($next_number); + } + + + public static function makeCode($next_number) + { + // Pastikan $next_number adalah integer positif + $next_number = max(1, (int) $next_number); + + // Menghasilkan kode dengan format yang diinginkan + return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT); + } + + public function requestFiles(Request $request, $claim_id) + { + + if ($request->hasFile('fileDiagnosis')) { + foreach ($request->fileDiagnosis as $file) { + $pathFile = File::storeFile('claim-diagnosis', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-diagnosis', + 'name' => File::getFileName('claim-diagnosis', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileKondisis')) { + foreach ($request->fileKondisis as $file) { + $pathFile = File::storeFile('claim-kondisi', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-kondisi', + 'name' => File::getFileName('claim-kondisi', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileResults')) { + foreach ($request->fileResults as $file) { + $pathFile = File::storeFile('claim-result', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\ClaimRequest', + 'fileable_id' => $claim_id, + 'type' => 'claim-result', + 'name' => File::getFileName('claim-result', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); + } } diff --git a/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php b/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php index 3648c21f..229c03d2 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateBenefitController.php @@ -20,10 +20,12 @@ class CorporateBenefitController extends Controller $benefits = CorporateBenefit::query() ->filter($request->all()) ->where('corporate_id', $corporate_id) - ->paginate(0) + ->with('benefit', 'plan') + ->paginate(10) ->appends($request->all()); return $benefits; } + public function activation(Request $request, $benefit_id) { $request->validate([ @@ -31,9 +33,8 @@ class CorporateBenefitController extends Controller ]); // abort(404); - - $benefit = CorporateBenefit::findOrFail($benefit_id); - $benefit->active = $request->active == '1'; + $benefit = CorporateBenefit::find($benefit_id); + $benefit->active = $request->active == 1 ? 0 : 1; $benefit->reason = $request->reason; if ($benefit->save()) { @@ -108,18 +109,15 @@ class CorporateBenefitController extends Controller { $corporateBenefit = CorporateBenefit::findOrFail($id); + $request->validate([ - 'code' => [ + 'budget' => [ 'required', - Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporateBenefit->id) ], - 'name' => 'required' ]); $corporateBenefit->fill([ - 'code' => $request->code, - 'name' => $request->name, - 'active' => $request->active, + 'budget' => $request->budget, ])->save(); return $corporateBenefit; diff --git a/Modules/Internal/Http/Controllers/Api/CorporateController.php b/Modules/Internal/Http/Controllers/Api/CorporateController.php index 9b8bf00d..a8fc5dbd 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateController.php @@ -25,6 +25,7 @@ use Illuminate\Support\Facades\File as FacadesFile; use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Storage; use Modules\Internal\Services\CorporateService; +use App\Models\FilesDoc; class CorporateController extends Controller { @@ -120,9 +121,9 @@ class CorporateController extends Controller $services = [ [ 'id' => 1, - 'name' => 'Out Patient', + 'name' => 'Outpatient', 'code' => 'OP', - 'description' => 'Out Patient', + 'description' => 'Outpatient', ], [ 'id' => 2, @@ -380,13 +381,15 @@ class CorporateController extends Controller public function activation(Request $request, $corporate_id) { $request->validate([ - 'active' => 'required' + 'active' => 'required', + 'reason' => 'required' ]); // abort(404); $corporate = Corporate::findOrFail($corporate_id); - $corporate->active = $request->active == '1'; + $corporate->active = $request->active == 0 ? 1 : 0; + $corporate->reason = $request->reason; if ($corporate->save()) { return response()->json([ @@ -504,6 +507,17 @@ class CorporateController extends Controller ]; } + public function deleteAllImportPlanBenefit(Request $request, $corporate_id){ + $deleteBenefit = CorporateBenefit::where('corporate_id', $corporate_id)->delete(); + $deletePlan = Plan::where('corporate_id', $corporate_id)->delete(); + if ( $deleteBenefit && $deletePlan ){ + return Helper::responseJson(data: [], message: 'Berhasil delete semua benefit'); + } else { + return Helper::responseJson(data: [], message: 'Gagal delete semua benefit', statusCode:404); + } + + } + public function importDocumentExample($document_type) { switch ($document_type) { @@ -524,7 +538,37 @@ class CorporateController extends Controller 'file_name' => "Corporate Exclusion Import.xlsx", "file_url" => url('files/Corporate Exclusion Import.xlsx') ]); - break; + break; + case 'master-icd': + return Helper::responseJson([ + 'file_name' => "Template - ICD.xlsx", + "file_url" => url('files/Template - ICD.xlsx') + ]); + break; + case 'master-formularium': + return Helper::responseJson([ + 'file_name' => "Template - Formularium.xlsx", + "file_url" => url('files/Template - Formularium.xlsx') + ]); + break; + case 'master-formularium-corporate': + return Helper::responseJson([ + 'file_name' => "Template - Formularium.xlsx", + "file_url" => url('files/Template - Formularium - Corporate.xlsx') + ]); + break; + case 'claim-request': + return Helper::responseJson([ + 'file_name' => "Template Format Claim.xlsx", + "file_url" => url('files/Template Format Claim.xlsx') + ]); + break; + case 'request-log': + return Helper::responseJson([ + 'file_name' => "Template Update Status Request LOG.xlsx", + "file_url" => url('files/Template Update Status Request LOG.xlsx') + ]); + break; default: return Helper::responseJson([], 'error', 404); break; @@ -717,5 +761,69 @@ class CorporateController extends Controller return $corporates; } + + public function addFilesDoc(Request $request) + { + $request->validate([ + 'corporate_id' => 'required' + ]); + if ($request->hasFile('result_files')) { + $pathFile = File::storeFile('docs', $request->corporate_id, $request->result_files); + $data = [ + 'corporate_id' => $request->corporate_id, + 'original_name' => $request->result_files->getClientOriginalName(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id + ]; + FilesDoc::create($data); + return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file '.$data['original_name']); + } + else + { + return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file yang ditambahkan'); + } + + } + + public function getFilesDoc(Request $request) + { + $request->validate([ + 'corporate_id' => 'required' + ]); + $datas = FilesDoc::where('corporate_id', $request->corporate_id) + ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'status_download') + ->orderBy('id', 'desc') + //->limit(1) + ->get(); + if ($datas->isEmpty()) { + return Helper::responseJson(data: [], message: 'Tidak ada data'); + } + return Helper::responseJson(data: $datas, message: 'Berhasil mendapatkan data'); + } + + public function updateStatusFilesDoc(Request $request) + { + $request->validate([ + 'status_download' => 'required', + 'corporate_id' => 'required' + ]); + + $data_requests = [ + 'status_download' => $request->status_download + ]; + + FilesDoc::where('corporate_id', $request->corporate_id) + ->update($data_requests); + + $datas = FilesDoc::where('corporate_id', $request->corporate_id) + ->select('status_download') + ->orderBy('id', 'desc') + ->limit(1) + ->get(); + + return Helper::responseJson(data: $datas, message: 'Berhasil update status download menjadi '.($request->status_download == 0 ? 'Inactive' : 'Active')); + + } } diff --git a/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php b/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php index 4f2c87af..1056978b 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateFormulariumController.php @@ -2,13 +2,25 @@ namespace Modules\Internal\Http\Controllers\Api; +use App\Exceptions\ImportRowException; use App\Helpers\Helper; use App\Models\CorporateFormularium; use App\Models\Formularium; +use App\Models\FormulariumTemplate; +use App\Services\ImportService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Storage; use Modules\Internal\Transformers\CorporateFormulariumResource; +use Modules\Internal\Services\FormulariumService; + +use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; +use Box\Spout\Writer\Common\Creator\Style\StyleBuilder; +use Box\Spout\Common\Entity\Style\CellAlignment; +use Box\Spout\Common\Entity\Style\Color; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; +use Box\Spout\Common\Entity\Row; class CorporateFormulariumController extends Controller { @@ -16,25 +28,24 @@ class CorporateFormulariumController extends Controller * Display a listing of the resource. * @return Renderable */ + public function __construct(FormulariumService $formulariumService) + { + $this->formulariumService = $formulariumService; + } public function index(Request $request, $corporate_id) { - $formulariums = Formularium::query() - ->filter($request->all()); - if (!empty($request->status) && $request->status == 'inactive') { - $formulariums = $formulariums->whereDoesntHave('corporateFormulariums'); - } else if (!empty($request->status) && $request->status == 'all') { - - } else { // Active or Default - $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){ - $corporateFormularium->where('corporate_id', $corporate_id); - }); - } - $formulariums = $formulariums->with(['corporateFormulariums' => function ($query) use ($corporate_id) { - $query->where('corporate_id', $corporate_id); - }]) - ->withCount('items') - ->paginate(); + $formulariums = CorporateFormularium::query() + ->where('corporate_id', $corporate_id) + ->paginate(15); + // if (!empty($request->status) && $request->status == 'inactive') { + // $formulariums = $formulariums->whereDoesntHave('corporateFormulariums'); + // } else if (!empty($request->status) && $request->status == 'all') { + // } else { // Active or Default + // $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){ + // $corporateFormularium->where('corporate_id', $corporate_id); + // }); + // } return Helper::paginateResources(CorporateFormulariumResource::collection($formulariums)); } @@ -42,9 +53,16 @@ class CorporateFormulariumController extends Controller * Show the form for creating a new resource. * @return Renderable */ - public function create() + public function create(Request $request, $corporate_id) { - return view('internal::create'); + $data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel + $formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get(); + $respone = [ + "status" => 200, + "message" => 'data berhasil diambil', + "data" => $formularium_template + ]; + return $respone; } /** @@ -52,9 +70,36 @@ class CorporateFormulariumController extends Controller * @param Request $request * @return Renderable */ - public function store(Request $request) + public function store(Request $request, $corporate_id) { - // + $request->validate([ + 'id' => 'required' + ]); + + $checkFormularium = FormulariumTemplate::find($request->id); + if (!$checkFormularium){ + $respone = [ + "status" => 404, + "message" => "data master formularium tidak ditemukan", + "data" => [] + ]; + return $respone; + } + $newCorporateFormularium = CorporateFormularium::create([ + 'corporate_id' => $corporate_id, + 'formularium_template_id' => $request->id, + 'active' => 1 + ]); + + if ($newCorporateFormularium){ + $respone = [ + "status" => 200, + "message" => "data berhasil disimpan" + ]; + return $respone; + } + + return $newCorporatePlan; } /** @@ -62,9 +107,15 @@ class CorporateFormulariumController extends Controller * @param int $id * @return Renderable */ - public function show($id) + public function show(Request $request, $corporate_id, $id) { - return view('internal::show'); + $data = Formularium::where('formularium_template_id', $id)->get(); + $respone = [ + "status" => 200, + "message" => 'data berhasil diambil', + "data" => $data + ]; + return $respone; } /** @@ -72,9 +123,16 @@ class CorporateFormulariumController extends Controller * @param int $id * @return Renderable */ - public function edit($id) + public function edit(Request $request, $corporate_id) { - return view('internal::edit'); + $data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel + $formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get(); + $respone = [ + "status" => 200, + "message" => 'data berhasil diambil', + "data" => $formularium_template + ]; + return $respone; } /** @@ -101,7 +159,7 @@ class CorporateFormulariumController extends Controller public function updateStatus($corporate_id, $formularium_id , $status) { if ($status == 'activate') { - $corporateFormularium = CorporateFormularium::firstOrCreate([ + $corporateFormularium = CorporateFormularium::updateOrCreate([ 'corporate_id' => $corporate_id, 'formularium_id' => $formularium_id ], [ @@ -128,4 +186,213 @@ class CorporateFormulariumController extends Controller ]); } } + + public function active(Request $request, $corporate_id, $id) + { + $corporateFormularium = CorporateFormularium::find($id); + $corporateFormularium->fill([ + 'active' => $request->active, + ])->save(); + + $respone = [ + "status" => 200, + "message" => 'data berhasil diedit', + "data" => $corporateFormularium + ]; + + return $respone; + } + + public function import(Request $request, $id) + { + $request->validate([ + 'file' => 'required|file|mimes:xls,xlsx,csv,txt', + ]); + // dd($request->toArray()); + $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName(); + $file = $request->file('file')->storeAs('temp', $file_name); + + // $importLog = $corporate->importLogs()->create([ + // 'type' => 'diagnosis-exclusions', + // 'file_path' => $file, + // 'status' => 'pending', + // 'progress' => 0, + // ]); + + $import = new ImportService(); + $import->read(Storage::path('temp/'.$file_name)); + $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls'); + foreach ($import->sheetsIterator() as $sheetIndex => $sheet) { + $doc_headers_indexes = []; + foreach ($sheet->getRowIterator() as $index => $row) { + if ($index == 1) { // First Row Must be Header + foreach ($row->getCells() as $index => $cell) { + $title = $cell->getValue(); + $title = preg_replace( "/\r|\n/", " ", $title ); + $title = preg_replace('/\xc2\xa0/', " ", $title ); + $title = rtrim($title); + $title = ltrim($title); + $doc_headers_indexes[$index] = $title; + } + + // Write Header to File + // $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']); + // Tambahkan 'Ingest Code' dan 'Ingest Note' ke akhir array + $doc_headers_indexes[] = 'Ingest Code'; + $doc_headers_indexes[] = 'Ingest Note'; + $import->addArrayToRow($doc_headers_indexes); + + // TODO Validate if First Row not Header + } else { // Next Row Should be Data + $row_data = []; + $row_map = [ + 0 => 'code', + 1 => 'active', + ]; + + foreach ($row->getCells() as $header_index => $cell) { + if (isset($row_map[$header_index])) { + $value = $cell->getValue(); + $value = preg_replace( "/\r|\n/", " ", $value ); + $value = preg_replace('/\xc2\xa0/', " ", $value ); + $value = rtrim($value); + $value = ltrim($value); + $row_data[$row_map[$header_index]] = $cell->getValue(); + } + } + + try { // Process the Row Data + if (empty($row_data['code'])){ + throw new ImportRowException(__('Internal Code is REQUIRED'), 405, null, $row_data); + } + if ( + // empty($row_data['code']) && + // empty($row_data['description']) && + empty($row_data['code']) && + empty($row_data['active']) + ) { + continue; + } + + // Save the Row + $formulariums = Formularium::where('code', $row_data['code'])->first(); + if ($formulariums){ + $row_data['formularium_id'] = $formulariums->id; + } else { + throw new ImportRowException(__('Internal Code is Not Found'), 405, null, $row_data); + } + $formulariumService = new FormulariumService(); + $formulariumService->handleFormuariumCorporateRow($row_data, $id); + + // Write Success Result to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 200, + 'Ingest Note' => 'Success', + ]), $sheet->getName()); + + } catch (ImportRowException $e) { + // Write Data Validation Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => $e->getCode(), + 'Ingest Note' => $e->getMessage(), + ]), $sheet->getName()); + } catch (\Exception $e) { + throw new \Exception($e); + // Write Server Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 500, + 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error', + ]), $sheet->getName()); + } + } + } + + break; // Only Read First Row + } + $import->reader->close(); + Storage::delete('temp/'.$file_name); + $import->writer->close(); + + return [ + // 'total_successed_row' => $imported_plan_data, + // 'total_failed_row' => count($failed_plan_data), + // 'failed_row' => $failed_plan_data, + 'result_file' => [ + 'url' => Storage::disk('public')->url('temp/result-'.$file_name), + 'name' => 'result-'.$file_name, + ] + ]; + } + + public function generateFormulariumList(Request $request, $id){ + // Mendapatkan data yang akan diekspor (misalnya, dari database) + // $data = Formularium::get()->toArray(); + $formulariums = Formularium::query() + ->filter($request->all()); + // if (!empty($request->status) && $request->status == 'inactive') { + // $formulariums = $formulariums->whereDoesntHave('corporateFormulariums'); + // } else if (!empty($request->status) && $request->status == 'all') { + + // } else { // Active or Default + // $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){ + // $corporateFormularium->where('corporate_id', $corporate_id); + // }); + // } + $data = $formulariums->with(['corporateFormulariums' => function ($query) use ($id) { + $query->where('corporate_id', $id); + }])->get()->toArray(); + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/TemplateFormulariumList.xlsx')); + /** Create a style with the StyleBuilder */ + $style = (new StyleBuilder()) + ->setFontBold() + ->build(); + + // Menulis header kolom + $headers_map_to_table_fields = $this->formulariumService->listing_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style); + + $writer->addRow($headerRow); + + // Menulis data + if (!empty($data)) { + foreach ($data as $item) { + $rowData = [ + $item['code'], // code + $item['name'], // name + $item['description'], // Description + $item['manufacturer'], // manufacturer + $item['category_name'], // category_name + $item['kategori_obat'], // kategori_obat + $item['uom'], // uom + $item['general_indication'], // Description + $item['composition'], // composition + $item['atc_code'], // atc_code + $item['class'], // class + $item['bpom_registration'], // bpom_registration + $item['classifications'], // classifications + $item['cat_for'], // cat_for + + ]; + + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + } + + // Menutup penulis + $writer->close(); + + // Mengembalikan response untuk mengunduh file + $filePath = public_path('files/TemplateFormulariumList.xlsx'); + + return Helper::responseJson([ + 'file_name' => "Formularium List " . date('Y-m-d h:i:s'), + "file_url" => url('files/TemplateFormulariumList.xlsx') + ]); + + } } diff --git a/Modules/Internal/Http/Controllers/Api/CorporateManageController.php b/Modules/Internal/Http/Controllers/Api/CorporateManageController.php new file mode 100644 index 00000000..90072c6b --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/CorporateManageController.php @@ -0,0 +1,82 @@ +get(); + + return response()->json($userCorporateManage); + } + + public function store(Request $request) + { + $request->validate([ + 'user_id' => [ + 'required', + ], + 'corporate_id' => 'required' + ]); + + $newCorporateManage = CorporateManager::create([ + 'corporate_id' => $request->corporate_id, + 'user_id' => $request->user_id, + ]); + + return $newCorporateManage; + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + $updateCorporateManage = CorporateManager::findOrFail($id); + $request->validate([ + 'user_id' => [ + 'required', + ], + 'corporate_id' => 'required' + ]); + + $updateCorporateManage->fill([ + 'corporate_id' => $request->corporate_id, + 'user_id' => $request->user_id, + ])->save(); + + return $updateCorporateManage; + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // Soft delete model + $corporateManage = CorporateManager::find($id); + $corporateManage->delete(); + + return $corporateManage; + } +} diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index df5368ed..19fc5583 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -31,7 +31,7 @@ class CorporateMemberController extends Controller * Display a listing of the resource. * @return Renderable */ - public function index(Request $request, $corporate_id) + public function index(Request $request, $corporate_id ) { $members = Member::query() ->joinCorporateEmployees('left') @@ -44,7 +44,13 @@ class CorporateMemberController extends Controller // return $claim->whereBetween('requested_at', [now()->startOfYear(), now()->endOfYear()]); // return $claim->used(now()->startOfYear(), now()->endOfYear()); }, + 'currentPlans', 'currentPlan', + // 'currentPlan' => function ($currentPlan) use ($service_code){ + // return $currentPlan->where([ + // 'plans.service_code' => $service_code + // ]); + // }, 'currentPlan.benefits' => function ($benefit) use ($corporate_id){ return $benefit->where([ 'corporate_benefits.active' => 1, @@ -69,13 +75,14 @@ class CorporateMemberController extends Controller public function activation(Request $request, $member_id) { $request->validate([ - 'active' => 'required' + 'active' => 'required', + 'reason' => 'required', ]); // abort(404); $member = Member::findOrFail($member_id); - $member->active = $request->active == '1'; + $member->active = $request->active; $member->reason = $request->reason; if ($member->save()) { diff --git a/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php b/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php index bcf8c232..9c79a62a 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporatePlanController.php @@ -25,6 +25,31 @@ class CorporatePlanController extends Controller return $benefits; } + public function filter(Request $request, $corporate_id){ + + $benefits = CorporatePlan::query() + ->filter($request->all()) + ->where('corporate_id', $corporate_id); + // ->where('type', $request->type) + // ->where('code', $request->code); + + if ($request->has('service_code') && is_array($request->service_code) && count($request->service_code) > 0) { + $benefits->whereIn('service_code', $request->service_code); + } + if ($request->has('type') && is_array($request->type) && count($request->type) > 0) { + $benefits->whereIn('type', $request->type); + } + if ($request->has('code') && is_array($request->code) && count($request->code) > 0) { + $benefits->whereIn('code', $request->code); + } + + + $benefits = $benefits->paginate(0)->appends($request->all()); + + return $benefits; + + } + public function activation(Request $request, $plan_id) { $request->validate([ @@ -34,7 +59,7 @@ class CorporatePlanController extends Controller // abort(404); $plan = CorporatePlan::findOrFail($plan_id); - $plan->active = $request->active == '1'; + $plan->active = $request->active == 1 ? 0 : 1; $plan->reason = $request->reason; if ($plan->save()) { @@ -110,21 +135,21 @@ class CorporatePlanController extends Controller public function update(Request $request, $corporate_id, $id) { $corporatePlan = CorporatePlan::findOrFail($id); + $request->validate([ 'code' => [ 'required', - Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id) + // Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id) ], - 'name' => 'required' ]); - $corporatePlan->fill([ 'code' => $request->code, - 'name' => $request->name, - 'active' => $request->active, - 'description' => $request->description + 'corporate_plan_id' => $request->plan, + 'service_code' => $request->service, + 'type' => $request->type, + 'limit_rules' => $request->limit ])->save(); - + return $corporatePlan; } diff --git a/Modules/Internal/Http/Controllers/Api/CorporateServiceController.php b/Modules/Internal/Http/Controllers/Api/CorporateServiceController.php index 87892a76..18f98f80 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateServiceController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateServiceController.php @@ -144,7 +144,7 @@ class CorporateServiceController extends Controller // ->with('configs', 'service') ->first(); $corporateService->fill([ - 'status' => $request->status == 'active' ? 'active' : 'inactive', + 'status' => $request->status == 'active' ? 'inactive' : 'active', 'reason' => $request->reason ]); $corporateService->save(); @@ -154,8 +154,6 @@ class CorporateServiceController extends Controller public function corporateServiceSpecialityUpdate(Request $request, $corporate_id, $service_code) { - - // return response()->json([$request->checked, $request->value, $request->speciality_id]); $corporateService = CorporateService::query() @@ -163,7 +161,6 @@ class CorporateServiceController extends Controller ->where('service_code', $service_code) ->first(); - $corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([ 'corporate_service_id' => $corporateService->id, 'speciality_id' => $request->speciality_id, @@ -193,6 +190,116 @@ class CorporateServiceController extends Controller return response()->json($selected_specialities); } + public function corporateServiceSpecialityAllUpdate(Request $request, $corporate_id, $service_code) + { + // return response()->json([$request->checked, $request->value, $request->speciality_id]); + + $corporateService = CorporateService::query() + ->where('corporate_id', $corporate_id) + ->where('service_code', $service_code) + ->first(); + + $specialities = Speciality::get()->toArray(); + + if ($specialities){ + foreach($specialities as $s){ + $corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([ + 'corporate_service_id' => $corporateService->id, + 'speciality_id' => $s['id'], + ], [ + 'corporate_service_id' => $corporateService->id, + 'speciality_id' => $s['id'], + 'active' => $request->active + ]); + + $corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([ + 'corporate_service_id' => $corporateService->id, + 'speciality_id' => $s['id'], + ], [ + 'corporate_service_id' => $corporateService->id, + 'speciality_id' => $s['id'], + 'active' => $request->active + ]); + + $corporateServiceSpecialityRule = CorporateServiceSpeciality::where('corporate_service_id', $corporateService->id) + ->where('speciality_id', $s['id']) + ->with('exclusions.rules') + ->first(); + + // Exclusion Rules + if (empty($corporateServiceSpecialityRule)) { + $corporateServiceSpecialityRule = CorporateServiceSpeciality::create([ + 'corporate_service_id' => $corporateService->id, + 'speciality_id' => $s['id'], + 'active' => false, + ]); + + $corporateServiceSpecialityRule->exclusions()->updateOrCreate([ + 'corporate_id' => $corporate_id, + 'service_code' => $service_code, + ], [ + 'corporate_id' => $corporate_id, + 'service_code' => $service_code, + 'type' => 'speciality', + ]); + } else { + $corporateServiceSpecialityRule->exclusions()->updateOrCreate([ + 'corporate_id' => $corporate_id, + 'service_code' => $service_code, + ], [ + 'corporate_id' => $corporate_id, + 'service_code' => $service_code, + 'type' => 'speciality', + ]); + } + + $exclusion = $corporateServiceSpecialityRule->exclusions()->where('corporate_id', $corporate_id)->where('service_code', $service_code)->first(); + + // if($exclusion){ + $exclusion_rule = $exclusion->rules()->updateOrCreate([ + 'exclusion_id' => $exclusion->id, + 'name' => 'msc', + ], [ + 'name' => 'msc', + 'values' => $request->active ? 'm,s,c' : '', + ]); + + $exclusion_rule = $exclusion->rules()->updateOrCreate([ + 'exclusion_id' => $exclusion->id, + 'name' => 'gender', + ], [ + 'name' => 'gender', + 'values' => $request->active ? 'male,female' : '', + ]); + // } + } + + } + + $exclusion = $corporateServiceSpeciality->exclusions()->updateOrCreate([ + 'corporate_id' => $corporate_id, + 'service_code' => $service_code, + ], [ + 'corporate_id' => $corporate_id, + 'service_code' => $service_code, + 'type' => 'speciality', + ]); + + $selected_specialities = CorporateServiceSpeciality::query() + ->where('corporate_service_id', $corporateService->id) + ->where('active', true) + ->with('speciality') + ->get() + ->pluck('speciality.name', 'speciality.id'); + + // return response()->json($selected_specialities); + return response()->json([ + 'selected_specialities' => $selected_specialities, + 'service' => CorporateServiceConfigResource::make($corporateService), + ]); + } + + public function storeExclusion(Request $request, $corporate_id, $service_code) { @@ -227,12 +334,10 @@ class CorporateServiceController extends Controller if ($request->type == 'msc') { - $value_input = $request->value; $current_msc = $exclusion->rules()->where('name', 'msc')->first()->values ?? null; if (!empty($current_msc)) { - $values = ""; if ($request->value == 'm' && $request->checked == "1") { $values = $current_msc . "," . $value_input; @@ -438,4 +543,6 @@ class CorporateServiceController extends Controller 'service' => CorporateServiceConfigResource::make($corporateService), ]); } + + } diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php new file mode 100644 index 00000000..09347128 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -0,0 +1,216 @@ + ':attribute harus diisi', + 'integer' => ':attribute harus angka', + 'unique' => ':attribute (:input) sudah ada', + 'max' => ':attribute maximal :max karakter', + 'exists' => ':attribute (:input) tidak ditemukan', + 'numeric' => ':attribute harus angka', + 'digits_between'=> ':attribute maximal :max digit minimal :min digit' + ]; + } + + /** + * Member List + */ + public function GetMemberList() + { + $memberList = DB::table('request_logs') + ->leftJoin('members', 'request_logs.member_id', '=', 'members.id') + ->leftJoin('member_plans', 'request_logs.member_id', '=', 'member_plans.member_id') + ->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id') + ->select('members.member_id','members.name','member_plans.start AS startdate','member_plans.end AS enddate', 'request_logs.submission_date as addmision_date', 'organizations.name as provider' ) + ->where('request_logs.service_code', 'IP') + ->where('request_logs.status_final_log', 'approved') + ->groupBy('request_logs.member_id') + ->orderBy('request_logs.created_at', 'desc') + ->get(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'member_list'=> $memberList, + ] + ],200); + } + + /** + * Claim List - by member id + */ + public function GetClaimList(Request $request, $member_id) + { + $memberDetail = DB::table('members') + ->select('id','member_id','name') + ->where('member_id', $member_id) + ->first(); + + $claimList = DB::table('request_logs') + ->leftJoin('services', 'services.code', '=', 'request_logs.service_code') + ->leftJoin('members', 'members.id', '=', 'request_logs.member_id') + ->select('request_logs.id','request_logs.submission_date AS admission_date','request_logs.discharge_date','request_logs.code','services.name as service_name','request_logs.status','members.name',) + ->where('request_logs.service_code', 'IP') + ->where('request_logs.status_final_log', 'approved') + ->where("request_logs.member_id", "=", $memberDetail->id) + ->orderBy("request_logs.created_at", "desc") + ->get(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'member_detail'=> $memberDetail, + 'claim_list' => $claimList, + ] + ],200); + } + + /** + * Detail Monitoring List - by claim_code + */ + public function GetDetailMonitoringList(Request $request, $claim_code) + { + // get claim request + $claim_request = DB::table('claim_requests') + ->select('id') + ->where('code', $claim_code) + ->first(); + + // get claim + $claim = DB::table('claims') + ->select('id') + ->where('claim_request_id', empty($claim_request)==false ? $claim_request->id : '') + ->first(); + + $detail_list = DailyMonitoring::where('claim_id', empty($claim) == false ? $claim->id : '')->orderBy("created_at", "desc")->get()->makeHidden(['updated_at']); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'detail_list'=> $detail_list, + ] + ],200); + } + + /** + * Add Detail Monitoring List + */ + public function AddDetailMonitoringList(Request $request, $claim_code) + { + $request->merge(['claim_code' => $claim_code]); + + // validation rule + $validator = Validator::make($request->all(),[ + 'claim_code' => 'required|exists:claim_requests,code', + 'subject' => 'required', + 'sistole' => 'required|numeric', + 'diastole' => 'required|numeric', + 'body_temperature' => 'required|numeric', + 'respiration_rate' => 'required|numeric', + 'analysis' => 'required', + 'complaints' => 'required', + 'medical_plan' => 'required', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'message' => $validator->getMessageBag() + ],400); + } + + // get claim request + $claim_request = DB::table('claim_requests') + ->select('id') + ->where('code', $claim_code) + ->first(); + + // get claim + $claim = DB::table('claims') + ->select('id') + ->where('claim_request_id', $claim_request->id) + ->first(); + DB::beginTransaction(); + try { + // insert claim daily monitoring + $db_response = DailyMonitoring::create([ + 'claim_id' => $claim->id, + 'subject' => $request->subject, + 'sistole' => $request->sistole, + 'diastole' => $request->diastole, + 'body_temperature' => $request->body_temperature, + 'respiration_rate' => $request->respiration_rate, + 'analysis' => $request->analysis, + 'complaints' => $request->complaints, + ]); + + + // cek medical plan + $num_medical_plan = 0; + + foreach ($request->medical_plan as $row) { + if ($row['medical_plan_str']) { + $num_medical_plan++; + } + } + + if ($num_medical_plan == 0) { + DB::rollBack(); + + return response()->json([ + 'error' => true, + 'message' => [ + 'medical_plan' => ['medical plan harus diisi'] + ], + 'data' => [] + ],400); + } + + // insert medical plan + foreach ($request->medical_plan as $row) { + MedicalPlan::create([ + 'claim_daily_monitoring_id' => $db_response->id, + 'plan' => $row['medical_plan_str'], + ]); + } + + DB::commit(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [] + ],200); + } + catch (Exception $e) { + DB::rollBack(); + return response()->json([ + 'error' => true, + 'message' => $e->getMessage(), + 'data' => [] + ],500); + } + } +} diff --git a/Modules/Internal/Http/Controllers/Api/DiagnosisController.php b/Modules/Internal/Http/Controllers/Api/DiagnosisController.php index f42a6b49..db329ea4 100644 --- a/Modules/Internal/Http/Controllers/Api/DiagnosisController.php +++ b/Modules/Internal/Http/Controllers/Api/DiagnosisController.php @@ -3,20 +3,40 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Models\Icd; +use App\Services\ImportService; +use App\Helpers\Helper; use Illuminate\Contracts\Support\Renderable; + +use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; +use Box\Spout\Writer\Common\Creator\Style\StyleBuilder; +use Box\Spout\Common\Entity\Style\CellAlignment; +use Box\Spout\Common\Entity\Style\Color; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; +use Box\Spout\Common\Entity\Row; + use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Storage; +use Modules\Internal\Services\IcdService; class DiagnosisController extends Controller { + public function __construct(IcdService $icdService) + { + $this->icdService = $icdService; + } /** * Display a listing of the resource. * @return Renderable */ - public function index(Request $request) + public function index(Request $request, $diagnosis_template_id) { - $diagnosis = Icd::withTrashed()->filter($request->toArray())->paginate(); - + + $diagnosis = Icd::query() + ->filter($request->toArray()) + ->where('icd_template_id', '=', $diagnosis_template_id) + ->orderBy('code', 'ASC') + ->paginate(15); return $diagnosis; } @@ -87,4 +107,178 @@ class DiagnosisController extends Controller ->orWhere('code', 'LIKE', '%'.$search.'%'); })->limit(10)->get(); } + + public function import(Request $request, $id) + { + $request->validate([ + 'file' => 'required|file|mimes:xls,xlsx,csv,txt', + ]); + $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName(); + $file = $request->file('file')->storeAs('temp', $file_name); + + $import = new ImportService(); + $import->read(Storage::path('temp/'.$file_name)); + $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls'); + + $imported_icd_data = 0; + $failed_icd_data = []; + foreach ($import->sheetsIterator() as $sheetIndex => $sheet) { + $doc_headers_indexes = []; + foreach ($sheet->getRowIterator() as $index => $row) { + if ($index == 1) { // First Row Must be Header + foreach ($row->getCells() as $index => $cell) { + $title = $cell->getValue(); + $title = preg_replace( "/\r|\n/", " ", $title ); + $title = preg_replace('/\xc2\xa0/', " ", $title ); + $title = rtrim($title); + $title = ltrim($title); + $doc_headers_indexes[$index] = $title; + } + + // Write Header to File + $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']); + $import->addArrayToRow($result_headers); + + // TODO Validate if First Row not Header + } else { // Next Row Should be Data + $row_data = []; + $row_map = [ + 0 => 'ICD_Code', + 1 => 'Description', + ]; + + foreach ($row->getCells() as $header_index => $cell) { + if (isset($row_map[$header_index])) { + $value = $cell->getValue(); + $value = preg_replace( "/\r|\n/", " ", $value ); + $value = preg_replace('/\xc2\xa0/', " ", $value ); + $value = rtrim($value); + $value = ltrim($value); + $row_data[$row_map[$header_index]] = $cell->getValue(); + } + } + + try { // Process the Row Data + if ( + empty($row_data['ICD_Code']) && + empty($row_data['Description']) + ) { + continue; + } + + // Save the Row + $icdService = new IcdService(); + $icdService->handleIcdRow($row_data, $id); + + // Write Success Result to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 200, + 'Ingest Note' => 'Success', + ]), $sheet->getName()); + $imported_icd_data++; + + } catch (ImportRowException $e) { + // Write Data Validation Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => $e->getCode(), + 'Ingest Note' => $e->getMessage(), + ]), $sheet->getName()); + $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data]; + } catch (\Exception $e) { + throw new \Exception($e); + // Write Server Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 500, + 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error', + ]), $sheet->getName()); + $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data]; + } + } + } + + break; // Only Read First Row + } + $import->reader->close(); + Storage::delete('temp/'.$file_name); + $import->writer->close(); + + return [ + 'total_successed_row' => $imported_icd_data, + 'total_failed_row' => count($failed_icd_data), + 'failed_row' => $failed_icd_data, + 'result_file' => [ + 'url' => Storage::disk('public')->url('temp/result-'.$file_name), + 'name' => 'result-'.$file_name, + ] + ]; + } + + public function activation(Request $request, $diagnosis_id) + { + $request->validate([ + 'active' => 'required' + ]); + + $Icd = Icd::findOrFail($diagnosis_id); + $Icd->active = $request->active == '1'; + + if ($Icd->save()) { + return response()->json([ + 'icd' => $Icd, + 'message' => 'Status Updated Successfully' + ]); + } + } + + public function generateIcdList(Request $request, $diagnosis_id){ + // Mendapatkan data yang akan diekspor (misalnya, dari database) + $data = Icd::where('icd_template_id', $diagnosis_id)->get()->toArray(); + + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/TemplateICDList.xlsx')); + /** Create a style with the StyleBuilder */ + $style = (new StyleBuilder()) + ->setFontBold() + ->build(); + + // Menulis header kolom + $headers_map_to_table_fields = $this->icdService->listing_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style); + + $writer->addRow($headerRow); + + // Menulis data + if (!empty($data)) { + foreach ($data as $item) { + $rowData = [ + // $item['rev'], // Rev + // $item['version'], // Version + $item['code'], // Code + // $item['parent_code'], // Parent Code + $item['name'], // Name + // $item['description'], // Description + // $item['active'] == 1 ? 'Active' : 'Inactive', // Status + // $item['type'], // Type + ]; + + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + } + + // Menutup penulis + $writer->close(); + + // Mengembalikan response untuk mengunduh file + $filePath = public_path('files/TemplateICDList.xlsx'); + + return Helper::responseJson([ + 'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'), + "file_url" => url('files/TemplateICDList.xlsx') + ]); + + } } diff --git a/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php b/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php index 253b77f2..59a31668 100644 --- a/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php +++ b/Modules/Internal/Http/Controllers/Api/DiagnosisExclusionController.php @@ -7,6 +7,7 @@ use App\Helpers\Helper; use App\Models\Corporate; use App\Models\CorporateService; use App\Models\Exclusion; +use App\Models\ExclusionImport; use App\Models\Icd; use App\Models\ImportLog; use App\Services\ImportService; @@ -17,6 +18,8 @@ use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Storage; use Modules\Internal\Services\ExclusionService; use Modules\Internal\Transformers\DiagnosisExclusionResource; +use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; class DiagnosisExclusionController extends Controller { @@ -37,6 +40,22 @@ class DiagnosisExclusionController extends Controller return Helper::paginateResources(DiagnosisExclusionResource::collection($exclusions)); } + public function listDiagnosis(Request $request, $corporate_id){ + $exclusion = Exclusion::query() + ->where('corporate_id', $corporate_id) + ->where('type', 'diagnosis') + ->where('deleted_at', null) + // ->with(['rules']) + ->get('exclusionable_id')->toArray(); + + $icd = Icd::query() + ->whereNotIn('id', $exclusion) + ->limit(100) + ->get() + ->toArray(); + return Helper::responseJson($icd); + } + /** * Show the form for creating a new resource. * @return Renderable @@ -216,7 +235,13 @@ class DiagnosisExclusionController extends Controller $import->reader->close(); Storage::delete('temp/' . $file_name); $import->writer->close(); + ExclusionImport::updateOrCreate([ + 'corporate_id' => $corporate_id + ],[ + 'file_name' => $file_name, + 'file_path' => 'temp/result-' . $file_name, + ]); return [ // 'total_successed_row' => $imported_plan_data, // 'total_failed_row' => count($failed_plan_data), @@ -268,6 +293,7 @@ class DiagnosisExclusionController extends Controller $gender = implode(",", $gender); $gender = trim($gender, ","); + $exclusion->rules()->corporate_id = $corporate_id; $exclusion->rules()->updateOrCreate([ 'exclusion_id' => $exclusion->id, @@ -293,7 +319,6 @@ class DiagnosisExclusionController extends Controller 'values' => $data['min_age'] ?? '', ]); - $exclusion->rules()->updateOrCreate([ 'exclusion_id' => $exclusion->id, 'name' => 'max_age', @@ -320,4 +345,85 @@ class DiagnosisExclusionController extends Controller // return $exclusions; return Helper::paginateResources(DiagnosisExclusionResource::collection($exclusions)); } + + /** + * Bagaskoro BSD 20-10-2023 + * + * Fungsi untuk get detil exclusion + */ + public function detilExclusion(Request $request, $corporate_id, $id_exclusion) + { + $corporate = Corporate::query() + ->with(['currentPolicy', 'plans']) + ->withCount('corporatePlans') + ->withCount('employees') + ->findOrFail($corporate_id); + + $plans = $corporate['plans']->map(function ($plan) { + return $plan['code']; + }); + + $exclusions = Exclusion::query() + ->where('id', $id_exclusion) + ->where('type', 'diagnosis') + ->where('deleted_at', null) + ->with(['rules']) + ->get(); + + $exclusion = DiagnosisExclusionResource::collection($exclusions); + + return response()->json([ + 'error' => false, + 'messages' => "success", + 'data' => [ + 'exclusion' => empty($exclusion) ? [] : $exclusion[0], + 'plans' => $plans, + ] + ],200); + } + + /** + * Bagaskoro BSD 19-10-2023 + * + * Fungsi untuk update status active + */ + protected function messages() + { + return [ + 'required' => ':attribute harus diisi', + 'integer' => ':attribute harus angka', + 'unique' => ':attribute (:input) sudah ada', + 'max' => ':attribute maximal :max karakter', + 'exists' => ':attribute (:input) tidak ditemukan', + 'digits_between'=> ':attribute maximal :max digit minimal :min digit' + ]; + } + + public function updateActivation(Request $request) + { + // validation rule + $validator = Validator::make($request->all(),[ + 'id' => 'required|exists:exclusions', + 'active' => 'required|in:0,1', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'messages' => $validator->getMessageBag() + ],400); + } + + Exclusion::where('id', $request->id)->update([ + 'active' => $request->active == 1 ? 0 : 1, + 'reason' => $request->reason + ]); + + return response()->json([ + 'error' => false, + 'messages' => "status berhasil diupdate", + 'data' => [] + ],200); + } } diff --git a/Modules/Internal/Http/Controllers/Api/DiagnosisTemplateController.php b/Modules/Internal/Http/Controllers/Api/DiagnosisTemplateController.php new file mode 100644 index 00000000..01bb72a9 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/DiagnosisTemplateController.php @@ -0,0 +1,314 @@ +search){ + return IcdTemplate::when($request->search ?? null, function($icd, $search) { + $icd->where('name', 'LIKE', '%'.$search.'%') + ->orWhere('code', 'LIKE', '%'.$search.'%'); + })->paginate(15); + } else { + $diagnosisTemplate = IcdTemplate::query() + // ->filter($request->toArray()) + ->orderBy('code', 'ASC') + ->paginate(15); + return $diagnosisTemplate; + } + + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + $request->validate([ + 'name' => 'required' + ]); + + $newDiagnosisTemplate = IcdTemplate::create($request->all()); + + return $newDiagnosisTemplate; + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('internal::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + $IcdTemplate = IcdTemplate::findOrFail($id); + + return $IcdTemplate; + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + $IcdTemplate = IcdTemplate::findOrFail($id); + $request->validate([ + 'name' => 'required' + ]); + $IcdTemplate->fill([ + // 'code' => $request->code, + 'name' => $request->name, + 'description' => $request->description, + 'active' => $request->active, + ])->save(); + + return $IcdTemplate; + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } + + public function search(Request $request) + { + return IcdTemplate::when($request->search ?? null, function($icd, $search) { + $icd->where('name', 'LIKE', '%'.$search.'%') + ->orWhere('code', 'LIKE', '%'.$search.'%'); + })->limit(10)->get(); + } + + public function import(Request $request) + { + $request->validate([ + 'file' => 'required|file|mimes:xls,xlsx,csv,txt', + ]); + $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName(); + $file = $request->file('file')->storeAs('temp', $file_name); + + $import = new ImportService(); + $import->read(Storage::path('temp/'.$file_name)); + $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls'); + + $imported_icd_data = 0; + $failed_icd_data = []; + foreach ($import->sheetsIterator() as $sheetIndex => $sheet) { + $doc_headers_indexes = []; + foreach ($sheet->getRowIterator() as $index => $row) { + if ($index == 1) { // First Row Must be Header + foreach ($row->getCells() as $index => $cell) { + $title = $cell->getValue(); + $title = preg_replace( "/\r|\n/", " ", $title ); + $title = preg_replace('/\xc2\xa0/', " ", $title ); + $title = rtrim($title); + $title = ltrim($title); + $doc_headers_indexes[$index] = $title; + } + + // Write Header to File + $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']); + $import->addArrayToRow($result_headers); + + // TODO Validate if First Row not Header + } else { // Next Row Should be Data + $row_data = []; + $row_map = [ + 0 => 'code', + 1 => 'parent_code', + 2 => 'reff_exc', + 3 => 'description_en', + 4 => 'description_id', + 5 => 'keywords', + 6 => 'version', + 7 => 'active', + ]; + + foreach ($row->getCells() as $header_index => $cell) { + if (isset($row_map[$header_index])) { + $value = $cell->getValue(); + $value = preg_replace( "/\r|\n/", " ", $value ); + $value = preg_replace('/\xc2\xa0/', " ", $value ); + $value = rtrim($value); + $value = ltrim($value); + $row_data[$row_map[$header_index]] = $cell->getValue(); + } + } + + try { // Process the Row Data + if ( + empty($row_data['code']) && + empty($row_data['parent_code']) && + empty($row_data['reff_exc']) && + empty($row_data['description_en']) && + empty($row_data['description_id']) && + empty($row_data['keywords']) && + empty($row_data['version']) && + empty($row_data['active']) + ) { + continue; + } + + // Save the Row + $icdService = new IcdService(); + $icdService->handleIcdRow($row_data); + + // Write Success Result to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 200, + 'Ingest Note' => 'Success', + ]), $sheet->getName()); + $imported_icd_data++; + + } catch (ImportRowException $e) { + // Write Data Validation Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => $e->getCode(), + 'Ingest Note' => $e->getMessage(), + ]), $sheet->getName()); + $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data]; + } catch (\Exception $e) { + throw new \Exception($e); + // Write Server Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 500, + 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error', + ]), $sheet->getName()); + $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data]; + } + } + } + + break; // Only Read First Row + } + $import->reader->close(); + Storage::delete('temp/'.$file_name); + $import->writer->close(); + + return [ + 'total_successed_row' => $imported_icd_data, + 'total_failed_row' => count($failed_icd_data), + 'failed_row' => $failed_icd_data, + 'result_file' => [ + 'url' => Storage::disk('public')->url('temp/result-'.$file_name), + 'name' => 'result-'.$file_name, + ] + ]; + } + + public function activation(Request $request, $id) + { + $request->validate([ + 'active' => 'required' + ]); + $Icd = IcdTemplate::findOrFail($id); + $Icd->active = $request->active == '1'; + + if ($Icd->save()) { + return response()->json([ + 'icd' => $Icd, + 'message' => 'Status Updated Successfully' + ]); + } + } + + public function generateIcdList(Request $request){ + // Mendapatkan data yang akan diekspor (misalnya, dari database) + $data = Icd::get()->toArray(); + + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/CorporateMembershipList.xlsx')); + /** Create a style with the StyleBuilder */ + $style = (new StyleBuilder()) + ->setFontBold() + ->build(); + + // Menulis header kolom + $headers_map_to_table_fields = $this->icdService->listing_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style); + + $writer->addRow($headerRow); + + // Menulis data + if (!empty($data)) { + foreach ($data as $item) { + $rowData = [ + $item['rev'], // Rev + $item['version'], // Version + $item['code'], // Code + $item['parent_code'], // Parent Code + $item['name'], // Name + $item['description'], // Description + $item['active'] == 1 ? 'Active' : 'Inactive', // Status + $item['type'], // Type + ]; + + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + } + + // Menutup penulis + $writer->close(); + + // Mengembalikan response untuk mengunduh file + $filePath = public_path('files/CorporateMembershipList.xlsx'); + + return Helper::responseJson([ + 'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'), + "file_url" => url('files/CorporateMembershipList.xlsx') + ]); + + } +} diff --git a/Modules/Internal/Http/Controllers/Api/DivisionController.php b/Modules/Internal/Http/Controllers/Api/DivisionController.php index 10ba58f0..5be75800 100644 --- a/Modules/Internal/Http/Controllers/Api/DivisionController.php +++ b/Modules/Internal/Http/Controllers/Api/DivisionController.php @@ -19,6 +19,7 @@ class DivisionController extends Controller $benefits = CorporateDivision::query() ->filter($request->all()) ->where('corporate_id', $corporate_id) + ->orderBy('id', 'DESC') ->paginate(0) ->appends($request->all()); @@ -52,6 +53,7 @@ class DivisionController extends Controller 'corporate_id' => $corporate_id, 'code' => $request->code, 'name' => $request->name, + 'description' => $request->description ? $request->description : null, ]); return $newCorporatePlan; @@ -91,8 +93,6 @@ class DivisionController extends Controller $request->validate([ 'code' => [ 'required', - // Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id) - // Rule::unique('corporate_divisions')->where('corporate_id', $corporate_id) ], 'name' => 'required' ]); @@ -100,7 +100,7 @@ class DivisionController extends Controller $corporatePlan->fill([ 'code' => $request->code, 'name' => $request->name, - 'active' => $request->active, + 'description' => $request->description, ])->save(); return $corporatePlan; diff --git a/Modules/Internal/Http/Controllers/Api/DrugController.php b/Modules/Internal/Http/Controllers/Api/DrugController.php index 1402699e..97c7bd63 100644 --- a/Modules/Internal/Http/Controllers/Api/DrugController.php +++ b/Modules/Internal/Http/Controllers/Api/DrugController.php @@ -6,6 +6,8 @@ use App\Models\Drug; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use App\Helpers\Helper; +use Maatwebsite\Excel\Facades\Excel; class DrugController extends Controller { @@ -15,8 +17,11 @@ class DrugController extends Controller */ public function index(Request $request) { - $drugs = Drug::withTrashed()->filter($request->toArray())->paginate(); - + $drugs = Drug::query() + ->filter($request->all()) + ->orderBy('id', 'DESC') + ->paginate(0) + ->appends($request->all()); return $drugs; } @@ -79,4 +84,110 @@ class DrugController extends Controller { // } + + public function activation(Request $request, $drug_id) + { + $request->validate([ + 'active' => 'required', + 'reason' => 'required', + ]); + + $drug = Drug::findOrFail($drug_id); + $drug->active = $request->active; + $drug->reason = $request->reason; + + if ($drug->save()) { + return response()->json([ + 'hostpital' => $drug, + 'message' => 'Status Updated Successfully' + ]); + } + } + public function downloadTemplate() + { + return Helper::responseJson([ + 'file_name' => "Template - Drugs.xlsx", + "file_url" => url('files/Template - Drugs.xlsx') + ]); + } + public function import(Request $request) + { + if ($request->hasFile('file')) { + $file = $request->file('file'); + $data = Excel::toArray([], $file); + + $processedData = $this->processCategoryNames($data); + + $importedRows = 0; + $failedRows = []; + + foreach ($processedData as $row) { + try { + Drug::create( + [ + 'name' => $row['name'], + 'code' => $row['code'], + 'generic_name' => $row['generic_name'], + 'description' => $row['description'], + 'mims_class' => $row['mims_class'], + 'indications' => $row['indications'], + 'atc_code' => $row['atc_code'], + 'segmentation' => $row['segmentation'], + 'type' => $row['type'], + 'dosage' => $row['dosage'], + 'remark' => $row['remark'], + ] + ); + $importedRows++; + } catch (\Exception $e) { + $failedRows[] = $row; + } + } + + $response = [ + 'message' => 'File uploaded and data saved to database', + 'data' => [ + 'total_success_row' => $importedRows, + 'total_failed_row' => count($failedRows), + 'failed_rows' => $failedRows, + ], + ]; + + return response()->json($response); + } + + return response()->json(['error' => 'No file uploaded.']); + } + + private function processCategoryNames($data) + { + $header = []; + $row = []; + for ($i = 1; $i < count($data[0]); $i++) { + $row[] = $data[0][$i]; + $header[] = $data[0][0]; + } + + $filed = []; + foreach ($header[0] as $value) + { + $modelColumn = strtolower(preg_replace('/\s+/', '_', trim($value))); + $modelColumn = str_replace(['*', ' '], '', $modelColumn); + if($modelColumn) + { + $filed[] = $modelColumn; + } + } + + $result = []; + foreach ($row as $subarray) { + $trimmedSubarray = []; + for ($i = 0; $i < count($filed); $i++) { + $trimmedSubarray[$filed[$i]] = $subarray[$i] ? $subarray[$i] : null; + } + + $result[] = $trimmedSubarray; + } + return $result; + } } diff --git a/Modules/Internal/Http/Controllers/Api/FormulariumController.php b/Modules/Internal/Http/Controllers/Api/FormulariumController.php index a49e9963..ce2d86bf 100644 --- a/Modules/Internal/Http/Controllers/Api/FormulariumController.php +++ b/Modules/Internal/Http/Controllers/Api/FormulariumController.php @@ -3,9 +3,21 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Models\Formularium; +use App\Services\ImportService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; +use Modules\Internal\Services\FormulariumService; + +use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; +use Box\Spout\Writer\Common\Creator\Style\StyleBuilder; +use Box\Spout\Common\Entity\Style\CellAlignment; +use Box\Spout\Common\Entity\Style\Color; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; +use Box\Spout\Common\Entity\Row; + class FormulariumController extends Controller { @@ -13,10 +25,27 @@ class FormulariumController extends Controller * Display a listing of the resource. * @return Renderable */ - public function index(Request $request) + public function __construct(FormulariumService $formulariumService) { - $formulariums = Formularium::withTrashed()->withCount('items')->filter($request->toArray())->paginate(); - + $this->formulariumService = $formulariumService; + } + public function index(Request $request, $id) + { + if ($request->search) { + return Formularium::when($request->search ?? null, function ($formularium) use ($request, $id) { + $formularium->where('formularium_template_id', $id) + ->where('name', 'LIKE', '%' . $request->search . '%') + ->orWhere('code', 'LIKE', '%' . $request->search . '%'); + })->paginate(15); + } + else { + $formulariums = Formularium::query() + // ->filter($request->toArray()) + ->where('formularium_template_id', $id) + ->orderBy('name', 'ASC') + ->paginate(15); + return $formulariums; + } return $formulariums; } @@ -34,7 +63,7 @@ class FormulariumController extends Controller * @param Request $request * @return Renderable */ - public function store(Request $request) + public function store(Request $request, $id) { $request->validate([ 'name' => 'required|string|max:255', @@ -87,7 +116,7 @@ class FormulariumController extends Controller // } - public function import(Request $request) + public function import(Request $request, $id) { $request->validate([ 'file' => 'required|file|mimes:xls,xlsx,csv,txt', @@ -95,7 +124,6 @@ class FormulariumController extends Controller // dd($request->toArray()); $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName(); $file = $request->file('file')->storeAs('temp', $file_name); - $corporate = Corporate::findOrFail($corporate_id); // $importLog = $corporate->importLogs()->create([ // 'type' => 'diagnosis-exclusions', @@ -107,7 +135,6 @@ class FormulariumController extends Controller $import = new ImportService(); $import->read(Storage::path('temp/'.$file_name)); $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls'); - foreach ($import->sheetsIterator() as $sheetIndex => $sheet) { $doc_headers_indexes = []; foreach ($sheet->getRowIterator() as $index => $row) { @@ -130,16 +157,19 @@ class FormulariumController extends Controller $row_data = []; $row_map = [ 0 => 'code', - 1 => 'description', - 2 => 'ip_exclusion', - 3 => 'op_exclusion', - 4 => 'de_exclusion', - 5 => 'ma_exclusion', - 6 => 'sp_exclusion', - 7 => 'pre_exist_exclusion', - 8 => 'op_de_exclusion', - 9 => 'keterangan', - 10 => 'maternity_waiting' + 1 => 'name', + 2 => 'description', + 3 => 'manufacturer', + 4 => 'category_name', + 5 => 'kategori_obat', + 6 => 'uom', + 7 => 'general_indication', + 8 => 'composition', + 9 => 'atc_code', + 10 => 'class', + 11 => 'bpom_registration', + 12 => 'classifications', + 13 => 'cat_for', ]; foreach ($row->getCells() as $header_index => $cell) { @@ -157,20 +187,27 @@ class FormulariumController extends Controller if ( // empty($row_data['code']) && // empty($row_data['description']) && - empty($row_data['ip_exclusion']) && - empty($row_data['op_exclusion']) && - empty($row_data['de_exclusion']) && - empty($row_data['ma_exclusion']) && - empty($row_data['sp_exclusion']) && - empty($row_data['pre_exis_exclusion']) && - empty($row_data['op_de_exclusion']) && - empty($row_data['maternity_waiting'])) { + empty($row_data['code']) && + empty($row_data['name']) && + empty($row_data['description']) && + empty($row_data['manufacturer']) && + empty($row_data['category_name']) && + empty($row_data['kategori_obat']) && + empty($row_data['uom']) && + empty($row_data['general_indication']) && + empty($row_data['composition']) && + empty($row_data['atc_code']) && + empty($row_data['class']) && + empty($row_data['bpom_registration']) && + empty($row_data['classifications']) && + empty($row_data['cat_for']) + ) { continue; } // Save the Row - $exclusionService = new ExclusionService(); - $exclusionService->handleDiagnosisExclusionRow($corporate, $row_data); + $formulariumService = new FormulariumService(); + $formulariumService->handleFormuariumTemplateRow($row_data, $id); // Write Success Result to File $import->addArrayToRow(array_merge($row_data, [ @@ -211,4 +248,64 @@ class FormulariumController extends Controller ] ]; } + + public function generateFormulariumList(Request $request) + { + // Mendapatkan data yang akan diekspor (misalnya, dari database) + $data = Formularium::get()->toArray(); + + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/TemplateFormulariumList.xlsx')); + /** Create a style with the StyleBuilder */ + $style = (new StyleBuilder()) + ->setFontBold() + ->build(); + + // Menulis header kolom + $headers_map_to_table_fields = $this->formulariumService->listing_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style); + + $writer->addRow($headerRow); + + // Menulis data + if (!empty($data)) { + foreach ($data as $item) { + $rowData = [ + $item['code'], // code + $item['name'], // name + $item['description'], // Description + $item['manufacturer'], // manufacturer + $item['category_name'], // category_name + $item['kategori_obat'], // kategori_obat + $item['uom'], // uom + $item['general_indication'], // Description + $item['composition'], // composition + $item['atc_code'], // atc_code + $item['class'], // class + $item['bpom_registration'], // bpom_registration + $item['classifications'], // classifications + $item['cat_for'], // cat_for + + ]; + + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + } + + // Menutup penulis + $writer->close(); + + // Mengembalikan response untuk mengunduh file + $filePath = public_path('files/TemplateFormulariumList.xlsx'); + + return Helper::responseJson([ + 'file_name' => "Formularium List " . date('Y-m-d h:i:s'), + "file_url" => url('files/TemplateFormulariumList.xlsx') + ]); + + } } diff --git a/Modules/Internal/Http/Controllers/Api/FormulariumTemplateController.php b/Modules/Internal/Http/Controllers/Api/FormulariumTemplateController.php new file mode 100644 index 00000000..96a37f18 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/FormulariumTemplateController.php @@ -0,0 +1,316 @@ +search){ + return FormulariumTemplate::when($request->search ?? null, function($icd, $search) { + $icd->where('name', 'LIKE', '%'.$search.'%') + ->orWhere('description', 'LIKE', '%'.$search.'%'); + })->paginate(15); + } else { + $diagnosisTemplate = FormulariumTemplate::query() + // ->filter($request->toArray()) + ->orderBy('name', 'ASC') + ->paginate(15); + return $diagnosisTemplate; + } + + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + $request->validate([ + 'name' => 'required' + ]); + + $newDiagnosisTemplate = FormulariumTemplate::create($request->all()); + + return $newDiagnosisTemplate; + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('internal::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + $FormulariumTemplate = FormulariumTemplate::findOrFail($id); + + return $FormulariumTemplate; + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + $FormulariumTemplate = FormulariumTemplate::findOrFail($id); + $request->validate([ + 'name' => 'required' + ]); + $FormulariumTemplate->fill([ + // 'code' => $request->code, + 'name' => $request->name, + 'description' => $request->description, + 'active' => $request->active, + ])->save(); + + return $FormulariumTemplate; + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } + + public function search(Request $request) + { + return FormulariumTemplate::when($request->search ?? null, function($icd, $search) { + $icd->where('name', 'LIKE', '%'.$search.'%') + ->orWhere('code', 'LIKE', '%'.$search.'%'); + })->limit(10)->get(); + } + + public function import(Request $request) + { + $request->validate([ + 'file' => 'required|file|mimes:xls,xlsx,csv,txt', + ]); + $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName(); + $file = $request->file('file')->storeAs('temp', $file_name); + + $import = new ImportService(); + $import->read(Storage::path('temp/'.$file_name)); + $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls'); + + $imported_icd_data = 0; + $failed_icd_data = []; + foreach ($import->sheetsIterator() as $sheetIndex => $sheet) { + $doc_headers_indexes = []; + foreach ($sheet->getRowIterator() as $index => $row) { + if ($index == 1) { // First Row Must be Header + foreach ($row->getCells() as $index => $cell) { + $title = $cell->getValue(); + $title = preg_replace( "/\r|\n/", " ", $title ); + $title = preg_replace('/\xc2\xa0/', " ", $title ); + $title = rtrim($title); + $title = ltrim($title); + $doc_headers_indexes[$index] = $title; + } + + // Write Header to File + $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']); + $import->addArrayToRow($result_headers); + + // TODO Validate if First Row not Header + } else { // Next Row Should be Data + $row_data = []; + $row_map = [ + 0 => 'code', + 1 => 'parent_code', + 2 => 'reff_exc', + 3 => 'description_en', + 4 => 'description_id', + 5 => 'keywords', + 6 => 'version', + 7 => 'active', + ]; + + foreach ($row->getCells() as $header_index => $cell) { + if (isset($row_map[$header_index])) { + $value = $cell->getValue(); + $value = preg_replace( "/\r|\n/", " ", $value ); + $value = preg_replace('/\xc2\xa0/', " ", $value ); + $value = rtrim($value); + $value = ltrim($value); + $row_data[$row_map[$header_index]] = $cell->getValue(); + } + } + + try { // Process the Row Data + if ( + empty($row_data['code']) && + empty($row_data['parent_code']) && + empty($row_data['reff_exc']) && + empty($row_data['description_en']) && + empty($row_data['description_id']) && + empty($row_data['keywords']) && + empty($row_data['version']) && + empty($row_data['active']) + ) { + continue; + } + + // Save the Row + $icdService = new IcdService(); + $icdService->handleIcdRow($row_data); + + // Write Success Result to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 200, + 'Ingest Note' => 'Success', + ]), $sheet->getName()); + $imported_icd_data++; + + } catch (ImportRowException $e) { + // Write Data Validation Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => $e->getCode(), + 'Ingest Note' => $e->getMessage(), + ]), $sheet->getName()); + $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data]; + } catch (\Exception $e) { + throw new \Exception($e); + // Write Server Error to File + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => 500, + 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error', + ]), $sheet->getName()); + $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data]; + } + } + } + + break; // Only Read First Row + } + $import->reader->close(); + Storage::delete('temp/'.$file_name); + $import->writer->close(); + + return [ + 'total_successed_row' => $imported_icd_data, + 'total_failed_row' => count($failed_icd_data), + 'failed_row' => $failed_icd_data, + 'result_file' => [ + 'url' => Storage::disk('public')->url('temp/result-'.$file_name), + 'name' => 'result-'.$file_name, + ] + ]; + } + + public function activation(Request $request, $id) + { + + $request->validate([ + 'active' => 'required' + ]); + $formulariumTemplate = FormulariumTemplate::find($id); + + $formulariumTemplate->active = $request->active == 1 ? 0 : 1; + + if ($formulariumTemplate->save()) { + return response()->json([ + 'data' => $formulariumTemplate, + 'message' => 'Status Updated Successfully' + ]); + } + } + + public function generateIcdList(Request $request){ + // Mendapatkan data yang akan diekspor (misalnya, dari database) + $data = Icd::get()->toArray(); + + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/CorporateMembershipList.xlsx')); + /** Create a style with the StyleBuilder */ + $style = (new StyleBuilder()) + ->setFontBold() + ->build(); + + // Menulis header kolom + $headers_map_to_table_fields = $this->icdService->listing_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style); + + $writer->addRow($headerRow); + + // Menulis data + if (!empty($data)) { + foreach ($data as $item) { + $rowData = [ + $item['rev'], // Rev + $item['version'], // Version + $item['code'], // Code + $item['parent_code'], // Parent Code + $item['name'], // Name + $item['description'], // Description + $item['active'] == 1 ? 'Active' : 'Inactive', // Status + $item['type'], // Type + ]; + + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + } + + // Menutup penulis + $writer->close(); + + // Mengembalikan response untuk mengunduh file + $filePath = public_path('files/CorporateMembershipList.xlsx'); + + return Helper::responseJson([ + 'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'), + "file_url" => url('files/CorporateMembershipList.xlsx') + ]); + + } +} diff --git a/Modules/Internal/Http/Controllers/Api/HospitalController.php b/Modules/Internal/Http/Controllers/Api/HospitalController.php new file mode 100644 index 00000000..5c9a09e9 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/HospitalController.php @@ -0,0 +1,266 @@ +filter($request->all()) + ->where('corporate_id', $corporate_id) + ->orderBy('id', 'DESC') + ->paginate(0) + ->appends($request->all()); + + return $datas; + } + + public function activation(Request $request, $hospital_id) + { + $request->validate([ + 'active' => 'required', + 'reason' => 'required', + ]); + + // abort(404); + + $hostpital = CorporateHospital::findOrFail($hospital_id); + $hostpital->active = $request->active; + $hostpital->reason = $request->reason; + + if ($hostpital->save()) { + return response()->json([ + 'hostpital' => $hostpital, + 'message' => 'Status Updated Successfully' + ]); + } + } + + public function dataHospital(Request $request, $corporate_id) + { + $data = DB::table('organizations') + ->where('type', 'hospital') + ->where('status', 'active') + ->orderBy('id', 'desc') + ->get(); + return $data; + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request, $corporate_id) + { + $request->validate([ + 'corporate_id' => 'required', + 'code' => 'required', + 'name' => 'required', + 'organization_id' => 'required', + ]); + + $newCorporateHospital = CorporateHospital::create([ + 'corporate_id' => $corporate_id, + 'code' => $request->code, + 'name' => $request->name, + 'organization_id' => $request->organization_id, + 'description' => $request->description ? $request->description : null, + ]); + + return $newCorporateHospital; + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('internal::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($corporate_id, $id) + { + $corporatePlan = CorporateDivision::findOrFail($id); + + return $corporatePlan; + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $corporate_id, $id) + { + $corporatePlan = CorporateHospital::findOrFail($id); + $request->validate([ + 'corporate_id' => 'required', + 'code' => 'required', + 'name' => 'required', + 'organization_id' => 'required', + ]); + + $corporatePlan->fill([ + 'corporate_id' => $corporate_id, + 'code' => $request->code, + 'name' => $request->name, + 'organization_id' => $request->organization_id, + 'description' => $request->description ? $request->description : null, + ])->save(); + + return $corporatePlan; + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } + public function downloadTemplate() + { + return Helper::responseJson([ + 'file_name' => "Template - Hospitals.xlsx", + "file_url" => url('files/Template - Hospitals.xlsx') + ]); + } + + public function import(Request $request, $corporate_id) + { + if ($request->hasFile('file')) { + $file = $request->file('file'); + $data = Excel::toArray([], $file); + + $processedData = $this->processCategoryNames($data); + + $importedRows = 0; + $failedRows = []; + + foreach ($processedData as $row) { + $q_check = DB::table('corporate_hospitals') + ->where('code', '=', $row['code']) + ->select('code') + ->first(); + $q = DB::table('organizations') + ->where('code', '=', $row['code']) + ->where('type', '=', 'hospital') + ->where('status', '=', 'active') + ->select('id', 'code', 'name') + ->first(); + try { + if($q_check) + { + DB::table('corporate_hospitals') + ->where('code','=', $q_check->code) + ->update( + [ + 'corporate_id' => $corporate_id, + 'code' => $q->code, + 'name' => $q->name, + 'organization_id' => $q->id, + 'description' => $request->description ? $request->description : null, + 'updated_by' =>auth()->user()->id, + 'updated_at' => date('Y-m-d H:i:s'), + ] + ); + } + else + { + CorporateHospital::create( + [ + 'corporate_id' => $corporate_id, + 'code' => $q->code, + 'name' => $q->name, + 'organization_id' => $q->id, + 'description' => $request->description ? $request->description : null, + ] + ); + } + $importedRows++; + } catch (\Exception $e) { + $failedRows[] = $row; + } + } + + $response = [ + 'message' => 'File uploaded and data saved to database', + 'data' => [ + 'total_success_row' => $importedRows, + 'total_failed_row' => count($failedRows), + 'failed_rows' => $failedRows, + ], + ]; + + return response()->json($response); + } + + return response()->json(['error' => 'No file uploaded.']); + } + + private function processCategoryNames($data) + { + $header = []; + $row = []; + for ($i = 1; $i < count($data[0]); $i++) { + $row[] = $data[0][$i]; + $header[] = $data[0][0]; + } + + $filed = []; + foreach ($header[0] as $value) + { + $modelColumn = strtolower(preg_replace('/\s+/', '_', trim($value))); + $modelColumn = str_replace(['*', ' '], '', $modelColumn); + if($modelColumn) + { + $filed[] = $modelColumn; + } + } + + $result = []; + foreach ($row as $subarray) { + $trimmedSubarray = []; + for ($i = 0; $i < count($filed); $i++) { + $trimmedSubarray[$filed[$i]] = $subarray[$i] ? $subarray[$i] : null; + } + + $result[] = $trimmedSubarray; + } + return $result; + } +} diff --git a/Modules/Internal/Http/Controllers/Api/LaboratoriumResultController.php b/Modules/Internal/Http/Controllers/Api/LaboratoriumResultController.php new file mode 100644 index 00000000..81239f6e --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/LaboratoriumResultController.php @@ -0,0 +1,148 @@ + ':attribute harus diisi', + 'integer' => ':attribute harus angka', + 'unique' => ':attribute (:input) sudah ada', + 'max' => ':attribute maximal :max karakter', + 'exists' => ':attribute (:input) tidak ditemukan', + 'numeric' => ':attribute harus angka', + 'digits_between'=> ':attribute maximal :max digit minimal :min digit' + ]; + } + + /** + * Detail Lab Result List - by claim_code + */ + public function GetDetailLabResultList(Request $request, $claim_code) + { + // get claim request + $claim_request = DB::table('claim_requests') + ->select('id') + ->where('code', $claim_code) + ->first(); + + // get claim + $claim = DB::table('claims') + ->select('id') + ->where('claim_request_id', empty($claim_request)==false ? $claim_request->id : '') + ->first(); + + $detail_list = LaboratoriumResult::where('claim_id', empty($claim) == false ? $claim->id : '')->orderBy("created_at", "desc")->get()->makeHidden(['updated_at']); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'lab_result_list'=> $detail_list, + ] + ],200); + } + + /** + * Add Detail Lab Result List + */ + public function AddDetailLabResultList(Request $request, $claim_code) + { + $request->merge(['claim_code' => $claim_code]); + + // validation rule + $validator = Validator::make($request->all(),[ + 'claim_code' => 'required|exists:claim_requests,code', + 'date' => 'required', + 'location' => 'required', + 'examination' => 'required', + 'lab_result_file' => 'required', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'message' => $validator->getMessageBag() + ],400); + } + + // get claim request + $claim_request = DB::table('claim_requests') + ->select('id') + ->where('code', $claim_code) + ->first(); + + // get claim + $claim = DB::table('claims') + ->select('id') + ->where('claim_request_id', $claim_request->id) + ->first(); + + DB::beginTransaction(); + + try { + // insert lab result + $db_response = LaboratoriumResult::create([ + 'claim_id' => $claim->id, + 'date' => $request->date, + 'location' => $request->location, + 'examination' => $request->examination, + ]); + + // insert file result + foreach ($request->lab_result_file as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $db_response->id, + 'type' => 'laboratorium-result', + 'name' => $name, + 'original_name' => $fileName, + 'extension' => $extension, + 'path' => '', + ]); + + $file->storeAs($this->path_for_store, $fileName); + } + + DB::commit(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [] + ],200); + } + catch (Exception $e) { + DB::rollBack(); + + return response()->json([ + 'error' => true, + 'message' => $e->getMessage(), + 'data' => [] + ],500); + } + } +} diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogBenefitController.php b/Modules/Internal/Http/Controllers/Api/RequestLogBenefitController.php new file mode 100644 index 00000000..97788e6f --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/RequestLogBenefitController.php @@ -0,0 +1,141 @@ + 'Kolom :attribute wajib diisi.', + 'numeric' => 'Kolom :attribute harus berupa angka.', + ]; + + $validator = Validator::make($request->all(), [ + 'benefit_data' => 'required|array', + 'benefit_data.*' => 'required', + ], $customMessages); + + if ($validator->fails()) { + return Helper::responseJson([],'error', 400, $validator->errors()); + } else { + $benefitData = $request->benefit_data; + + if (count($benefitData)>0){ + // BeginTransaction + DB::beginTransaction(); + foreach($benefitData as $key => $value){ + $data = [ + 'request_log_id' => $value['request_log_id'], + 'benefit_id' => $value['benefit_id'], + 'amount_incurred' => $value['amount_incurred'], + 'amount_approved' => $value['amount_approved'], + 'amount_not_approved' => $value['amount_not_approved'], + 'excess_paid' => $value['excess_paid'], + 'keterangan' => $value['keterangan'], + + ]; + // Insert Data + try { + RequestLogBenefit::create($data); + } catch (\Throwable $th) { + DB::rollBack(); + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + } + DB::commit(); + return Helper::responseJson(status: 'success', statusCode: 201, message: 'success', data: $request->toArray()); + }; + + } + + + $requestLogBenefit = RequestLogBenefit::insert($data); + return $requestLogBenefit; + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('internal::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + $requestLogBenefit = requestLogBenefit::findOrFail($id); + $requestLogBenefit->amount_approved = $request->amount_approved; + $requestLogBenefit->amount_incurred = $request->amount_incurred; + $requestLogBenefit->amount_not_approved = $request->amount_not_approved; + $requestLogBenefit->excess_paid = $request->excess_paid; + $requestLogBenefit->keterangan = $request->keterangan; + + $requestLogBenefit->save(); + + return response()->json([ + 'error' => false, + 'message' => 'Update succses', + 'data' => $requestLogBenefit], + 200); + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + $requestLogBenefit = RequestLogBenefit::findOrFail($id); + $requestLogBenefit->delete(); + } + +} diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php new file mode 100644 index 00000000..ba8e088f --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -0,0 +1,791 @@ +when($request->search, function ($q, $search) { + $q->where('code', 'LIKE', "%".$search."%"); + $q->orWhereHas('member', function ($subQuery) use ($search) { + $subQuery->where('name', 'LIKE', "%".$search.""); + }); + }) + ->when($request->orderBy, function ($q, $orderBy) use ($request) { + if (in_array($orderBy, ['submission_date', 'code'])) { + $q->orderBy($orderBy, $request->order); + } + }) + ->when(empty($request->orderBy), function ($q) { + $q->orderBy('created_at', 'desc'); + }) + ->when($request->final_log, function($q, $final_log) { + $q->where('final_log', $final_log); + }) + ->when($request->service_code, function($q, $service_code) { + $q->where('service_code', $service_code); + }) + // ->where('status', $request->status) + ->with(['member', 'files', 'service', 'member.currentPolicy']) + ->paginate(); + + return Helper::paginateResources(RequestLogResource::collection($requestLog)); + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Create New Request Request + * + * Tb, BSD 28 November 2023 + */ + public function createNew(Request $request) + { + $request->validate([ + 'member_id' => 'required', + 'service_code' => 'required', + ]); + + if ($request->member_id){ + $code = $this->getNextCode($request); + $member = Member::find($request->member_id); + + $memberValid = false; + if ($member){ + if (($member->members_effective_date <= date('Y-m-d')) && + ($member->members_expire_date >= date('Y-m-d')) && + ($member->active == 1) && + ($member->suspended == 'N') + ){ + DB::beginTransaction(); + try { + $newRequestLog = RequestLogService::storeRequestLog( + row: [], + code: $code, + member: $member, + paymentType: 'cashless', + serviceCode: $request->service_code, + submissionDate: null, + status: 'approved', + organization_id: $request->organization_id, + source: $request->source + ); + + DB::commit(); + } + catch (\Throwable $th) { + DB::rollBack(); + + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + } else { + DB::beginTransaction(); + try { + $newRequestLog = RequestLogService::storeRequestLog( + row: [], + code: $code, + member: $member, + paymentType: 'cashless', + serviceCode: $request->service_code, + submissionDate: null, + status: 'requested', + organization_id: $request->organization_id, + source: $request->source + ); + + DB::commit(); + } + catch (\Throwable $th) { + DB::rollBack(); + + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + // return Helper::responseJson(status: 'failed', statusCode: 500, message: 'Member Not Valid'); + } + } + + } + + return Helper::responseJson(status: 'success', statusCode: 200, message: 'Request LOG berhasil ajukan!', data: $request->toArray()); + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + $claimRequest = RequestLog::findOrFail($id); + $claimRequest->load([ + 'histories' => function ($history) { + $history->latest(); + }, + 'files', + 'member', + 'member.currentPlan' => function($memberPlan) { + $memberPlan->join('request_logs', 'request_logs.service_code', '=', 'plans.service_code'); + }, + 'claim', + 'organization', + ]); + + return Helper::responseJson(data: RequestLogShowResource::make($claimRequest)); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('internal::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + $requestLog = RequestLog::findOrFail($id); + $requestLog->status = $request->status; + $requestLog->save(); + + return response()->json([ + 'error' => false, + 'message' => 'Update succses', + 'data' => $requestLog], + 200); + + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } + + /** + * Generate Request LOG PDF + */ + public function generateRequestLog($id) + { + $requestLog = RequestLog::find($id); + $service_code = $requestLog->service_code; + if ($requestLog->status != 'approved') { + return response()->json([ + 'error' => true, + 'message' => 'LOG Belum Terverifikasi', + 'data' => $requestLog], + 200); + } + + $member = Member::findOrFail($requestLog->member_id) + ->load([ + // 'currentPlan', + 'currentPlan' => function ($plan) use ($id, $service_code) { + $plan->where('plans.service_code', $service_code); + }, + 'currentPolicy', + 'currentPlan.corporateBenefits', + 'currentPlan.corporateBenefits.benefit' + ]); + + $pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'requestLog')); + return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf'); + + return $requestLog; + } + + /** + * Generate Export Excel Request LOG + */ + + public function generateDataRequestLogExcel(){ + $file_name = 'Data Request LOG'; + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/Data Request LOG.xlsx')); + + // Sheet 1 + $writer->getCurrentSheet()->setName('Data'); + $headers_map_to_table_fields = RequestLog::$listing_data_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields); + $writer->addRow($headerRow); + + $dataRequestLog = RequestLog::query() + // ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) { + // $corporatePlan->where('corporate_id', $corporate_id); + // }) + ->with('member') + ->orderBy('id', 'desc') + ->get()->toArray(); + + // dd($dataRequestLog); + foreach ($dataRequestLog as $index => $row){ + $serviceType = $this->getServiceName($row['service_code']); + + $rowData = [ + $row['id'], // id + $row['code'], // code + $row['member']['name'], // name + $row['submission_date'], // submission date + $serviceType, // service type + $row['payment_type_name'], // service type + $row['status'], // service type + ]; + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + $writer->close(); + + return Helper::responseJson([ + 'file_name' => "Data Request Log " . date('Y-m-d h:i:s'), + "file_url" => url('files/Data Request LOG.xlsx') + ]); + } + + /** + * Submit Request LOG to Final LOG + */ + public function updateFinalLog(Request $request) + { + $id = $request->id; + $requestLog = RequestLog::findOrFail($id); + $status = $request->status ?? 'requested'; + + + // Update Request LOG untuk lanjut ke Final LOG + $requestLog->final_log = 1; + $requestLog->status_final_log = $status; + $requestLog->save(); + + + if ($request->hasFile('result_files')) { + foreach ($request->result_files as $file) { + $pathFile = File::storeFile('final-log-result', $id, $file); + $requestLog->files()->updateOrCreate([ + 'type' => 'final-log-result', + 'name' => File::getFileName('final-log-result', $id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('diagnosa_files')) { + foreach ($request->diagnosa_files as $file) { + $pathFile = File::storeFile('final-log-diagnosis', $id, $file); + $requestLog->files()->updateOrCreate([ + 'type' => 'final-log-diagnosis', + 'name' => File::getFileName('final-log-diagnosis', $id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('kondisi_files')) { + foreach ($request->kondisi_files as $file) { + $pathFile = File::storeFile('final-log-kondisi', $id, $file); + $requestLog->files()->updateOrCreate([ + 'type' => 'final-log-kondisi', + 'name' => File::getFileName('final-log-kondisi', $id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + return response()->json([ + 'error' => false, + 'message' => 'Update succses', + 'data' => $requestLog], + 200); + + } + + + public function updateStatus($id) + { + $requestLog = RequestLog::findOrFail($id); + $member = $requestLog->member; + + try { + + // Update Request LOG Status & Link with Claim + $requestLog->status = 'approved'; + $requestLog->save(); + + // Store Generated Documents LOG + $logContent = view('pdf.guaranted_leter', compact('member', 'requestLog')); + $requestLog->generatedDocuments()->create([ + 'type' => 'guarantee_letter', + 'title' => 'Guarantee Letter for '. $member->full_name, + 'document_type' => 'type', + 'html_content' => $logContent, + 'system_origin' => 'primecenter' + ]); + + + } catch (\Exception $e) { + return $e->getMessage(); + } + + return $claimRequest; + } + + public function filesMcu(Request $request) + { + $request->validate([ + 'id' => 'required', + 'memberid' => 'required' + ]); + if ($request->hasFile('result_files')) { + $pathFile = File::storeFile('claim-result', $request->id, $request->result_files); + $data = [ + 'memberid' => $request->id, + 'original_name' => $request->result_files->getClientOriginalName(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id + ]; + FilesMcu::create($data); + return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file MemberID '.$request->memberid.', silahkan lihat dilaporan'); + } + else + { + return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file member yang ditambahkan'); + } + + } + + public function importRequestLog(Request $request) + { + + $request->validate([ + 'file' => 'required|file|mimes:xls,xlsx,csv,txt', + ]); + $file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName(); + $file = $request->file('file')->storeAs('temp', $file_name); + $fileWrite = Storage::disk('public')->path('temp/result-' . $file_name); + $fileRead = Storage::path('temp/' . $file_name); + $import = new ImportService(); + $import->read($fileRead); + $import->write($fileWrite, 'xsls'); + foreach ($import->sheetsIterator() as $sheetIndex => $sheet) { + if ($sheetIndex == 1) { // Rename First Sheet to Writer + $firstWriterSheet = $import->writer->getCurrentSheet(); + $firstWriterSheet->setName($sheet->getName()); + } else { // Add New Sheet to Writer + $nextWriterSheet = $import->writer->addNewSheetAndMakeItCurrent(); + $nextWriterSheet->setName($sheet->getName()); + } + + $headers_map_to_table_fields = RequestLog::$doc_headers_to_field_map; + + // Write Header to File + $result_headers = array_keys($headers_map_to_table_fields); + $result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']); + + $import->addArrayToRow($result_headers); + $doc_headers_indexes = []; + foreach ($sheet->getRowIterator() as $index => $row) { + if ($index == 1) { // First Row Must be Header + foreach ($row->getCells() as $index => $cell) { + $title = $cell->getValue(); + $title = preg_replace("/\r|\n/", " ", $title); + $title = preg_replace('/\xc2\xa0/', " ", $title); + $title = rtrim($title); + $title = ltrim($title); + $doc_headers_indexes[$index] = $title; + } + // TODO Validate if First Row not Header + } else { // Next Row Should be Data + $row_data = []; + foreach ($row->getCells() as $header_index => $cell) { + if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]])) + $row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue(); + } + try { // Process the Row Data + $requestLog = new RequestLogService(); + + $requestLog->handleRequestLogRow($row_data); + + $result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']); + + $import->addArrayToRow($result_headers, $sheet->getName()); + + } catch (ImportRowException $e) { + $import->addArrayToRow(array_merge($row_data, [ + 'Ingest Code' => $e->getCode(), + 'Ingest Note' => $e->getMessage(), + ]), $sheet->getName()); + } + } + } + } + $import->reader->close(); + Storage::delete('temp/' . $file_name); + $import->writer->close(); + + return [ + // 'total_successed_row' => $imported_plan_data, + // 'total_failed_row' => count($failed_plan_data), + // 'failed_row' => $failed_plan_data, + 'result_file' => [ + 'url' => Storage::disk('public')->url('temp/result-' . $file_name), + 'name' => 'result-' . $file_name, + ] + ]; + } + + public function claimRequestDetail($claimRequestId) + { + $status = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->where('claim_requests.id', '=', $claimRequestId) + ->select( + 'claim_requests.submission_date', + 'claim_requests.code', + DB::raw(' + CASE + WHEN claim_requests.status = "requested" THEN "requested" + WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" + ELSE "" + END AS status + ') + ) + ->first(); + $results['status'] = $status; + $timeline = DB::table('claim_logs') + ->where('claim_logs.claim_request_id', '=', $claimRequestId) + ->select( + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "Request" + WHEN claim_logs.status = "reviewed" THEN "Review" + WHEN claim_logs.status = "approved" THEN "Approval" + WHEN claim_logs.status = "declined" THEN "Decline" + ELSE "-" + END AS txt_status + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#159C9C" + WHEN claim_logs.status = "reviewed" THEN "#0C53B7" + WHEN claim_logs.status = "approved" THEN "#229A16" + WHEN claim_logs.status = "declined" THEN "#FF4842" + ELSE "-" + END AS txt_status_color + '), + DB::raw(' + CASE + WHEN claim_logs.status = "requested" THEN "#00AB5529" + WHEN claim_logs.status = "reviewed" THEN "#1890FF29" + WHEN claim_logs.status = "approved" THEN "#54D62C29" + WHEN claim_logs.status = "declined" THEN "#FF48427A" + ELSE "-" + END AS txt_status_backgroundColor + '), + 'claim_logs.date', + 'claim_logs.description', + 'claim_logs.status' + ) + ->orderBy('claim_logs.id', 'desc') + ->get(); + $results['timeline'] = $timeline; + $request_files = DB::table('claim_request_files') + ->where('claim_request_files.claim_request_id', '=', $claimRequestId) + ->select( + 'claim_request_files.*', + DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), + ) + ->get(); + $results['request_files'] = $request_files; + $documents = DB::table('files') + ->where('fileable_type', 'App\Models\RequestLog') + ->where('fileable_id', $claimRequestId) + ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') + ->orderBy('id', 'desc') + ->get(); + $results['documents'] = $documents; + $dialog_submits = DB::table('claim_requests') + ->leftJoin('members', 'claim_requests.member_id','=', 'members.id') + ->where('claim_requests.id', $claimRequestId) + ->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status') + ->first(); + $results['dialog_submits'] = $dialog_submits; + + return Helper::responseJson($results); + } + + public function invoiceFiles(Request $request, $claim_id) + { + if ($request->hasFile('invoice_files')) { + foreach ($request->invoice_files as $file) { + $pathFile = File::storeFile('claim-invoice', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\RequestLog', + 'fileable_id' => $claim_id, + 'type' => 'claim-invoice', + 'name' => File::getFileName('claim-invoice', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + if($request->date) + { + DB::table('claim_requests') + ->where('id', $claim_id) + ->update(['invoice_date' => $request->date]); + + } + return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); + } + + /** + * Get Claim Member - Infinite Scroll + * + * Bagaskoro, BSD 31 Oktober 2023 + */ + public function getClaimMemberInfiniteScroll(Request $request) + { + $offset = 0; + $limit = 10; + $page = $request->get('page'); + $keyword = $request->get('keyword'); + + if ($page > 1) { + $offset = ($page*$limit)-$limit; + } + + $memberList = DB::table('members') + ->select('id','member_id','name') + ->where("name", "like", "%$keyword%") + ->orWhere("member_id", "like", "%$keyword%") + ->orderBy('created_at', 'asc') + ->offset($offset) + ->limit($limit) + ->get(); + + $data = []; + if(count($memberList)>0){ + $temp = []; + foreach($memberList as $d){ + $serviceType = $this->getServiceMember($d->id); + $temp['id'] = $d->id; + $temp['member_id'] = $d->member_id; + $temp['name'] = $d->name; + $temp['service_type'] = $serviceType; + + + array_push($data, $temp); + } + + } + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'member_list'=> $data, + ] + ],200); + } + + public function getServiceMember($id){ + $service = DB::table('member_plans') + ->select('plans.service_code as code', 'services.name') + ->join('plans', 'member_plans.plan_id', '=', 'plans.id') + ->join('services', 'plans.service_code', '=', 'services.code') + ->where('member_id', $id) + ->get() + ->toArray(); + return $service; + } + + public function getServiceName($code){ + $service = DB::table('services') + ->select('name') + ->where('code', $code) + ->get() + ->first(); + return $service->name; + } + + public static function getNextCode(Request $request) + { + // $last_number = RequestLog::max('code'); + // $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1); + // return self::makeCode($next_number); + + $source = $request->source == 'client-portal' ? 'C' : 'H'; + $organization = Organization::where(['id' => $request->organization_id, 'type' => 'hospital'])->first('code'); + $provideCode = $organization ? $organization->code : ''; + $member = Member::with('currentCorporate')->where(['id' => $request->member_id])->first(); + + $data = [ + 'source' => $source, + 'provideCode' => $provideCode, + 'date' => date('ymd'), + 'policy' => $member->currentPolicy->code, + 'member_code' => $member->member_id, + ]; + + $last_numeric_code = RequestLog::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, ".", -1) AS SIGNED)) as max_numeric_code')) + ->whereRaw('SUBSTRING_INDEX(code, ".", -1) REGEXP "^[0-9]+$"') + ->value('max_numeric_code'); + // $next_number = 1; + + if ($last_numeric_code) { + // // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir + // $parts = explode('-', $last_code); + // $last_number = (int) end($parts); + $next_number = $last_numeric_code + 1; + } else { + $next_number = 1; + } + return self::makeCode($next_number, $data); + } + + + public static function makeCode($next_number, $data) + { + $sparator = '.'; + // Pastikan $next_number adalah integer positif + $next_number = max(1, (int) $next_number); + // Menghasilkan kode dengan format yang diinginkan + return self::$code_prefix . $sparator. $data['source'] . $sparator. $data['provideCode'] . $sparator. $data['date'] . $sparator . $data['policy'] . $sparator. $data['member_code'] . $sparator. str_pad($next_number, 3, '0', STR_PAD_LEFT); + } + + public function requestFiles(Request $request, $claim_id) + { + + if ($request->hasFile('fileDiagnosis')) { + foreach ($request->fileDiagnosis as $file) { + $pathFile = File::storeFile('claim-diagnosis', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\RequestLog', + 'fileable_id' => $claim_id, + 'type' => 'claim-diagnosis', + 'name' => File::getFileName('claim-diagnosis', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileKondisis')) { + foreach ($request->fileKondisis as $file) { + $pathFile = File::storeFile('claim-kondisi', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\RequestLog', + 'fileable_id' => $claim_id, + 'type' => 'claim-kondisi', + 'name' => File::getFileName('claim-kondisi', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('fileResults')) { + foreach ($request->fileResults as $file) { + $pathFile = File::storeFile('claim-result', $claim_id, $file); + File::updateOrCreate([ + 'fileable_type'=>'App\Models\RequestLog', + 'fileable_id' => $claim_id, + 'type' => 'claim-result', + 'name' => File::getFileName('claim-result', $claim_id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); + } +} diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogMedicineController.php b/Modules/Internal/Http/Controllers/Api/RequestLogMedicineController.php new file mode 100644 index 00000000..d9aaeb59 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/RequestLogMedicineController.php @@ -0,0 +1,136 @@ + 'Kolom :attribute wajib diisi.', + 'numeric' => 'Kolom :attribute harus berupa angka.', + ]; + + $validator = Validator::make($request->all(), [ + 'medicine' => 'required|array', + 'medicine.*' => 'required', + ], $customMessages); + + if ($validator->fails()) { + return Helper::responseJson([],'error', 400, $validator->errors()); + } else { + $medicine = $request->medicine; + + if (count($medicine)>0){ + // BeginTransaction + DB::beginTransaction(); + foreach($medicine as $key => $value){ + $data = [ + 'request_log_id' => $value['request_log_id'], + 'medicine' => $value['medicine_name'], + 'price' => $value['medicine_price'], + ]; + // Insert Data + try { + RequestLogMedicine::create($data); + } catch (\Throwable $th) { + DB::rollBack(); + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + } + DB::commit(); + return Helper::responseJson(status: 'success', statusCode: 201, message: 'success', data: $request->toArray()); + }; + + } + + + $requestLogMedicine = RequestLogMedicine::insert($data); + return $requestLogMedicine; + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('internal::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + $requestLogBenefit = requestLogBenefit::findOrFail($id); + $requestLogBenefit->amount_approved = $request->amount_approved; + $requestLogBenefit->amount_incurred = $request->amount_incurred; + $requestLogBenefit->amount_not_approved = $request->amount_not_approved; + $requestLogBenefit->excess_paid = $request->excess_paid; + $requestLogBenefit->keterangan = $request->keterangan; + + $requestLogBenefit->save(); + + return response()->json([ + 'error' => false, + 'message' => 'Update succses', + 'data' => $requestLogBenefit], + 200); + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + $RequestLogMedicine = RequestLogMedicine::findOrFail($id); + $RequestLogMedicine->delete(); + } + +} diff --git a/Modules/Internal/Http/Controllers/Api/ServiceController.php b/Modules/Internal/Http/Controllers/Api/ServiceController.php new file mode 100644 index 00000000..221b3fd9 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/ServiceController.php @@ -0,0 +1,86 @@ +get(); + + if (empty($service)) { + return response(['message' => 'Tidak ada data'], 404); + } else { + return response(['message' => 'Data ditemukan', "status" => 200, 'data' => $service]); + } + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + // + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('internal::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('internal::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } +} diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index d55c5f42..c97454bd 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -8,6 +8,9 @@ use Modules\Internal\Http\Controllers\Api\BenefitController; use Modules\Internal\Http\Controllers\Api\CityController; use Modules\Internal\Http\Controllers\Api\ClaimController; use Modules\Internal\Http\Controllers\Api\ClaimRequestController; +use Modules\Internal\Http\Controllers\Api\RequestLogController; +use Modules\Internal\Http\Controllers\Api\RequestLogBenefitController; +use Modules\Internal\Http\Controllers\Api\RequestLogMedicineController; use Modules\Internal\Http\Controllers\Api\CorporateBenefitController; use Modules\Internal\Http\Controllers\Api\CorporateController; use Modules\Internal\Http\Controllers\Api\CorporateFormulariumController; @@ -15,13 +18,16 @@ use Modules\Internal\Http\Controllers\Api\CorporateMemberController; use Modules\Internal\Http\Controllers\Api\CorporatePlanController; use Modules\Internal\Http\Controllers\Api\CorporateServiceController; use Modules\Internal\Http\Controllers\Api\DiagnosisController; +use Modules\Internal\Http\Controllers\Api\DiagnosisTemplateController; use Modules\Internal\Http\Controllers\Api\DiagnosisExclusionController; use Modules\Internal\Http\Controllers\Api\DistrictController; use Modules\Internal\Http\Controllers\Api\DivisionController; +use Modules\Internal\Http\Controllers\Api\HospitalController; use Modules\Internal\Http\Controllers\Api\DoctorController; use Modules\Internal\Http\Controllers\Api\DoctorRatingController; use Modules\Internal\Http\Controllers\Api\DrugController; use Modules\Internal\Http\Controllers\Api\FormulariumController; +use Modules\Internal\Http\Controllers\Api\FormulariumTemplateController; use Modules\Internal\Http\Controllers\Api\Linksehat\PaymentController; use Modules\Internal\Http\Controllers\Api\LivechatController; use Modules\Internal\Http\Controllers\Api\MemberController; @@ -29,10 +35,14 @@ use Modules\Internal\Http\Controllers\Api\OptionController; use Modules\Internal\Http\Controllers\Api\OrganizationController; use Modules\Internal\Http\Controllers\Api\PlanController; use Modules\Internal\Http\Controllers\Api\ProvinceController; +use Modules\Internal\Http\Controllers\Api\ServiceController; use Modules\Internal\Http\Controllers\Api\PrescriptionController; use Modules\Internal\Http\Controllers\Api\SpecialityController; use Modules\Internal\Http\Controllers\Api\VillageController; use Modules\Internal\Http\Controllers\Api\AuditTrailController; +use Modules\Internal\Http\Controllers\Api\DailyMonitoringController; +use Modules\Internal\Http\Controllers\Api\LaboratoriumResultController; +use Modules\Internal\Http\Controllers\Api\CorporateManageController; use Modules\Internal\Http\Controllers\ClaimEncounterController; /* @@ -69,6 +79,7 @@ Route::prefix('internal')->group(function () { Route::get('corporates/import-document-example/{document_type}', [CorporateController::class, 'importDocumentExample']); Route::put('corporates/{corporate_id}/activation', [CorporateController::class, 'activation']); Route::post('corporates/{corporate_id}/import-plan-benefit', [CorporateController::class, 'importPlanBenefit']); + Route::post('corporates/{corporate_id}/delete-import-plan-benefit', [CorporateController::class, 'deleteAllImportPlanBenefit']); Route::get('corporates/{corporate_id}/data-plan-benefit', [CorporateController::class, 'dataPlanBenefit']); Route::get('corporates/{corporate_id}/code', [CorporateController::class, 'corporateCode']); Route::get('corporates/{corporate_id}/payor_id', [CorporateController::class, 'corporatePayorId']); @@ -77,6 +88,7 @@ Route::prefix('internal')->group(function () { Route::post('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'store']); Route::get('corporates/{corporate_id}/corporate-plans/{id}/edit', [CorporatePlanController::class, 'edit']); Route::put('corporates/{corporate_id}/corporate-plans/{id}', [CorporatePlanController::class, 'update']); + Route::post('corporates/{corporate_id}/corporate-plans/filter', [CorporatePlanController::class, 'filter']); Route::put('plans/{plan_id}/activation', [CorporatePlanController::class, 'activation']); Route::get('corporates/{corporate_id}/plans', [PlanController::class, 'index']); @@ -96,14 +108,27 @@ Route::prefix('internal')->group(function () { Route::get('corporates/{corporate_id}/divisions/{id}/edit', [DivisionController::class, 'edit']); Route::put('corporates/{corporate_id}/divisions/{id}', [DivisionController::class, 'update']); + Route::get('corporates/{corporate_id}/hospitals', [HospitalController::class, 'index']); + Route::put('hospitals/{hospital_id}/activation', [HospitalController::class, 'activation']); + Route::get('corporates/{corporate_id}/hospitals/data', [HospitalController::class, 'dataHospital']); + Route::post('corporates/{corporate_id}/hospitals/save', [HospitalController::class, 'store']); + Route::put('corporates/{corporate_id}/hospitals/{id}/edit', [HospitalController::class, 'update']); + Route::get('corporates/hospitals/download-template', [HospitalController::class, 'downloadTemplate']); + Route::post('corporates/{corporate_id}/hospitals/import', [HospitalController::class, 'import']); + + Route::get('corporates/{corporate_id}/members', [CorporateMemberController::class, 'index']); Route::get('corporates/{corporate_id}/members/list', [CorporateMemberController::class, 'generateMemberList']); Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']); Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']); + Route::get('corporates/{corporate_id}/diagnosis', [DiagnosisExclusionController::class, 'listDiagnosis']); + Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']); + Route::get('corporates/{corporate_id}/diagnosis-exclusions/{id_exclusion}', [DiagnosisExclusionController::class, 'detilExclusion']); // By Bagaskoro, get detil exclusion Route::post('corporates/{corporate_id}/diagnosis-exclusions/store', [DiagnosisExclusionController::class, 'storeExclusion']); + Route::put('corporates/diagnosis-exclusions/update_activation', [DiagnosisExclusionController::class, 'updateActivation']); // By Bagaskoro, edit status aktif Route::delete('diagnosis-exclusions/{id}', [DiagnosisExclusionController::class, 'destroy']); Route::post('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']); @@ -112,23 +137,86 @@ Route::prefix('internal')->group(function () { Route::get('corporates/{corporate_id}/services/{service_code}', [CorporateServiceController::class, 'corporateServiceIndex']); Route::put('corporates/{corporate_id}/services/{service_code}', [CorporateServiceController::class, 'corporateServiceUpdate']); Route::post('corporates/{corporate_id}/services/{service_code}/specialities', [CorporateServiceController::class, 'corporateServiceSpecialityUpdate']); + Route::post('corporates/{corporate_id}/services/{service_code}/specialities-all', [CorporateServiceController::class, 'corporateServiceSpecialityAllUpdate']); Route::post('corporates/{corporate_id}/services/{service_code}/specialities/exclusion', [CorporateServiceController::class, 'storeExclusion']); Route::get('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'index']); + Route::get('corporates/{corporate_id}/formulariums/{formularium_id}', [CorporateFormulariumController::class, 'show']); + Route::get('corporates/{corporate_id}/formulariums-create', [CorporateFormulariumController::class, 'create']); + Route::post('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'store']); + Route::get('corporates/{corporate_id}/formulariums/list', [CorporateFormulariumController::class, 'generateFormulariumList']); + Route::post('corporates/{corporate_id}/formulariums/import', [CorporateFormulariumController::class, 'import']); + Route::put('corporates/{corporate_id}/formulariums-update-status/{id}', [CorporateFormulariumController::class, 'active']); Route::put('corporates/{corporate_id}/formulariums/{formularium_id}/{action}', [CorporateFormulariumController::class, 'updateStatus']); + + Route::controller(CorporateController::class)->group(function () { + Route::post('add-files-doc', 'addFilesDoc'); + Route::post('get-files-doc', 'getFilesDoc'); + Route::post('update-status-files-doc', 'updateStatusFilesDoc'); + }); + // Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']); // Route::get('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']); // Audittrail Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']); - Route::get('master/diagnosis', [DiagnosisController::class, 'index']); - Route::get('master/diagnosis/search', [DiagnosisController::class, 'search']); + Route::prefix('case_management')->group(function () { + Route::get('memberlist', [DailyMonitoringController::class, 'GetMemberList']); + Route::get('claimlist/{member_id}', [DailyMonitoringController::class, 'GetClaimList']); + + // Daily Monitoring + Route::prefix('daily_monitoring')->group(function () { + Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']); + Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']); + }); + + // Laboratorium Result + Route::prefix('laboratorium_result')->group(function () { + Route::get('detail/{claim_code}/list', [LaboratoriumResultController::class, 'GetDetailLabResultList']); + Route::post('detail/{claim_code}/add', [LaboratoriumResultController::class, 'AddDetailLabResultList']); + }); + }); + + Route::prefix('user_management')->group(function () { + Route::get('/', [CorporateManageController::class, 'index']); + Route::post('/', [CorporateManageController::class, 'store']); + Route::post('/{id}', [CorporateManageController::class, 'update']); + Route::post('/delete/{id}', [CorporateManageController::class, 'destroy']); + }); + + + Route::get('master/diagnosis-template', [DiagnosisTemplateController::class, 'index']); + Route::get('master/diagnosis-template/search', [DiagnosisTemplateController::class, 'search']); + Route::post('master/diagnosis-template/store', [DiagnosisTemplateController::class, 'store']); + Route::put('master/diagnosis-template/{id}/activation', [DiagnosisTemplateController::class, 'activation']); + Route::get('master/diagnosis-template/{id}/edit', [DiagnosisTemplateController::class, 'edit']); + Route::put('master/diagnosis-template/{id}/update', [DiagnosisTemplateController::class, 'update']); + + Route::get('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'index']); + Route::post('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'store']); + Route::post('master/formulariums/{formulariums_template_id}/import', [FormulariumController::class, 'import']); + Route::get('master/formulariums/{formulariums_template_id}/list', [FormulariumController::class, 'generateFormulariumList']); + + Route::get('master/formularium-template', [FormulariumTemplateController::class, 'index']); + Route::get('master/formularium-template/search', [FormulariumTemplateController::class, 'search']); + Route::post('master/formularium-template/store', [FormulariumTemplateController::class, 'store']); + Route::put('master/formularium-template/{id}/activation', [FormulariumTemplateController::class, 'activation']); + Route::get('master/formularium-template/{id}/edit', [FormulariumTemplateController::class, 'edit']); + Route::put('master/formularium-template/{id}/update', [FormulariumTemplateController::class, 'update']); + + Route::get('master/diagnosis/{diagnosis_template_id}', [DiagnosisController::class, 'index']); + Route::get('master/diagnosis/{diagnosis_template_id}/search', [DiagnosisController::class, 'search']); + Route::post('master/diagnosis/{diagnosis_template_id}/import', [DiagnosisController::class, 'import']); + Route::get('master/diagnosis/{diagnosis_template_id}/list', [DiagnosisController::class, 'generateIcdList']); + Route::put('master/diagnosis/{diagnosis_template_id}/activation', [DiagnosisController::class, 'activation']); + Route::get('master/drugs', [DrugController::class, 'index']); - Route::get('master/formulariums', [FormulariumController::class, 'index']); - Route::post('master/formulariums', [FormulariumController::class, 'store']); - Route::post('master/formulariums/import', [FormulariumController::class, 'import']); + Route::put('master/drugs/{drug_id}/activation', [DrugController::class, 'activation']); + Route::get('master/drugs/download-template', [DrugController::class, 'downloadTemplate']); + Route::post('master/drugs/import', [DrugController::class, 'import']); + Route::get('members', [MemberController::class, 'index']); Route::get('members/{member_id}/benefits', [MemberController::class, 'benefits']); @@ -143,11 +231,45 @@ Route::prefix('internal')->group(function () { Route::post('claims/{id}/decline', [ClaimController::class, 'decline'])->name('claim.decline'); Route::post('claims/{id}/approve', [ClaimController::class, 'approve'])->name('claim.approve'); Route::post('claims/{id}/re-open', [ClaimController::class, 'reOpen'])->name('claim.re-open'); + + Route::post('claims/{id}/carehistory', [ClaimController::class, 'storeHistoryCare']); + Route::post('claims/carehistory/{id}/update', [ClaimController::class, 'updateHistoryCare']); + Route::get('claims/carehistory/{id}', [ClaimController::class, 'showHistoryCare']); + Route::post('claims/carehistory/approval', [ClaimController::class, 'approvalHistoryCare']); + Route::post('claims', [ClaimController::class, 'store']); Route::get('claims/{id}', [ClaimController::class, 'show']); + Route::put('claims/{id}', [ClaimController::class, 'update']); + Route::get('claims/{id}/edit', [ClaimController::class, 'edit']); Route::post('check-limit', [ClaimController::class, 'checkLimit']); Route::get('claims/1/data-claim', [ClaimController::class, 'dataClaimReport']); + Route::get('claims/detail/{id}', [ClaimController::class, 'getDetailClaims']); + Route::post('claims/request-documents', [ClaimController::class, 'requestDocuments']); + Route::get('claims/get-services/{id}', [ClaimController::class, 'getServices']); + Route::post('claims/save-services', [ClaimController::class, 'saveServices']); + Route::get('claims/{id}/benefit-configuration', [ClaimController::class, 'getBenefitConfiguration']); // Bagaskoro, BSD 03 November 2023 + Route::put('claims/benefit-configuration/edit/{id}', [ClaimController::class, 'editBenefitConfiguration']); // Bagaskoro, BSD 03 November 2023 + Route::get('customer-service/request', [RequestLogController::class, 'index']); + Route::post('customer-service/request', [RequestLogController::class, 'createNew']); + Route::put('customer-service/request/{id}', [RequestLogController::class, 'update']); + Route::get('customer-service/request/{id}', [RequestLogController::class, 'show']); + Route::get('customer-service/request/{id}/download', [RequestLogController::class, 'generateRequestLog']); + Route::post('customer-service/request/import', [RequestLogController::class, 'importRequestLog']); + Route::get('customer-service/request/data', [RequestLogController::class, 'generateDataRequestLogExcel']); + + Route::post('customer-service/request/final-log', [RequestLogController::class, 'updateFinalLog']); + + // insert benefit + Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']); + Route::delete('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'destroy']); + Route::put('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'update']); + + // insert medicine + Route::post('customer-service/request/medicine-data', [RequestLogMedicineController::class, 'store']); + Route::delete('customer-service/request/medicine-data/{id}', [RequestLogMedicineController::class, 'destroy']); + Route::put('customer-service/request/medicine-data/{id}', [RequestLogMedicineController::class, 'update']); + Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']); Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']); Route::resource('organizations', OrganizationController::class); @@ -165,12 +287,26 @@ Route::prefix('internal')->group(function () { Route::controller(ClaimRequestController::class)->group(function () { Route::post('files-mcu', 'filesMcu'); }); + + Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index'); + Route::get('claim-requests/list-member', [ClaimRequestController::class, 'getClaimMemberInfiniteScroll']); // Bagaskoro, BSD 31 Oktober 2023 Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve'); Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); + Route::post('claim-requests', [ClaimRequestController::class, 'createNew']); // Bagaskoro, BSD 2 November 2023 + Route::put('claim-requests/{id}', [ClaimRequestController::class, 'update'])->name('claim-requests.update'); + Route::post('claim-requests/import', [ClaimRequestController::class, 'importClaim'])->name('claim-requests.importClaim'); + Route::get('claim-requests/detail/{id}', [ClaimRequestController::class, 'claimRequestDetail']); + Route::post('claim-requests/{id}/invoice-files', [ClaimRequestController::class, 'invoiceFiles']); + Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']); + + Route::get('claim-requests/service/{id}', [ClaimRequestController::class, 'getServiceMember']); + + }); Route::get('province', [ProvinceController::class, 'index']); + Route::get('service', [ServiceController::class, 'index']); Route::get('city', [CityController::class, 'index']); Route::get('district', [DistrictController::class, 'index']); Route::get('village', [VillageController::class, 'index']); diff --git a/Modules/Internal/Services/CorporateService.php b/Modules/Internal/Services/CorporateService.php index 8bc6b4b1..75bd80c8 100644 --- a/Modules/Internal/Services/CorporateService.php +++ b/Modules/Internal/Services/CorporateService.php @@ -237,7 +237,6 @@ class CorporateService ->where('corporate_plan_id', $benefit_data['plan_code']) ->first(); $benefit_data['plan_code'] = $plan->id; - $benefit = Benefit::updateOrCreate([ 'code' => $benefit_data['code'], 'service_code' => $plan->service_code, diff --git a/Modules/Internal/Services/ExclusionService.php b/Modules/Internal/Services/ExclusionService.php index e0f875d4..524850fb 100644 --- a/Modules/Internal/Services/ExclusionService.php +++ b/Modules/Internal/Services/ExclusionService.php @@ -6,6 +6,7 @@ use App\Exceptions\ImportRowException; use App\Models\Benefit; use App\Models\Corporate; use App\Models\Icd; +use App\Models\Exclusion; use App\Models\Plan; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; @@ -21,15 +22,13 @@ class ExclusionService public function handleDiagnosisExclusionRow(Corporate $corporate, $row) { try { - $this->validateDiagnosisExclusionRow($row); - if (!empty($row['ip_exclusion'])) { $excl_array = explode('|', $row['ip_exclusion']); if ($excl_array[0] == '3') { $icd = Icd::where('code', $row['code'])->first(); $exclusion = $icd->exclusions()->create([ 'corporate_id' => $corporate->id, - 'service_code' => 'OP', + 'service_code' => 'IP', 'type' => 'diagnosis' ]); @@ -89,7 +88,8 @@ class ExclusionService $exclusion = $icd->exclusions()->create([ 'corporate_id' => $corporate->id, 'service_code' => 'OP', - 'type' => 'diagnosis' + 'type' => 'diagnosis', + 'active' => 1 ]); if (!empty($excl_array[1])) { //msc @@ -130,11 +130,35 @@ class ExclusionService ]); } if (!empty($excl_array[5])) { //plans - $exclusion->rules()->create([ - 'name' => 'plan', - 'values' => $excl_array[5] - ]); + $codePlan = explode(',', $excl_array[5]); + collect($codePlan)->each(function ($codePlan) use ($corporate, $exclusion) { + $isCodeplan = Plan::where(['code' => $codePlan, 'corporate_id' => $corporate->id])->first(); + if (!$isCodeplan) { + throw new ImportRowException(__('codePlan.NOT_FOUND'), 0, NULL, $codePlan); + } + + $exclusion->rules()->create([ + 'name' => 'plan', + 'values' => $codePlan + ]); + }); } + } else if (!$excl_array[0]){ + $icd = Icd::where(['code' => $row['code']])->first(); + if (!$icd) { + throw new ImportRowException(__('icd.NOT_FOUND'), 0, NULL, $row); + } + // Cari entitas Exclusion yang sesuai dengan kriteria tertentu + $exclusion = Exclusion::where([ + 'corporate_id' => $corporate->id, + 'exclusionable_id' => $icd->id, + ])->first(); + + // Jika entitas ditemukan, perbarui nilai 'active' menjadi 0 + if ($exclusion) { + $exclusion->update(['active' => 0]); + } + } } @@ -144,7 +168,7 @@ class ExclusionService $icd = Icd::where('code', $row['code'])->first(); $exclusion = $icd->exclusions()->create([ 'corporate_id' => $corporate->id, - 'service_code' => 'OP', + 'service_code' => 'DE', 'type' => 'diagnosis' ]); @@ -196,7 +220,6 @@ class ExclusionService if (!empty($row['ma_exclusion'])) { $excl_array = explode('|', $row['ma_exclusion']); - dd($excl_array); if ($excl_array[0]) { } } diff --git a/Modules/Internal/Services/FormulariumService.php b/Modules/Internal/Services/FormulariumService.php index 7eb67acf..1d7e9a58 100644 --- a/Modules/Internal/Services/FormulariumService.php +++ b/Modules/Internal/Services/FormulariumService.php @@ -7,10 +7,11 @@ use App\Models\Benefit; use App\Models\Corporate; use App\Models\Drug; use App\Models\Formularium; +use App\Models\CorporateFormularium; use App\Models\Plan; use Box\Spout\Writer\Common\Creator\WriterEntityFactory; -class CorporateService +class FormulariumService { protected function validateFormulariumRow($row) { @@ -45,4 +46,75 @@ class CorporateService throw $e; } } + + public function handleFormuariumTemplateRow($row, $id) + { + try { + $formularium = Formularium::updateOrCreate( + [ + 'code' => $row['code'], + 'formularium_template_id' => $id + ], + [ + 'code' => $row['code'], + 'name' => $row['name'], + 'description' => $row['description'], + 'manufacturer' => $row['manufacturer'], + 'category_name' => $row['category_name'], + 'kategori_obat' => $row['kategori_obat'], + 'uom' => $row['uom'], + 'composition' => $row['composition'], + 'general_indication' => $row['general_indication'], + 'atc_code' => $row['atc_code'], + 'class' => $row['class'], + 'bpom_registration' => $row['bpom_registration'], + 'classifications' => $row['classifications'], + 'cat_for' => $row['cat_for'], + 'formularium_template_id' => $id, + ]); + + return $formularium; + } catch (\Exception $e) { + throw $e; + } + } + + public function handleFormuariumCorporateRow($row, $id) + { + try { + $formularium = CorporateFormularium::updateOrCreate( + [ + 'formularium_id' => $row['formularium_id'], + 'corporate_id' => $id + ], + [ + 'formularium_id' => $row['formularium_id'], + 'corporate_id' => $id, + 'active' => $row['active'] + ]); + + return $formularium; + } catch (\Exception $e) { + throw $e; + } + } + + public $listing_doc_headers = [ + "Internal Code", + "Name", + "Description", + "Manufacturer", + "Category Name", + "Kategori Obat", + "UOM", + "Composition", + "General Indication", + "ATC Code", + "Class", + "BPOM Registration", + "Classifications", + "Cat For (O = obat, VS = Vitamin Suplemen, H=herbal, M=makanan, etc) ", + ]; + + } diff --git a/Modules/Internal/Services/IcdService.php b/Modules/Internal/Services/IcdService.php new file mode 100644 index 00000000..ce668a4b --- /dev/null +++ b/Modules/Internal/Services/IcdService.php @@ -0,0 +1,53 @@ +validateDiagnosisExclusionRow($row); + $icd = Icd::updateOrCreate([ + 'code' => $row['ICD_Code'] + ], [ + "code" => $row['ICD_Code'], + "parent_code" => null, + "rev" => '', + "name" => $row['Description'] ?? null, + "version" => null, + "active" => 1, + "icd_template_id" => $id, + ]); + + return true; + } catch (\Exception $e) { + throw $e; + } + } + + public $listing_doc_headers = [ + // "Rev", + // "Version", + "Code", + // "Parent Code", + // "Name", + "Description", + // "Status", + // "Type" + ]; +} diff --git a/Modules/Internal/Services/MemberEnrollmentService.php b/Modules/Internal/Services/MemberEnrollmentService.php index 60fd8516..84227525 100644 --- a/Modules/Internal/Services/MemberEnrollmentService.php +++ b/Modules/Internal/Services/MemberEnrollmentService.php @@ -326,6 +326,7 @@ class MemberEnrollmentService public function __construct(Member $member) { + app()->setLocale('en'); $this->member = $member; } @@ -580,6 +581,7 @@ class MemberEnrollmentService "telephone_mobile" => $row['telephone_mobile'] ?? null, "telephone_res" => $row['telephone_res'] ?? null, "telephone_office" => $row['telephone_office'] ?? null, + "suspended" => $row['member_suspended'] ?? null, ]; // $this->validateRow($row); if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->code != $row['policy_number']) { @@ -731,12 +733,25 @@ class MemberEnrollmentService // Validate If Plan Exist // TODO validate corporate plan - $plan = Plan::query() - ->where('code', $row['plan_id']) - ->where('corporate_id', $corporate->id) - ->first(); - if (!$plan) { - throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); + $plans = explode(",",$row['plan_id']); + if (count($plans) > 0) { + foreach($plans as $d){ + $plan = Plan::query() + ->where('code', $d) + ->where('corporate_id', $corporate->id) + ->first(); + if (!$plan) { + throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); + } + } + } else { + $plan = Plan::query() + ->where('code', $row['plan_id']) + ->where('corporate_id', $corporate->id) + ->first(); + if (!$plan) { + throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); + } } try { @@ -787,12 +802,40 @@ class MemberEnrollmentService 'status' => $row['employment_status'] ]); // Bisa disini penyebab data dobel - $member->memberPlans()->create([ - 'plan_id' => $plan->id, - 'status' => 'active', - 'start' => $this->dateParser($row['member_effective_date']), - 'end' => $this->dateParser($row['member_expiry_date']), - ]); + + $plans = explode(",",$row['plan_id']); + if (count($plans) > 0) { + foreach($plans as $d){ + $plan = Plan::query() + ->where('code', $d) + ->where('corporate_id', $corporate->id) + ->first(); + if (!$plan) { + throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); + } + $member->memberPlans()->create([ + 'plan_id' => $plan->id, + 'status' => 'active', + 'start' => $this->dateParser($row['member_effective_date']), + 'end' => $this->dateParser($row['member_expiry_date']), + ]); + } + } else { + $plan = Plan::query() + ->where('code', $row['plan_id']) + ->where('corporate_id', $corporate->id) + ->first(); + if (!$plan) { + throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); + } + $member->memberPlans()->create([ + 'plan_id' => $plan->id, + 'status' => 'active', + 'start' => $this->dateParser($row['member_effective_date']), + 'end' => $this->dateParser($row['member_expiry_date']), + ]); + } + } DB::commit(); } catch (\Exception $e) { @@ -834,7 +877,6 @@ class MemberEnrollmentService $member->person_id = $person->id; $member->save(); try { - $memberPolicy = MemberPolicy::query() ->where('policy_id', $row['policy_number']) ->where('member_id', $row['member_id']) @@ -852,17 +894,63 @@ class MemberEnrollmentService $memberPlan->save(); } - // Pengecekan jika ada perubahan di plan - $plan = Plan::query() - ->where('code', $row['plan_id']) - ->first(); - if ($plan){ - $memberPlan = MemberPlan::query() - ->where('member_id', $member->id) - ->first(); - $memberPlan->plan_id = $plan->id; - $memberPlan->save(); - } + // // Pengecekan jika ada perubahan di plan + // $plan = Plan::query() + // ->where('code', $row['plan_id']) + // ->first(); + // if ($plan){ + // $memberPlan = MemberPlan::query() + // ->where('member_id', $member->id) + // ->first(); + // $memberPlan->plan_id = $plan->id; + // $memberPlan->save(); + // } + + // Update plan + // $plans = explode(",",$row['plan_id']); + // if (count($plans) > 0) { + // foreach($plans as $d){ + // $plan = Plan::query() + // ->where('code', $d) + // ->where('corporate_id', $corporate->id) + // ->first(); + // if (!$plan) { + // throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); + // } + // $member->memberPlans()->updateOrCreate([ + // 'member_id' => $member->id, + // 'plan_id' => $plan->id, + // ], + // [ + // 'plan_id' => $plan->id, + // 'status' => 'active', + // 'start' => $this->dateParser($row['member_effective_date']), + // 'end' => $this->dateParser($row['member_expiry_date']), + // ]); + // } + // } else { + // $plan = Plan::query() + // ->where('code', $row['plan_id']) + // ->where('corporate_id', $corporate->id) + // ->first(); + // if (!$plan) { + // throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row); + // } + // $member->memberPlans()->updateOrCreate([ + // 'member_id' => $member->id, + // 'plan_id' => $plan->id, + // ], + // [ + // 'plan_id' => $plan->id, + // 'status' => 'active', + // 'start' => $this->dateParser($row['member_effective_date']), + // 'end' => $this->dateParser($row['member_expiry_date']), + // ]); + // } + + + // end update plan + // Update jika ada perubahaan di ASO maka akan teriflek ke LMS juga\ $userInsuranceLms = UserInsurance::query() ->where('sNoPolis', $row['member_id']) diff --git a/Modules/Internal/Transformers/ClaimEditResource.php b/Modules/Internal/Transformers/ClaimEditResource.php new file mode 100644 index 00000000..b31f952c --- /dev/null +++ b/Modules/Internal/Transformers/ClaimEditResource.php @@ -0,0 +1,36 @@ +with(['icd'])->get()->toArray(); + + $data = [ + 'id' => $claim['id'], + 'service_code' => $claim['service_code'], + 'admission_date' => $claim['admission_date'], + 'discharge_date' => $claim['discharge_date'], + 'claim_id' => $claim['claim_id'], + 'organization_id' => $claim['organization_id'], + 'organization_name' => $claim['organization'] ? $claim['organization']['name'] : '-', + 'practitioner_id' => $claim['practitioner_id'], + 'practitioner_name' => $claim['practitioner'] ? $claim['practitioner']['person']['name'] : '-', + 'medical_record_number' => $claim['medical_record_number'], + 'symptoms' => $claim['symptoms'], + 'sign' => $claim['sign'], + 'main_diagnosis_id' => $claim['main_diagnosis_id'], + 'main_diagnosis_name' => $claim['icd'] ? $claim['icd']['name'] : '-', + 'status' => $claim['status'], + 'secondary_diagnosis' => $secondaryDiagnosis, + ]; + + return $data; + } +} diff --git a/Modules/Internal/Transformers/ClaimRequestResource.php b/Modules/Internal/Transformers/ClaimRequestResource.php index c173dc79..c4b1c49f 100644 --- a/Modules/Internal/Transformers/ClaimRequestResource.php +++ b/Modules/Internal/Transformers/ClaimRequestResource.php @@ -3,6 +3,7 @@ namespace Modules\Internal\Transformers; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Str; class ClaimRequestResource extends JsonResource { @@ -15,7 +16,7 @@ class ClaimRequestResource extends JsonResource public function toArray($request) { $filesGroupByType = $this->files->mapToGroups(function($file) { - return [$file->type => $file]; + return [Str::slug($file->type, '_') => $file]; }); $data = [ diff --git a/Modules/Internal/Transformers/ClaimShowResource.php b/Modules/Internal/Transformers/ClaimShowResource.php index e4375c24..45dff8f4 100644 --- a/Modules/Internal/Transformers/ClaimShowResource.php +++ b/Modules/Internal/Transformers/ClaimShowResource.php @@ -3,6 +3,9 @@ namespace Modules\Internal\Transformers; use App\Models\Benefit; +use App\Models\CorporateEmployee; +use App\Models\ClaimRequest; +use App\Models\Icd; use Illuminate\Http\Resources\Json\JsonResource; class ClaimShowResource extends JsonResource @@ -15,34 +18,55 @@ class ClaimShowResource extends JsonResource */ public function toArray($request) { - $data = parent::toArray($request); - // $data[''] - $data['benefit_items'] = $this->items - ->filter(function ($item) { - return $item->claim_itemable_type == Benefit::class; - }) - ->map(function ($item) { - $itemData = $item->claim_itemable->toArray(); - $itemData['nominal_dicover'] = $item['nominal_dicover'] ?? 0; - $itemData['nominal_ditagihkan'] = $item['nominal_ditagihkan'] ?? 0; - $itemData['nominal_total'] = $item['nominal_total'] ?? 0; - - // For React Frotnend - $itemData['biaya_diajukan'] = $itemData['nominal_ditagihkan']; - $itemData['biaya_disetujui'] = $itemData['nominal_dicover']; + $claim = parent::toArray($request); - return $itemData; - }); + $member_data = CorporateEmployee::where('member_id', $claim['member_id'])->first(); + $claim_request = ClaimRequest::where('id', $claim['claim_request_id'])->first(); - $data['primary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'primary';})->values(); - $data['secondary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'secondary';})->values(); - - $data['encounters'] = $this->encounters->map(function($encounter) { - $encounterData = EncounterResource::make($encounter); - return $encounterData; - }); - - // $memberDiagnosisHistories = $this->member-> + $data = [ + 'id' => $claim['id'], + 'uuid' => $claim['uuid'], + 'code' => $claim['code'], + 'claim_request_id' => $claim['claim_request_id'], + 'member_id' => $claim['member_id'], + 'currency' => $claim['currency'], + 'total_claim' => $claim['total_claim'], + 'plan_id' => $claim['plan_id'], + 'benefit_id' => $claim['benefit_id'], + 'organization_id' => $claim['organization_id'], + 'benefit_code' => $claim['benefit_code'], + 'benefit_desc' => $claim['benefit_desc'], + 'amount_incurred' => $claim['amount_incurred'], + 'amount_approved' => $claim['amount_approved'], + 'amount_not_approved' => $claim['amount_not_approved'], + 'excess_paid' => $claim['excess_paid'], + 'final_encounter_id' => $claim['final_encounter_id'], + 'status' => $claim['status'], + 'created_at' => $claim['created_at'], + 'corporate_id' => $member_data->corporate_id, + 'service_code' => $claim_request->service_code + // "uuid" => "9a59bff7-857f-4e48-8c6b-242ad1286395" + // "" => "CLM-00035" + // "" => 66 + // "member_id" => 3 + // "" => "IDR" + // "" => null + // "" => 1 + // "" => null + // "" => 0 + // "benefit_code" => "" + // "benefit_desc" => "erwraf" + // "" => 10000 + // "" => 123000 + // "amount_not_approved" => 122000 + // "excess_paid" => 230000 + // "final_encounter_id" => null + // "status" => "received" + // "created_at" => "2023-10-12T09:23:54.000000Z" + ]; + // $data['benefit_items'] = $this->items + $data['history_hospital_care'] = $claim['history_hospital_care']; + // $data['main_diagnosis'] return $data; } diff --git a/Modules/Internal/Transformers/CorporateFormulariumResource.php b/Modules/Internal/Transformers/CorporateFormulariumResource.php index ecaf2fac..9839b5d6 100644 --- a/Modules/Internal/Transformers/CorporateFormulariumResource.php +++ b/Modules/Internal/Transformers/CorporateFormulariumResource.php @@ -16,11 +16,10 @@ class CorporateFormulariumResource extends JsonResource { return [ 'id' => $this->id, - 'code' => $this->code, - 'name' => $this->name, - 'items_count' => $this->items_count, - 'status' => $this->corporateFormulariums->count() ? 'active' : 'inactive', - 'corporate_formulariums' => $this->coporateFormulariums, + 'formulaurium_category_id' => $this->formularium_template->id, + 'category' => $this->formularium_template->name, + 'description' => $this->formularium_template->description, + 'active' => $this->active == 1 ? 'Active' : 'Inactive', ]; } } diff --git a/Modules/Internal/Transformers/CorporateManageResource.php b/Modules/Internal/Transformers/CorporateManageResource.php new file mode 100644 index 00000000..4687c90b --- /dev/null +++ b/Modules/Internal/Transformers/CorporateManageResource.php @@ -0,0 +1,29 @@ + 0){ + $temp = []; + foreach($this as $d){ + dd($d); + // $temp['user'] = [] + } + // } + + return $data; + } +} diff --git a/Modules/Internal/Transformers/CorporateServiceConfigResource.php b/Modules/Internal/Transformers/CorporateServiceConfigResource.php index a9d9589b..1ea2c8e7 100644 --- a/Modules/Internal/Transformers/CorporateServiceConfigResource.php +++ b/Modules/Internal/Transformers/CorporateServiceConfigResource.php @@ -41,38 +41,97 @@ class CorporateServiceConfigResource extends JsonResource ]; $list_msc = $this->corporateServiceSpecialities->map(function ($speciality) { - return explode(',', $speciality->exclusions->first()->rules->where('name', 'msc')->first()->values ?? ''); - })->map(function ($item) { + $exclusions = $speciality->exclusions->first(); + + if ($exclusions) { + $rules = $exclusions->rules->where('name', 'msc')->first(); + + if ($rules) { + $values = $rules->values ?? ''; + $item = explode(',', $values); + } else { + // Handle case where 'rules' with name 'msc' is not found + $item = []; + } + } else { + // Handle case where 'exclusions' is not found + $item = []; + } + return [ 'm' => in_array('m', $item), 's' => in_array('s', $item), 'c' => in_array('c', $item), ]; }); - + $list_gender = $this->corporateServiceSpecialities->map(function ($speciality) { - // dd($speciality->exclusions->first()->rules); - return explode(',', $speciality->exclusions->first()->rules->where('name', 'gender')->first()->values ?? ''); - })->map(function ($item) { - + $exclusions = $speciality->exclusions->first(); + + if ($exclusions) { + $rules = $exclusions->rules->where('name', 'gender')->first(); + + if ($rules) { + $values = $rules->values ?? ''; + $item = explode(',', $values); + } else { + // Handle case where 'rules' with name 'gender' is not found + $item = []; + } + } else { + // Handle case where 'exclusions' is not found + $item = []; + } + return [ 'male' => in_array('male', $item), 'female' => in_array('female', $item), ]; }); + $min_age = $this->corporateServiceSpecialities->map(function ($speciality) { - return $speciality->exclusions->first()->rules->where('name', 'min_age')->first()->values ?? ''; + $exclusions = $speciality->exclusions->first(); + + if ($exclusions) { + $rules = $exclusions->rules->where('name', 'min_age')->first(); + + if ($rules) { + return $rules->values ?? ''; + } + } + + return ''; }); - + $max_age = $this->corporateServiceSpecialities->map(function ($speciality) { - return $speciality->exclusions->first()->rules->where('name', 'max_age')->first()->values ?? ''; + $exclusions = $speciality->exclusions->first(); + + if ($exclusions) { + $rules = $exclusions->rules->where('name', 'max_age')->first(); + + if ($rules) { + return $rules->values ?? ''; + } + } + + return ''; }); - + $plan = $this->corporateServiceSpecialities->map(function ($speciality) { - return $speciality->exclusions->first()->rules->where('name', 'plan')->first()->values ?? null; + $exclusions = $speciality->exclusions->first(); + + if ($exclusions) { + $rules = $exclusions->rules->where('name', 'plan')->first(); + + if ($rules) { + return $rules->values ?? null; + } + } + + return null; }); - + $data['exclusions'] = $data['exclusions']->map(function ($item, $key) use ( $list_msc, $list_gender, diff --git a/Modules/Internal/Transformers/DiagnosisExclusionResource.php b/Modules/Internal/Transformers/DiagnosisExclusionResource.php index 5ecc8267..63d92fc9 100644 --- a/Modules/Internal/Transformers/DiagnosisExclusionResource.php +++ b/Modules/Internal/Transformers/DiagnosisExclusionResource.php @@ -21,6 +21,7 @@ class DiagnosisExclusionResource extends JsonResource 'diagnosis_type' => $this->exclusionable->type, 'service_code' => $this->service_code, 'type' => $this->type, + 'active' => $this->active, 'rules' => $this->rules->mapToGroups(function ($item, $key) { return [$item['name'] => $item['values']]; }) diff --git a/Modules/Internal/Transformers/RequestLogResource.php b/Modules/Internal/Transformers/RequestLogResource.php new file mode 100644 index 00000000..06b43fa2 --- /dev/null +++ b/Modules/Internal/Transformers/RequestLogResource.php @@ -0,0 +1,37 @@ +files->mapToGroups(function($file) { + return [Str::slug($file->type, '_') => $file]; + }); + + $data = [ + 'id' => $this->id, + 'code' => $this->code, + 'submission_date' => $this->submission_date, + 'member_name' => $this->member->name, + 'status' => $this->status ?? 'unknown', + 'status_final_log' => $this->status_final_log ?? 'unknown', + 'service_name' => $this->service ? $this->service->name : '', + 'payment_type' => $this->payment_type, + 'payment_type_name' => $this->payment_type_name, + 'files_by_type' => $filesGroupByType + ]; + + return $data; + } +} diff --git a/Modules/Internal/Transformers/RequestLogShowResource.php b/Modules/Internal/Transformers/RequestLogShowResource.php new file mode 100644 index 00000000..480eb3f1 --- /dev/null +++ b/Modules/Internal/Transformers/RequestLogShowResource.php @@ -0,0 +1,93 @@ +where('plan_id', $corporateId)->get()->toArray(); + $benefitDetailLog = RequestLogBenefit::with('benefit')->where('request_log_id', $requestLog['id'])->get()->toArray(); + $medicineDetailLog = RequestLogMedicine::where('request_log_id', $requestLog['id'])->get()->toArray(); + $benefitData = []; + if (count($benefit)){ + foreach($benefit as $data){ + array_push($benefitData, $data['benefit']); + } + } + + // Medicine + $medicineData = []; + if (count($medicineDetailLog)){ + foreach($medicineDetailLog as $data){ + array_push($medicineData, $data); + } + } + // Service Rule + $corporateService = CorporateService::query() + ->where('corporate_id', $corporateId) + ->where('service_code', $requestLog['service_code']) + ->with(['configs']) + ->first(); + $config = []; + if ($corporateService) { + $config = $corporateService->configs->pluck('value', 'name')->toArray(); + } + + // Exclusion Service or diagnosis + $exclusions = Exclusion::query() + ->where('corporate_id', $corporateId) + ->where('type', 'diagnosis') + ->with(['exclusionable', 'rules']) + ->get()->toArray(); + + $data = [ + 'id' => $requestLog['id'], + 'code' => $requestLog['code'], + 'member_id' => $requestLog['member']['member_id'], + 'policy_number' => $requestLog['member']['current_policy']['code'], + 'name' => $requestLog['member']['name'], + 'date_of_birth' => $requestLog['member']['birth_date'], + 'gender' => $requestLog['member']['gender'], + 'marital_status' => Helper::maritalNormalization($requestLog['member']['marital_status']), + 'member_type' => Helper::memberType($requestLog['member']['record_type']), + 'principal_id' => $requestLog['member']['principal_id'] ? $requestLog['member']['principal_id'] : '-', + 'principal_name' => $requestLog['member']['principal_id'] ? Helper::principalName($requestLog['member']['principal_id']) : '-', + 'relation_with_principal' => Helper::relationWithPrincipal($requestLog['member']['relation_with_principal']), + 'submission_date' => $requestLog['submission_date'], + 'service_type' => Helper::serviceName($requestLog['service_code']), + 'claim_method' => $requestLog['payment_type'], + 'status' => $requestLog['status'], + 'status_final_log' => $requestLog['status_final_log'], + 'benefit' => $benefitData, + 'benefit_data' => $benefitDetailLog, + 'config_service' => $config, + 'exclusion' => $exclusions, + 'medicine' => $medicineData, + 'files' => $requestLog['files'], + + + ]; + + return $data; + } +} diff --git a/Modules/Linksehat/Http/Controllers/Api/AuthController.php b/Modules/Linksehat/Http/Controllers/Api/AuthController.php index bfa9ad5f..8d5a0d30 100644 --- a/Modules/Linksehat/Http/Controllers/Api/AuthController.php +++ b/Modules/Linksehat/Http/Controllers/Api/AuthController.php @@ -5,126 +5,172 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Person; -use App\Models\User; +use App\Models\OLDLMS\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Laravel\Socialite\Facades\Socialite; -use Modules\Linksehat\Transformers\UserProfileResource; +use Modules\Linksehat\Transformers\User\UserProfileResource; use Symfony\Component\HttpFoundation\Response; +use Illuminate\Support\Facades\Http; use Validator; class AuthController extends Controller { - public function otpRequest(Request $request) - { - $request->validate([ - // 'phone' => 'required' - 'phone_or_email' => 'required' - ]); + private $url; - if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) { - $user = User::updateOrCreate([ - 'email' => $request->phone_or_email - ], [ - 'email' => $request->phone_or_email, - 'otp' => rand(1000, 9999), - 'otp_created_at' => now() - ]); - - $person = Person::query()->create([ - 'owner_user_id' => $user->id, - 'email' => $request->phone_or_email, - 'created_by' => $user->id, - ]); - - User::query()->find($user->id)->update([ - 'person_id' => $person->id - ]); - } else { - $user = User::updateOrCreate([ - 'phone' => $request->phone_or_email - ], [ - 'phone' => $request->phone_or_email, - 'otp' => rand(1000, 9999), - 'otp_created_at' => now() - ]); - - $person = Person::query()->create([ - 'owner_user_id' => $user->id, - 'phone' => $request->phone_or_email, - 'created_by' => $user->id, - ]); - - User::query()->find($user->id)->update([ - 'person_id' => $person->id - ]); - } - - if (!$user) { - $message = filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? "User dengan alamat email " . $request->phone_or_email . " tidak ditemukan" : "User dengan nomor telepon " . $request->phone_or_email . " tidak ditemukan"; - - return Helper::responseJson(statusCode: Response::HTTP_NOT_FOUND, message: $message); - } - - // TODO Send the OTP - if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) { - // Send Email - } else { - // Send Whatsapp - } - - return Helper::responseJson(message: 'OTP Terkirim'); + public function __construct() { + $this->url = $_ENV['LMS_APP_URL']; } public function login(Request $request) - { + { $request->validate([ // 'email' => 'email', - // 'password' => 'required_with:email', + 'phone_or_email' => 'required', // 'phone' => '', // 'otp' => 'required_with:phone', - 'phone_or_email' => 'required', - 'otp' => 'required' + 'password' => 'required', + // 'otp' => 'required' ]); - $loginType = filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? 'email' : 'phone'; + // Login hit ke API linksehat, karena encrypt nya pake CI + $response = Http::post($this->url.'login', [ + 'sEmail' => $request->phone_or_email, + 'sPassword' => $request->password, + 'sRemember' => $request->remember + ]); - if ($loginType == 'email') { - $user = User::query() - ->where('email', $request->phone_or_email) - ->first(); - } - - if ($loginType == 'phone') { - $user = User::query() - ->where('phone', $request->phone_or_email) - ->first(); - } - - if (!isset($user) || empty($user)) { - return response(['message' => 'User Tidak Ditemukan'], 404); - } - - if ($loginType == 'email') { - if ($request->otp != $user->otp) { - return response(['message' => 'OTP Salah, Silahkan Cek Kembali Email Anda'], 403); - } - } else if ($loginType == 'phone') { - if ($request->otp != $user->otp) { - return response(['message' => 'OTP Salah'], 403); - } + $response = $response->json(); + if ($response['success']){ + $user = User::with('detail') + ->where('sEmail', $request->phone_or_email) + ->first(); + return Helper::responseJson( + data: [ + 'token' => $user->createToken('app')->plainTextToken, + 'user' => UserProfileResource::make($user), + ], + message: 'Selamat Datang' + ); } else { - return response(['message' => 'Mode Login Tidak Dikenal'], 403); + return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403); + }; + } + + public function forgetPassword(Request $request){ + $request->validate([ + 'email' => 'required|email', + ]); + + // Login hit ke API linksehat, karena encrypt nya pake CI + $response = Http::post($this->url.'forgot_password', [ + 'sEmail' => $request->email, + ]); + + $response = $response->json(); + if ($response['success']){ + return Helper::responseJson( + data: [], + message: 'Message has been sent.' + ); + } else { + return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403); + }; + } + + public function resetPassword(Request $request){ + $request->validate([ + 'email' => 'required|email', + 'code' => 'required', + 'password' => 'required', + ]); + + // Login hit ke API linksehat, karena encrypt nya pake CI + $response = Http::post($this->url.'reset_password', [ + 'sCode' => $request->code, + 'sEmail' => $request->email, + 'sPassword' => $request->password, + ]); + + $response = $response->json(); + if ($response['success']){ + return Helper::responseJson( + data: [], + message: 'Password telah di reset' + ); + } else { + return response(['message' => $response['message']], 403); + }; + } + + public function loginPhone(Request $request) + { + $request->validate([ + 'phone_or_email' => 'required', + 'otp' => 'required', + ]); + + $user = User::with('detail') + ->where([ + 'sPhone' => $request->phone_or_email, + 'sVerificationCode' => $request->otp + ]) + ->first(); + + if ($user){ + + $updateVericationCode = User::with('detail') + ->where([ + 'sPhone' => $request->phone_or_email, + 'sVerificationCode' => $request->otp + ])->update([ + 'sVerificationCode' => null, + ]); + return Helper::responseJson( + data: [ + 'token' => $user->createToken('app')->plainTextToken, + 'user' => UserProfileResource::make($user), + ], + message: 'Selamat Datang' + ); + } else { + return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403); + }; + } + + public function otpRequest(Request $request) + { + + $user = User::with('detail') + ->where('sPhone', $request->phone_or_email) + ->first(); + + if ($user){ + // Request OTP ke API linksehat + $response = Http::post($this->url.'generate_code', [ + 'sPhone' => $request->phone_or_email + ]); + + $response = $response->json(); + + return Helper::responseJson( + data: [ + 'otp' => $response['message'], + ], + message: 'Kode OTP' + ); + } else { + return Helper::responseJson( + data: [ + 'otp' => null, + ], + message: 'Nomor tidak ditemukan' + ); } - return Helper::responseJson( - data: [ - 'token' => $user->createToken('app')->plainTextToken, - 'user' => UserProfileResource::make($user), - ], - message: 'Selamat Datang' - ); + + } public function register(Request $request) @@ -163,6 +209,7 @@ class AuthController extends Controller return Helper::responseJson(message: 'Behasil Logout.'); } + public function mockOtp(Request $request) { $request->validate([ diff --git a/Modules/Linksehat/Http/Controllers/Api/AutocompleteController.php b/Modules/Linksehat/Http/Controllers/Api/AutocompleteController.php new file mode 100644 index 00000000..3af9e00b --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/AutocompleteController.php @@ -0,0 +1,97 @@ +table('tm_status_pernikahan')->get()->toArray(); + + $data = []; + + if ($maritalStatus){ + $temp = []; + foreach($maritalStatus as $d){ + $temp['id'] = $d->nID; + $temp['value'] = $d->sStatusPernikahan; + + array_push($data, $temp); + } + + } + return Helper::responseJson($data); + } + + public function bloodType() { + $bloodType = DB::connection('oldlms')->table('tm_golongan_darah')->get()->toArray(); + + $data = []; + + if ($bloodType){ + $temp = []; + foreach($bloodType as $d){ + $temp['id'] = $d->nID; + $temp['value'] = $d->sGolonganDarah; + + array_push($data, $temp); + } + + } + return Helper::responseJson($data); + } + + public function relationship() { + $relation = DB::connection('oldlms')->table('tm_hubungan_keluarga')->get()->toArray(); + + $data = []; + + if ($relation){ + $temp = []; + foreach($relation as $d){ + $temp['id'] = $d->nID; + $temp['value'] = $d->sHubunganKeluarga; + + array_push($data, $temp); + } + + } + return Helper::responseJson($data); + } + + public function corporate(Request $request) { + $search = $request->search; + $corporate = DB::table('corporates') + ->where('active', 1) + ->where(function ($query) use ($search) { + $query->where('name', 'like', "%$search%") + ->orWhere('code', 'like', "%$search%"); + }) + ->get() + ->toArray(); + + $data['company'] = []; + + if ($corporate){ + $temp = []; + foreach($corporate as $d){ + $temp['id'] = $d->id; + $temp['name'] = $d->name; + $temp['linking_rule'] = json_decode($d->linking_rules); + + array_push($data['company'], $temp); + } + + } + return Helper::responseJson($data); + } +} + diff --git a/Modules/Linksehat/Http/Controllers/Api/LinkingController.php b/Modules/Linksehat/Http/Controllers/Api/LinkingController.php new file mode 100644 index 00000000..899dbfe2 --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/LinkingController.php @@ -0,0 +1,138 @@ +url = $_ENV['LMS_APP_URL']; + } + + public function linkingValidate(Request $request) + { + $validator = Validator::make($request->all(), [ + 'corporate_id' => 'required', + 'user_id' => 'required', + ]); + + // $request->validate($validationRules); + if ($validator->fails()) { + return response()->json(['errors' => $validator->errors()], 422); + } + + $corporate = Corporate::findOrFail($request->corporate_id); + // Make Validation from Linking Rules + $linkingRulesArr = $corporate->linking_rules->toArray(); + + $validationRules = []; + foreach ($linkingRulesArr as $field) { + $rules = ['required']; // Default is required if in the linking_rules + if ($field == 'email') { + $rules[] = 'email'; + } + + if ($field == 'nric') { + $rules[] = new NikRule; + } + + $validationRules[$field] = $rules; + } + + $validator = Validator::make($request->all(),$validationRules); + + // $request->validate($validationRules); + if ($validator->fails()) { + return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 422, status: 'error'); + } + + $member = Member::query() + ->when(in_array('nric', $linkingRulesArr), function($q) use ($request) { + $q->where('nric', $request->nric); + }) + ->when(in_array('member_id', $linkingRulesArr), function($q) use ($request) { + $q->where('member_id', $request->member_id); + }) + ->when(in_array('name', $linkingRulesArr), function($q) use ($request) { + $q->where('name', $request->name); + }) + ->when(in_array('dob', $linkingRulesArr), function($q) use ($request) { + $q->where('birth_date', $request->dob); + }) + ->when(in_array('phone', $linkingRulesArr), function($q) use ($request) { + $q->whereHas('person', function ($person) use ($request) { + $person->where('phone', $request->phone); + }); + }) + ->when(in_array('email', $linkingRulesArr), function($q) use ($request) { + $q->where('email', $request->email); + }) + ->when(in_array('nik', $linkingRulesArr), function($q) use ($request) { + $q->whereHas('employeds', function ($employed) use ($request) { + $employed->where('corporate_id', $request->corporate_id) + ->where('nik', $request->nik); + }); + }) + + ->with([ + 'memberPlans' => function ($memberPlan) { + $memberPlan->latest(); + }, + + ]) + + ->first(); + + if ($member) { + // Insert into database linksehat + $insurance = UserInsurance::updateOrCreate( + [ + 'nIDUser' => $request->user_id, + ], + [ + 'nIDUser' => $request->user_id, + 'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'], + 'sNoPolis' => $member->member_id, + 'sNamaPeserta' => $member->fullName, + 'sKartuPeserta' => '', + 'sLayanan' => 'RJ,TC', + 'dStartDate' => $member->members_effective_date, + 'dExpireDate' => $member->members_expire_date, + 'dTanggalLahir' => $member->birth_date, + 'nNoKTP' => $member->nric != '' ? $member->nric : 0 , + 'sIsConfrimed' => 1, + 'sStatus' => 1, + ]); + $message = $member->currentPolicy->corporate->welcome_message; + return Helper::responseJson(data: MemberResource::make($member), message: $message); + } + + return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 404, status: 'error'); + } + + public function card($member_id){ + $member = Member::where('member_id', $member_id)->get()->first(); + $message = $member->currentPolicy->corporate->welcome_message; + return Helper::responseJson(data: MemberResource::make($member), message: $message); + } +} diff --git a/Modules/Linksehat/Http/Controllers/Api/ProfileController.php b/Modules/Linksehat/Http/Controllers/Api/ProfileController.php index d4218492..f4be989a 100644 --- a/Modules/Linksehat/Http/Controllers/Api/ProfileController.php +++ b/Modules/Linksehat/Http/Controllers/Api/ProfileController.php @@ -3,12 +3,16 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Helpers\Helper; -use App\Models\User; +use App\Models\OLDLMS\User; +use App\Models\OLDLMS\UserDetail; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Validator; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Auth; -use Modules\Linksehat\Transformers\UserProfileResource; +use Modules\Linksehat\Transformers\User\ShowProfileResource; +use Modules\Linksehat\Transformers\User\UserProfileResource; + class ProfileController extends Controller { @@ -16,11 +20,11 @@ class ProfileController extends Controller * Display a listing of the resource. * @return Renderable */ - public function index() + public function index(Request $request, $id) { - $user = Auth::user()->load('person'); + $user = User::with(['detail'])->where('nID', $id)->get()->first(); - return Helper::responseJson(new UserProfileResource($user)); + return Helper::responseJson(new ShowProfileResource($user)); } /** @@ -70,58 +74,90 @@ class ProfileController extends Controller */ public function update(Request $request) { - $request->validate([ - 'nik' => 'numeric', - 'name_prefix' => '', - 'name' => '', - 'name_suffix' => '', - 'gender' => 'in:P,L', - 'birth_date' => 'sometimes:date', - // 'is_deceased' => '', - 'deceased_at' => 'sometimes:date', - 'marital_status' => 'in:S,M,C', - 'preferred_lang' => 'in:id,en' + $validator = Validator::make($request->all(), [ + 'id' => 'required', + 'first_name' => 'required', + 'last_name' => 'required', + 'date_of_birth' => 'required', + // 'email' => 'required', ]); + - $user = Auth::user(); - if ($user->person) { // Update Profile - $user->person->fill($request->only([ - 'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status' - ]))->save(); + if ($validator->fails()) { + return response()->json(['errors' => $validator->errors()], 422); + } - if ($request->has('preferred_lang')) { - $user->metas()->updateOrCreate([ - 'type' => 'preferred_lang' - ], [ - 'system' => 'default', - 'type' => 'preferred_lang', - 'value' => $request->preferred_lang, - ]); - } - } else { // Create If Not Exist - $newPerson = array_merge( - $request->only([ - 'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status' - ]), - ['user_owner_id' => $user->id] - ); - $newPerson = $user->person()->create($newPerson); - $user->person_id = $newPerson->id; - $user->save(); + $user = User::find($request->id); + $userDetail = UserDetail::where('nIDUser', $request->id)->first(); + // Array asosiatif yang menghubungkan field dengan nama kolom di tabel + $userFields = [ + 'first_name' => 'sFirstName', + 'last_name' => 'sLastName', + 'phone' => 'sPhone', + 'email' => 'sEmail', + 'relationship' => 'nIDHubunganKeluarga', + ]; - if ($request->has('preferred_lang')) { - $user->metas()->updateOrCreate([ - 'type' => 'preferred_lang' - ], [ - 'system' => 'default', - 'type' => 'preferred_lang', - 'value' => $request->preferred_lang, - ]); + $userDetailFields = [ + 'date_of_birth' => 'dTanggalLahir', + 'gender' => 'nIDJenisKelamin', + 'blood_type' => 'nIDGolonganDarah', + 'marital_status' => 'sMartialStatus', + 'weight' => 'sWeight', + 'height' => 'sHeight', + ]; + + // Update user data + foreach ($userFields as $requestField => $column) { + if ($request->filled($requestField)) { + $user->update([$column => $request->$requestField]); } } - $user = User::find($user->id); // ReLoad User Data - return Helper::responseJson(['users' => new UserProfileResource($user)]); + // Update user detail + if($userDetail){ + foreach ($userDetailFields as $requestField => $column) { + if ($request->filled($requestField)) { + $userDetail->update([$column => $request->$requestField]); + } + } + } else { + UserDetail::create([ + 'nIDUser' => $request->id, + 'dTanggalLahir' => $request->date_of_birth, + 'nIDJenisKelamin' => $request->gender, + 'nIDGolonganDarah' => $request->blood_type, + 'sMartialStatus' => $request->marital_status, + 'sWeight' => $request->weight, + 'sHeight' => $request->height, + ]); + } + + + // poto profile + // if ($request->hasFile('avatar')) { + // $pathFileAvatar = File::storeFile('photo_profile_lms', $newCorporate->id, $request->file('avatar')); + // $newCorporate->files()->updateOrCreate([ + // 'type' => 'photo_profile_lms', + // 'name' => File::getFileName('photo_profile_lms', $newCorporate->id, $request->file('avatar')), + // 'extension' => $request->file('avatar')->getClientOriginalExtension(), + // 'path' => $pathFileAvatar, + // 'created_by' => auth()->user()->id, + // 'updated_by' => auth()->user()->id, + // ]); + // } + + $data['data'] = [ + 'status' => 200, + 'message' => 'data berhasil di edit', + 'error' => 'false' + + ]; + + + return response()->json($data); + + } /** @@ -133,4 +169,17 @@ class ProfileController extends Controller { // } + + public function changeProfile($id){ + $user = User::with('detail') + ->where('nID', $id) + ->first(); + return Helper::responseJson( + data: [ + // 'token' => $user->createToken('app')->plainTextToken, + 'user' => UserProfileResource::make($user), + ], + message: 'Selamat Datang' + ); + } } diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index 145e78b2..07fe7532 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -3,6 +3,7 @@ use Modules\Linksehat\Http\Controllers\Api\AppointmentController; use Modules\Linksehat\Http\Controllers\Api\AuthController; use Modules\Linksehat\Http\Controllers\Api\DashboardController; +use Modules\Linksehat\Http\Controllers\Api\AutocompleteController; use Modules\Linksehat\Http\Controllers\Api\DoctorController; use Modules\Linksehat\Http\Controllers\Api\HospitalController; use Modules\Linksehat\Http\Controllers\Api\NotificationTokenController; @@ -10,6 +11,7 @@ use Modules\Linksehat\Http\Controllers\Api\PersonController; use Modules\Linksehat\Http\Controllers\Api\ProfileController; use Modules\Linksehat\Http\Controllers\Api\SearchController; use Modules\Linksehat\Http\Controllers\Api\SpecialityController; +use Modules\Linksehat\Http\Controllers\Api\LinkingController; /* |-------------------------------------------------------------------------- @@ -35,7 +37,11 @@ Route::prefix('linksehat')->group(function () { Route::post('otp-request', 'otpRequest'); Route::post('mock-otp', 'mockOtp'); Route::post('login', 'login'); + Route::post('logout', 'logout'); + Route::post('login-phone', 'loginPhone'); Route::post('register', 'register'); + Route::post('forget-password', 'forgetPassword'); + Route::post('reset-password', 'resetPassword'); Route::get('social-login/{provider}', 'redirectSocialLogin'); Route::get('social-login/{provider}/callback', 'handleSocialLoginCallback'); }); @@ -59,11 +65,22 @@ Route::prefix('linksehat')->group(function () { Route::middleware('auth:sanctum')->group(function () { - Route::get('profile', [ProfileController::class, 'index'])->name('profile'); + Route::get('profile/{id}', [ProfileController::class, 'index'])->name('profile'); + Route::get('change-profile/{id}', [ProfileController::class, 'changeProfile'])->name('change-profile'); Route::post('profile', [ProfileController::class, 'update'])->name('profile.update'); Route::post('notification-tokens/delete/{id}', [NotificationTokenController::class, 'destroy'])->name('profile.delete.token'); Route::post('notification-tokens', [NotificationTokenController::class, 'store'])->name('profile.store.token'); Route::apiResource('appointment', AppointmentController::class); Route::apiResource('families', PersonController::class)->except(['destroy']); + + Route::get('autocomplete/marital_status', [AutocompleteController::class, 'maritalStatus']); + Route::get('autocomplete/blood_type', [AutocompleteController::class, 'bloodType']); + Route::get('autocomplete/relationship', [AutocompleteController::class, 'relationship']); + Route::get('autocomplete/corporate', [AutocompleteController::class, 'corporate']); + + Route::post('manual-linking', [LinkingController::class, 'linkingValidate']); + + Route::get('card/{member_id}', [LinkingController::class, 'card']); + }); }); diff --git a/Modules/Linksehat/Transformers/User/ShowProfileResource.php b/Modules/Linksehat/Transformers/User/ShowProfileResource.php new file mode 100644 index 00000000..5f923e3f --- /dev/null +++ b/Modules/Linksehat/Transformers/User/ShowProfileResource.php @@ -0,0 +1,90 @@ +detail){ + switch ($this->detail->nIDGolonganDarah) { + case 1: + $goldar = 'A'; + break; + case 2: + $goldar = 'B'; + break; + case 3: + $goldar = 'AB'; + break; + case 4: + $goldar = 'O'; + break; + + default: + $goldar = '-'; + break; + } + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + // Marital Status + $maritalStatus = DB::connection('oldlms')->table('tm_status_pernikahan')->where('nID', $this->detail->sMartialStatus)->first('sStatusPernikahan'); + + // Hubungan Keluarga + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga'); + // dd( $this->detail->nIDGolonganDarah); + $sWeight = $this->detail->sWeight ? $this->detail->sWeight : 0; + $sHeight = $this->detail->sHeight ? $this->detail->sHeight : 0; + $nIDJenisKelamin = $this->detail->nIDJenisKelamin == 1 ? 'Male' : 'Female'; + } else { + $urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png'; + $goldar = '-'; + $relationship = false; + $maritalStatus = false; + $sWeight = 0; + $sHeight = 0; + $nIDJenisKelamin = false; + } + $avatar = $this->detail->sImage ?? $urlAvatarDefault; + + + $userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first(); + $memberId = Null; + if($userInsurance){ + $memberId = $userInsurance->sNoPolis; + } + return [ + 'id' => $this->nID, + 'first_name' => $this->sFirstName, + 'last_name' => $this->sLastName, + 'date_of_birth' => $this->detail ? $this->detail->dTanggalLahir : null, + 'avatar' => $avatar, + 'gender' => $nIDJenisKelamin ? $nIDJenisKelamin : '-', + 'phone' => $this->sPhone, + 'email' => $this->sEmail, + 'blood_type' => $goldar, + 'marital_status' => $maritalStatus ? $maritalStatus->sStatusPernikahan : '-', + 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', + 'weight' => $sWeight, + 'height' => $sHeight, + 'member_id' => $memberId, + ]; + } +} diff --git a/Modules/Linksehat/Transformers/User/UserProfileResource.php b/Modules/Linksehat/Transformers/User/UserProfileResource.php new file mode 100644 index 00000000..cb1aa512 --- /dev/null +++ b/Modules/Linksehat/Transformers/User/UserProfileResource.php @@ -0,0 +1,174 @@ +where('nIDUser', $this->nID)->get()->toArray(); + $dataMemberProfile = []; + + $userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first(); + $memberId = null; + $linking = false; + if($userInsurance){ + $memberId = $userInsurance->sNoPolis; + $linking = true; + } else { + $member = Member::where('email', $this->sEmail)->get()->first(); + $person = Person::where('phone', $this->sPhone)->get()->first(); + if ($member || $person){ // Autolinking + $corporateEmployee = CorporateEmployee::where('member_id', $member->id)->get()->first(); // cek corporate id empolyee/member + if ($corporateEmployee){ + $corporate = Corporate::findOrFail($corporateEmployee->corporate_id)->automatic_linking; // cek autocomplete + if ($corporate){ + if($member) { + // Insert into database linksehat + $insurance = UserInsurance::updateOrCreate( + [ + 'nIDUser' => $this->nID, + ], + [ + 'nIDUser' => $this->nID, + 'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'], + 'sNoPolis' => $member->member_id, + 'sNamaPeserta' => $member->fullName, + 'sKartuPeserta' => '', + 'sLayanan' => 'RJ,TC', + 'dStartDate' => $member->members_effective_date, + 'dExpireDate' => $member->members_expire_date, + 'dTanggalLahir' => $member->birth_date, + 'nNoKTP' => $member->nric != '' ? $member->nric : 0 , + 'sIsConfrimed' => 1, + 'sStatus' => 1, + ]); + $message = $member->currentPolicy->corporate->welcome_message; + $linking = true; + + $memberId = $member->member_id; + } + } + } + } + }; + + if (count($memberProfile) > 0){ + + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + $avatarMember = $this->detail->sImage ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga'); + + $dataUser = [ + 'id' => $this->nID, + 'name' => $this->sFirstName . ' ' . $this->sLastName, + 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', + 'avatar' => $avatarMember + ]; + + array_push($dataMemberProfile, $dataUser); + + foreach($memberProfile as $m){ + $urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + $avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga'); + + $data = [ + 'id' => $m['nID'], + 'name' => $m['full_name'], + 'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-', + 'avatar' => $avatarMember, + ]; + + array_push( $dataMemberProfile, $data); + } + + + } else { + $nID = $this->nIDUser ? $this->nIDUser : $this->nID; + if ($nID){ + $memberProfile = User::with('detail')->where('nIDUser', $nID)->get()->toArray(); + + $dataMember = User::with('detail')->where('nID', $nID)->get()->first(); + + if ($this->detail){ + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + } else { + $urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png'; + } + $avatar = $this->detail->sImage ?? $urlAvatarDefault; + + $avatarMember = $dataMember->detail->sImage ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga'); + + $dataUser = [ + 'id' => $dataMember->nID, + 'name' => $dataMember->sFirstName . ' ' . $dataMember->sLastName, + 'relationship' => 'Me', + 'avatar' => $avatarMember + ]; + array_push($dataMemberProfile, $dataUser); + + if (count($memberProfile) > 0){ + foreach($memberProfile as $m){ + $urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + $avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault; + $relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga'); + + $data = [ + 'id' => $m['nID'], + 'name' => $m['full_name'], + 'relationship' => $relationship->sHubunganKeluarga, + 'avatar' => $avatarMember, + ]; + + array_push( $dataMemberProfile, $data); + } + } + } else { + + } + } + + // Principal + if ($this->detail){ + $urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png'; + } else { + $urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png'; + } + $avatar = $this->detail->sImage ?? $urlAvatarDefault; + + + return [ + 'id' => $this->nID, + 'full_name' => $this->sFirstName . ' '. $this->sLastName, + 'avatar' => $avatar, + 'member_type' => $this->nIDUser ? 'Dependent' : 'Principal', + 'member_profile' => $dataMemberProfile, + 'member_id' => $memberId, + 'linking' => $linking, + ]; + } +} diff --git a/Modules/Linksehat/Transformers/UserProfileResource.php b/Modules/Linksehat/Transformers/UserProfileResource.php deleted file mode 100644 index c5c5506f..00000000 --- a/Modules/Linksehat/Transformers/UserProfileResource.php +++ /dev/null @@ -1,36 +0,0 @@ - $this->id, - 'email' => $this->email, - 'phone' => $this->phone, - 'email_verified_at' => $this->email_verified_at, - 'nik' => $this->person->nik ?? null, - 'name_prefix' => $this->person->name_prefix ?? null, - 'name' => $this->person->name ?? null, - 'name_suffix' => $this->person->name_suffix ?? null, - 'full_name' => $this->person->full_name ?? null, - 'gender' => $this->person->gender ?? null, - 'birth_date' => $this->person->birth_date ?? null, - 'age' => $this->person->age ?? null, - 'is_deceased' => $this->person->is_deceased ?? null, - 'deceased_at' => $this->person->deceased_at ?? null, - 'marital_status' => $this->person->marital_status ?? null, - 'preferred_lang' => $this->meta->preferred_lang ?? 'id', - ]; - } -} diff --git a/app/Builders/MemberBuilder.php b/app/Builders/MemberBuilder.php index 1b16e396..f2e60f8e 100644 --- a/app/Builders/MemberBuilder.php +++ b/app/Builders/MemberBuilder.php @@ -24,9 +24,24 @@ class MemberBuilder extends Builder public function joinCorporateEmployees(string $value = 'join'): static { + // return match ($value) { + // 'join' => $this->join('corporate_employees', 'members.id', '=', 'corporate_employees.member_id'), + // 'left' => $this->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + // }; + return match ($value) { - 'join' => $this->join('corporate_employees', 'members.id', '=', 'corporate_employees.member_id'), - 'left' => $this->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + 'join' => $this->join('corporate_employees', function ($join) { + $join->on('members.id', '=', 'corporate_employees.member_id') + ->orWhere('members.principal_id', '=', 'corporate_employees.member_id'); + }), + 'left' => $this->leftJoin('corporate_employees', function ($join) { + $join->on('members.id', '=', 'corporate_employees.member_id') + ->orWhere('members.principal_id', '=', 'corporate_employees.member_id'); + }), + 'right' => $this->rightJoin('corporate_employees', function ($join) { + $join->on('members.id', '=', 'corporate_employees.member_id') + ->orWhere('members.principal_id', '=', 'corporate_employees.member_id'); + }) }; } @@ -40,11 +55,31 @@ class MemberBuilder extends Builder public function joinClaimRequests(string $value = 'join'): static { + // return match ($value) { + // 'join' => $this->join('claim_requests', 'members.id', '=', 'claim_requests.member_id'), + // 'left' => $this->leftJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id'), + // // 'right' => $this->rightJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id') + // 'right' => $this->rightJoin('claim_requests', function ($join) { + // $join->on('members.id', '=', 'claim_requests.member_id') + // ->orWhere('members.principal_id', '=', 'claim_requests.member_id'); + // }) + // }; + return match ($value) { - 'join' => $this->join('claim_requests', 'members.id', '=', 'claim_requests.member_id'), - 'left' => $this->leftJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id'), - 'right' => $this->rightJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id') + 'join' => $this->join('claim_requests', function ($join) { + $join->on('members.id', '=', 'claim_requests.member_id') + ->orWhere('members.principal_id', '=', 'claim_requests.member_id'); + }), + 'left' => $this->leftJoin('claim_requests', function ($join) { + $join->on('members.id', '=', 'claim_requests.member_id') + ->orWhere('members.principal_id', '=', 'claim_requests.member_id'); + }), + 'right' => $this->rightJoin('claim_requests', function ($join) { + $join->on('members.id', '=', 'claim_requests.member_id') + ->orWhere('members.principal_id', '=', 'claim_requests.member_id'); + }) }; + } public function joinMemberPlans(string $value = 'join'): static diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 7ae4d707..5ce5c9a4 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -6,24 +6,41 @@ use Carbon\Carbon; use Carbon\CarbonPeriod; use Illuminate\Http\JsonResponse; use Symfony\Component\HttpFoundation\Response; +use PHPMailer\PHPMailer\PHPMailer; +use Illuminate\Support\Facades\DB; +use App\Models\Member; +use App\Models\Service; class Helper { public static function genderNormalization($anyGenderCode) { if ($anyGenderCode == 'M') { - return 'male'; + return 'Male'; } else if ($anyGenderCode == 'F') { - return 'female'; + return 'Female'; } else if ($anyGenderCode == 'O') { - return 'others'; + return 'Others'; } else if ($anyGenderCode == 'U') { - return 'unknown'; + return 'Unknown'; } else { return null; } } + public static function maritalNormalization($code) + { + if ($code == 'M') { + return 'Married'; + } else if ($code == 'D') { + return 'Divorced'; + } else if ($code == 'S') { + return 'Single'; + } else { + return '-'; + } + } + public static function genderPerson($anyGenderCode) { if ($anyGenderCode == 'M') { @@ -39,6 +56,44 @@ class Helper } } + public static function memberType($code){ + if ($code == 'P') { + return 'Principal'; + } else if ($code == 'D') { + return 'Dependent'; + } else { + '-'; + } + } + + public static function relationWithPrincipal($code){ + if ($code == 'H') { + return 'Husbund'; + } + else if ($code == 'W') { + return 'Wife'; + } + else if ($code == 'S') { + return 'Son'; + } + else if ($code == 'D') { + return 'Daughter'; + } + else { + '-'; + } + } + + public static function principalName($code){ + $principalName = Member::where('member_id', $code)->get()->first(); + return $principalName->name; + } + + public static function serviceName($code){ + $serviceName = Service::where('code', $code)->get()->first(); + return $serviceName->name; + } + public static function paginateResources($resource) { return [ @@ -216,5 +271,80 @@ class Helper return $sPaymentMethod[$id]; } + public static function formatDateDB($date){ + $convertedDate = Carbon::createFromFormat('d-m-Y', $date)->format('Y-m-d H:i:s'); + return $convertedDate; + } + + + public static function formatDateOnly($date){ + // Membuat objek Carbon dengan tanggal asli dan zona waktu UTC + $carbonDate = Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $date, 'UTC'); + + // Mengonversi tanggal ke zona waktu yang diinginkan + $carbonDate->setTimezone('Asia/Jakarta'); + + $convertedDate = $carbonDate->toDateString(); + return $convertedDate; + } + + public static function formatTimeOnly($date){ + // Membuat objek Carbon dengan tanggal asli dan zona waktu UTC + $carbonDate = Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $date, 'UTC'); + + // Mengonversi tanggal ke zona waktu yang diinginkan + $carbonDate->setTimezone('Asia/Jakarta'); + + $convertedDate = $carbonDate->toTimeString(); + return $convertedDate; + } + + public static function insertNotification($data = array()) + { + try { + DB::beginTransaction(); + DB::table('notifications')->insert($data); + DB::commit(); + return true; + } + catch (\Exception $e) { + DB::rollback(); + return $e->getMessage(); + } + } + + public static function sendEmail($data = array()) + { + // Buat instance PHPMailer + $mail = new PHPMailer(true); + + try { + // Server settings + $mail->isSMTP(); + $mail->Host = 'smtp.gmail.com'; + $mail->SMTPAuth = true; + $mail->Username = env('EMAIL'); + $mail->Password = env('PW_EMAIL'); + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->Port = 465; + $mail->SMTPSecure = "ssl"; + + // Penerima email + $mail->setFrom(env('EMAIL'), env('NAME_EMAIL')); + $mail->addAddress($data['email'], $data['name']); + + // Konten email + $mail->isHTML(true); + $mail->Subject = $data['subject']; + $mail->Body = $data['body']; + + // Kirim email + $mail->send(); + return true; + } catch (\Exception $e) { + //var_dump($mail->ErrorInfo);die(); + return false; + } + } } diff --git a/app/Http/Resources/OLDLMS/MemberResource.php b/app/Http/Resources/OLDLMS/MemberResource.php index f5ba6cf7..610ce9cf 100644 --- a/app/Http/Resources/OLDLMS/MemberResource.php +++ b/app/Http/Resources/OLDLMS/MemberResource.php @@ -3,8 +3,10 @@ namespace App\Http\Resources\OLDLMS; use App\Services\ClaimService; +use App\Models\Corporate; use Illuminate\Http\Resources\Json\JsonResource; + class MemberResource extends JsonResource { /** @@ -21,28 +23,17 @@ class MemberResource extends JsonResource $limitTelecon = $this->totalUsage >= 6 ? null : $limitTelecon; $data = [ + 'id' => $this->id, + 'member_name' => $this->full_name, 'member_id' => $this->member_id, - 'birth_date' => $this->birth_date, - 'email' => $this->email, - 'phone' => $this->person->phone ?? null, - 'full_name' => $this->full_name, - 'nric' => $this->nric, - 'plan' => $currentMemberPlan ? [ - 'code' => $currentMemberPlan->plan->code ?? null, - 'start' => $currentMemberPlan->start, - 'end' => $currentMemberPlan->end, - 'limit' => $this->currentPlan->limit_rules, - 'limit_consultation' => 6 - ] : null, - 'policy_code' => $this->currentPolicy?->code ?? null, - 'corporate' => [ - 'code' => $this->currentPolicy?->corporate->code ?? null, - 'name' => $this->currentPolicy?->corporate->name, - 'welcome_message' => $this->currentPolicy?->corporate->welcome_message, - 'help_text' => $this->currentPolicy?->corporate?->help_text, - 'avatar_url' => $this->currentpolicy?->corporate?->avatar_url - ], - 'limit_usage' => $this->totalUsage ?? null + 'policy_holder' => $this->currentPolicy->corporate->name, + 'policy_number' => $this->currentPolicy->code ?? null, + 'date_of_birth' => $this->birth_date, + 'gender' => $this->gender, + 'start_date' => $this->members_effective_date, + 'corporate_logo' => $_ENV['LMS_APP_STORAGE'] . $this->corporateLogo, + 'valid_until' => $this->members_expire_date, + ]; return $data; } diff --git a/app/Models/Claim.php b/app/Models/Claim.php index d01decbe..26b4c26d 100644 --- a/app/Models/Claim.php +++ b/app/Models/Claim.php @@ -29,11 +29,19 @@ class Claim extends Model 'currency', 'plan_id', 'benefit_id', + 'organization_id', 'status', + 'service_code', + 'benefit_code', + 'benefit_desc', + 'amount_incurred', + 'amount_approved', + 'amount_not_approved', + 'excess_paid', ]; protected $hidden = [ - 'created_at', + // 'created_at', 'updated_at', 'deleted_at', 'created_by', @@ -195,6 +203,11 @@ class Claim extends Model return $this->belongsTo(Member::class, 'member_id'); } + public function organization() + { + return $this->belongsTo(Organization::class, 'organization_id'); + } + public function encounters() { return $this->belongsToMany(Encounter::class, 'claim_encounter'); @@ -251,5 +264,11 @@ class Claim extends Model { return $this->items->sum('nominal_ditagihkan'); } + + public function historyHospitalCare() + { + return $this->hasMany(ClaimHistoryCare::class, 'claim_id'); + } + } diff --git a/app/Models/ClaimEncounter.php b/app/Models/ClaimEncounter.php new file mode 100644 index 00000000..d4eea577 --- /dev/null +++ b/app/Models/ClaimEncounter.php @@ -0,0 +1,12 @@ +belongsTo(Organization::class, 'organization_id'); + } + + public function practitioner() + { + return $this->belongsTo(Practitioner::class, 'practitioner_id'); + } + + public function icd() + { + return $this->belongsTo(Icd::class, 'main_diagnosis_id'); + } + + public function claim() + { + return $this->hasOne(Claim::class, 'claim_id'); + } + + public function person() + { + return $this->belongsTo(Person::class, 'practitioner_id'); + } + + public function comparativeDiagnosis() + { + return $this->hasMany(DiagnosisSecondaryClaimHistoryCare::class, 'claim_history_care_id'); + } + +} diff --git a/app/Models/ClaimItem.php b/app/Models/ClaimItem.php index 273377a8..e78551f8 100644 --- a/app/Models/ClaimItem.php +++ b/app/Models/ClaimItem.php @@ -25,6 +25,11 @@ class ClaimItem extends Model return $this->belongsTo(Claim::class, 'claim_id'); } + public function benefit() + { + return $this->belongsTo(Benefit::class, 'claim_itemable_id'); + } + public function claim_itemable() { return $this->morphTo(); diff --git a/app/Models/ClaimRequest.php b/app/Models/ClaimRequest.php index 39533f41..6622efc4 100644 --- a/app/Models/ClaimRequest.php +++ b/app/Models/ClaimRequest.php @@ -14,7 +14,8 @@ class ClaimRequest extends Model { use HasFactory, SoftDeletes, Blameable; - protected static $code_prefix = 'CRQ'; + // protected static $code_prefix_hospital = 'CRQ-H'; + // protected static $code_prefix_client = 'CRQ-R'; public $fillable = [ 'uuid', @@ -24,7 +25,10 @@ class ClaimRequest extends Model 'service_code', 'policy_id', 'status', - 'claim_id' + 'claim_id', + 'organization_id', + 'code', + 'request_log_id' ]; protected $hidden = [ @@ -36,6 +40,73 @@ class ClaimRequest extends Model 'deleted_by', ]; + public static $doc_headers_to_field_map = [ + "PAYOR ID" => "payor_id", + "CORPORATE ID" => "corporate_id", + "POLICY NUMBER" => "policy_number", + "MEMBER ID" => "member_id", + "MEMBER NAME" => "member_name", + "RECORD TYPE (P/D)" => "record_type", + "BENEFIT CODE" => "benefit_code", + "BENEFIT DESC" => "benefit_desc", + "CLAIM TYPE" => "claim_type", + "CLAIM PROCESS STATUS" => "status", + "CLIENT CLAIM ID" => "client_claim_id", + "REFERENCE NO" => "reference_no", + "ADMEDIKA CLAIM ID" => "admika_claim_id", + "PROVIDER CODE" => "provider_code", + "ADMISSION DATE" => "admission_date", + "DISCUTRGE DATE" => "discutrge_date", + "DURATION DAYS" => "duration_days", + "COVERAGE TYPE" => "coverage_type", + "PLAN ID" => "plan_id", + "DIAGNOSIS CODE" => "diagnosis_code", + "DIAGNOSIS DESC" => "diagnosis_desc", + "TOT AMT INCURRED" => "tot_amt_insurred", + "TOT AMT APPROVED" => "tot_amt_approved", + "TOT AMT NOT APPROVED" => "tot_amt_not_approved", + "TOT EXCESS PAID" => "tot_excess_paid", + "REMARKS" => "remarks", + "SECONDARY DIAGNOSIS CODE" => "secondary_diagnosis", + "APPROVED DATE" => "approved_date", + "APPROVED BY" => "approved_by", + "DATE RECEIVED" => "data_received", + "HOSPITAL INVOICE DATE" => "hospital_invoice_date", + ]; + + public static $listing_doc_headers = [ + "PAYOR ID", + "CORPORATE ID", + "POLICY NUMBER", + "MEMBER ID", + "MEMBER NAME", + "RECORD TYPE (P/D)", + "CLAIM TYPE", + "CLAIM PROCESS STATUS", + "CLIENT CLAIM ID", + "REFERENCE NO", + "ADMEDIKA CLAIM ID", + "PROVIDER CODE", + "ADMISSION DATE", + "DISCUTRGE DATE", + "DURATION DAYS", + "COVERAGE TYPE", + "PLAN ID", + "DIAGNOSIS CODE", + "DIAGNOSIS DESC", + "TOT AMT INCURRED", + "TOT AMT APPROVED", + "TOT AMT NOT APPROVED", + "TOT EXCESS PAID", + "REMARKS", + "SECONDARY DIAGNOSIS CODE", + "APPROVED DATE", + "APPROVED BY", + "DATE RECEIVED", + "HOSPITAL INVOICE DATE", + ]; + + public static $status = [ 'draft' => 'Draft', 'requested' => 'Requested', @@ -59,7 +130,7 @@ class ClaimRequest extends Model static::creating(function ($model) { try { $model->uuid = (string) Str::orderedUuid(); // generate uuid - $model->code = self::getNextCode(); + // $model->code = self::getNextCode(); } catch (\Exception $e) { abort(500, $e->getMessage()); } @@ -112,19 +183,19 @@ class ClaimRequest extends Model } }); } - - public static function getNextCode() - { - $last_number = self::withTrashed()->max('code'); - $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[1] + 1); - return self::makeCode($next_number); - } + // public static function getNextCode() + // { + // $last_number = self::withTrashed()->max('code'); + // $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[1] + 1); - public static function makeCode($next_number) - { - return (string) self::$code_prefix .'-'. str_pad($next_number, 5, 0, STR_PAD_LEFT); - } + // return self::makeCode($next_number); + // } + + // public static function makeCode($next_number) + // { + // return (string) self::$code_prefix .'-'. str_pad($next_number, 5, 0, STR_PAD_LEFT); + // } public function claim() { @@ -141,6 +212,21 @@ class ClaimRequest extends Model return $this->morphMany(File::class, 'fileable'); } + public function claimResults() + { + return $this->files()->where('type', 'claim-result')->whereNull('deleted_at'); + } + + public function claimConditions() + { + return $this->files()->where('type', 'claim-kondisi')->whereNull('deleted_at'); + } + + public function claimDiagnosis() + { + return $this->files()->where('type', 'claim-diagnosis')->whereNull('deleted_at'); + } + public function generatedDocuments() { return $this->morphMany(GeneratedDocument::class, 'generated_documentable'); @@ -151,6 +237,11 @@ class ClaimRequest extends Model return $this->morphMany(ClaimHistory::class, 'historiable'); } + public function organization() + { + return $this->belongsTo(Organization::class, 'organization_id'); + } + public function member() { return $this->belongsTo(Member::class, 'member_id', 'id'); diff --git a/app/Models/CorporateFormularium.php b/app/Models/CorporateFormularium.php index 18cf8abb..b0e840c6 100644 --- a/app/Models/CorporateFormularium.php +++ b/app/Models/CorporateFormularium.php @@ -6,6 +6,7 @@ use App\Traits\Blameable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Altek\Accountant\Contracts\Recordable; class CorporateFormularium extends Model { @@ -15,7 +16,8 @@ class CorporateFormularium extends Model protected $fillable = [ 'corporate_id', - 'formularium_id' + 'formularium_template_id', + 'active' ]; public function corporate() @@ -23,8 +25,8 @@ class CorporateFormularium extends Model return $this->belongsTo(Corporate::class); } - public function formularium() + public function formularium_template() { - return $this->belongsTo(Formularium::class); + return $this->belongsTo(FormulariumTemplate::class); } } diff --git a/app/Models/CorporateHospital.php b/app/Models/CorporateHospital.php new file mode 100644 index 00000000..f38259e5 --- /dev/null +++ b/app/Models/CorporateHospital.php @@ -0,0 +1,36 @@ +belongsTo(Corporate::class); + } + + public function scopeFilter($query, array $filters) + { + $query->when($filters['search'] ?? false, function ($query, $search) { + return $query + ->where('code', 'like', "%" . $search . "%") + ->orWhere('name', 'like', "%" . $search . "%"); + }); + } +} diff --git a/app/Models/CorporateManager.php b/app/Models/CorporateManager.php index ae663ef5..23ffe5c7 100644 --- a/app/Models/CorporateManager.php +++ b/app/Models/CorporateManager.php @@ -11,4 +11,19 @@ class CorporateManager extends Model use HasFactory, SoftDeletes; protected $table = 'corporate_manager'; + protected $fillable = [ + 'user_id', + 'corporate_id' + ]; + + public function user() + { + return $this->hasOne(User::class, 'id', 'user_id'); + } + + public function corporate() + { + return $this->hasOne(Corporate::class, 'id', 'corporate_id'); + } + } diff --git a/app/Models/CorporatePlan.php b/app/Models/CorporatePlan.php index ca27e624..818e1255 100644 --- a/app/Models/CorporatePlan.php +++ b/app/Models/CorporatePlan.php @@ -18,6 +18,10 @@ class CorporatePlan extends Model 'code', 'name', 'description', + 'corporate_plan_id', + 'service_code', + 'type', + 'limit_rules', 'active', 'reason' ]; diff --git a/app/Models/DailyMonitoring.php b/app/Models/DailyMonitoring.php new file mode 100644 index 00000000..2285102c --- /dev/null +++ b/app/Models/DailyMonitoring.php @@ -0,0 +1,61 @@ +attributes['body_temperature'], 0); + } + + public function getSistoleAttribute() + { + return round($this->attributes['sistole'], 0); + } + + public function getDiastoleAttribute() + { + return round($this->attributes['diastole'], 0); + } + + public function getRespirationRateAttribute() + { + return round($this->attributes['respiration_rate'], 0); + } + + public function getMedicalPlanAttribute() + { + $arr_medical_plan = []; + $medical_plan = DB::table('medical_plan')->where('claim_daily_monitoring_id','=',$this->attributes['id'])->get(); + + foreach ($medical_plan as $row) { + $arr_medical_plan[] = [ + 'medical_plan_str' => $row->plan + ]; + } + + return $arr_medical_plan; + } +} diff --git a/app/Models/DiagnosisSecondaryClaimHistoryCare.php b/app/Models/DiagnosisSecondaryClaimHistoryCare.php new file mode 100644 index 00000000..113015ec --- /dev/null +++ b/app/Models/DiagnosisSecondaryClaimHistoryCare.php @@ -0,0 +1,28 @@ +belongsTo(Icd::class, 'icd_id'); + } +} diff --git a/app/Models/Drug.php b/app/Models/Drug.php index ad74b58a..a1fb9655 100644 --- a/app/Models/Drug.php +++ b/app/Models/Drug.php @@ -25,7 +25,8 @@ class Drug extends Model 'dosage', 'remark', 'selling_unit_id', - 'status' + 'status', + 'active', ]; public function categories() diff --git a/app/Models/Exclusion.php b/app/Models/Exclusion.php index 3852907b..7cfd5f74 100644 --- a/app/Models/Exclusion.php +++ b/app/Models/Exclusion.php @@ -6,6 +6,7 @@ use App\Traits\Blameable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Altek\Accountant\Contracts\Recordable; class Exclusion extends Model { @@ -17,6 +18,8 @@ class Exclusion extends Model 'type', 'exclusionable_id', 'exclusionable_type', + 'active', + 'reason' ]; protected $hidden = [ diff --git a/app/Models/ExclusionImport.php b/app/Models/ExclusionImport.php new file mode 100644 index 00000000..44187cce --- /dev/null +++ b/app/Models/ExclusionImport.php @@ -0,0 +1,24 @@ + 'claim/', 'claim-diagnosis' => 'claim/', 'claim-kondisi' => 'claim/', + 'claim-invoice' => 'claim/', + 'final-log-result' => 'final-log/', + 'final-log-diagnosis' => 'final-log/', + 'final-log-kondisi' => 'final-log/', + 'docs' => 'docs/', + 'additional-files' => 'additional-files/', ]; public function fileable() @@ -52,7 +60,7 @@ class File extends Model public static function getDirectory($type) { - return self::$file_directories[$type] ?? 'any'; + return self::$file_directories[$type] ?? 'any/'; } public static function getFileName($type, $id) diff --git a/app/Models/FilesDoc.php b/app/Models/FilesDoc.php new file mode 100644 index 00000000..559d42c9 --- /dev/null +++ b/app/Models/FilesDoc.php @@ -0,0 +1,14 @@ +attributes['code'] = !empty($value) ? $value : Str::upper(Str::random('6')); } - public function corporateFormulariums() - { - return $this->hasMany(CorporateFormularium::class); - } - public function items() { return $this->belongsToMany(Drug::class, 'formularium_items', 'formularium_id', 'item_id'); diff --git a/app/Models/FormulariumTemplate.php b/app/Models/FormulariumTemplate.php new file mode 100644 index 00000000..91bb22c0 --- /dev/null +++ b/app/Models/FormulariumTemplate.php @@ -0,0 +1,32 @@ +hasMany(CorporateFormularium::class, 'formularium_template_id', 'id'); + // } +} diff --git a/app/Models/Icd.php b/app/Models/Icd.php index 9dfa57ff..b2495a6d 100644 --- a/app/Models/Icd.php +++ b/app/Models/Icd.php @@ -6,6 +6,7 @@ use App\Traits\Blameable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Altek\Accountant\Contracts\Recordable; class Icd extends Model { @@ -20,11 +21,13 @@ class Icd extends Model 'name', 'description', 'parent_code', + 'active', + 'icd_template_id' ]; public $appends = [ 'type', - 'active' + // 'active' ]; protected $hidden = [ @@ -41,10 +44,10 @@ class Icd extends Model return 'ICD-'.$this->rev; } - public function getActiveAttribute() - { - return empty($this->deleted_at); - } + // public function getActiveAttribute() + // { + // return empty($this->deleted_at); + // } public function subCategories() { @@ -71,4 +74,14 @@ class Icd extends Model }); } + public function claim_history_care() + { + return $this->hasMany(CliamHistoryCare::class, 'main_diagnosis_id', 'id'); + } + + public function diagnosis_secondary_claim_history_care() + { + return $this->hasMany(DiagnosisSecondaryCliamHistoryCare::class, 'icd_id', 'id'); + } + } diff --git a/app/Models/IcdTemplate.php b/app/Models/IcdTemplate.php new file mode 100644 index 00000000..e58c03dc --- /dev/null +++ b/app/Models/IcdTemplate.php @@ -0,0 +1,32 @@ +select('name','original_name','path','extension')->where("type","=","laboratorium-result")->where('fileable_id','=',$this->attributes['id'])->get(); + + foreach ($files as $row) { + $row->path = url($this->path_for_public . "/" . $row->original_name); + + $arr_files[] = [ + 'lab_result_file_obj' => $row + ]; + } + + return $arr_files; + } +} diff --git a/app/Models/MedicalPlan.php b/app/Models/MedicalPlan.php new file mode 100644 index 00000000..41bc2570 --- /dev/null +++ b/app/Models/MedicalPlan.php @@ -0,0 +1,18 @@ +hasMany(Claim::class, 'member_id', 'id'); } + public function claimRequest() + { + return $this->hasMany(ClaimRequest::class, 'member_id', 'id')->where('claim_id', '!=', null); + } + + public function postponedClaims() { return $this->hasMany(Claim::class, 'member_id', 'id')->where('status', 'postpone'); @@ -142,12 +149,35 @@ class Member extends Model return $this->hasManyThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id'); } + public function currentPlans() + { + return $this->hasManyThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id'); + // ->latest(); // TODO Fix This + } + public function currentPlan() { - return $this->hasOneThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id') - ->latest(); // TODO Fix This + return $this->hasOneThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id', ) + ->latest(); + // ->where('plans.service_code', $this->claimRequest->service_code); // TODO Fix This } + // public function currentPlan() + // { + // return $this->hasOneThrough( + // Plan::class, + // MemberPlan::class, + // 'member_id', + // 'id', + // 'id', + // 'plan_id' + // ) + // ->join('claim_requests', 'claim_requests.service_code', '=', 'plans.service_code') + // ->latest('claim_requests.created_at') // Atau sesuaikan dengan kolom timestamp yang sesuai + // ->select('plans.*'); + // } + + public function currentEmployeds() { return $this->hasOneThrough(CorporateEmployee::class, Person::class, 'nik', 'id', 'id', 'nik') @@ -240,5 +270,20 @@ class Member extends Model get: fn () => $this->person->gender ?? null ); } + + protected function corporateLogo(): Attribute + { + $avatar = File::where(['type' => 'avatar', 'fileable_id' => $this->currentPolicy->corporate->id])->orderBy('id', 'desc')->get()->first(); + if ($avatar){ + $path = $_ENV['LMS_APP_STORAGE'] . $avatar->path ? $avatar->path :''; + return Attribute::make( + get: fn () => $avatar ? $path : null + ); + } else { + return Attribute::make( + get: fn () => null + ); + } + } /* -------------------------------------------------------------------------- */ } diff --git a/app/Models/OLDLMS/PersonalAccessToken.php b/app/Models/OLDLMS/PersonalAccessToken.php new file mode 100644 index 00000000..f2aa7468 --- /dev/null +++ b/app/Models/OLDLMS/PersonalAccessToken.php @@ -0,0 +1,18 @@ +hasOne(UserDetail::class, 'nIDUser', 'nID'); } - + public function insurances() { return $this->hasMany(UserInsurance::class, 'nIDUser', 'nID'); } + + public function notificationTokens() + { + return $this->morphMany(NotificationToken::class, 'notifiabletoken'); + } } diff --git a/app/Models/OLDLMS/UserDetail.php b/app/Models/OLDLMS/UserDetail.php index 0d34d05c..8a77cafb 100644 --- a/app/Models/OLDLMS/UserDetail.php +++ b/app/Models/OLDLMS/UserDetail.php @@ -26,6 +26,10 @@ class UserDetail extends Model 'nIDJenisKelamin', 'sCreateBy', 'sKTP', + 'sImages', + 'sWeight', + 'sHeight', + 'nIDGolonganDarah', ]; diff --git a/app/Models/OLDLMS/UserInsurance.php b/app/Models/OLDLMS/UserInsurance.php index c935f123..3b49d6fd 100644 --- a/app/Models/OLDLMS/UserInsurance.php +++ b/app/Models/OLDLMS/UserInsurance.php @@ -26,5 +26,7 @@ class UserInsurance extends Model 'dTanggalLahir', 'nNoKTP', 'sNoPolis', + 'nIDInsurance', + 'sLayanan', ]; } diff --git a/app/Models/Organization.php b/app/Models/Organization.php index 107a4125..9b15406d 100644 --- a/app/Models/Organization.php +++ b/app/Models/Organization.php @@ -98,4 +98,17 @@ class Organization extends Model { return $this->hasMany(PractitionerRole::class, 'organization_id'); } + + public function claims() + { + return $this->hasMany(Claim::class, 'organization_id', 'id'); + } + public function claim_request() + { + return $this->hasMany(ClaimRequest::class, 'organization_id', 'id'); + } + public function claim_history_care() + { + return $this->hasOne(ClaimHistoryCare::class, 'organization_id', 'id'); + } } diff --git a/app/Models/OrganizationUser.php b/app/Models/OrganizationUser.php new file mode 100644 index 00000000..21f98751 --- /dev/null +++ b/app/Models/OrganizationUser.php @@ -0,0 +1,20 @@ +hasOne(Organization::class, 'id', 'organization_id'); + } +} diff --git a/app/Models/Person.php b/app/Models/Person.php index 85315bcd..f3a6c944 100644 --- a/app/Models/Person.php +++ b/app/Models/Person.php @@ -71,7 +71,9 @@ class Person extends Model public function currentAddress() { - return $this->belongsTo(Address::class, 'main_address_id'); + return $this->belongsTo(Address::class, 'main_address_id')->withDefault([ + 'text' => '', + ]); } public function domicileAddress() diff --git a/app/Models/Practitioner.php b/app/Models/Practitioner.php index 43d0fac8..c602d1a3 100644 --- a/app/Models/Practitioner.php +++ b/app/Models/Practitioner.php @@ -47,4 +47,11 @@ class Practitioner extends Model { return $this->hasMany(PractitionerRole::class, 'practitioner_id'); } + + public function claim_history_care() + { + return $this->hasMany(ClaimHistoryCare::class, 'practitioner_id'); + } + + } diff --git a/app/Models/RequestLog.php b/app/Models/RequestLog.php new file mode 100644 index 00000000..8f93fd52 --- /dev/null +++ b/app/Models/RequestLog.php @@ -0,0 +1,220 @@ + "id", + "STATUS (approved, declined, requested)" => "status", + ]; + + public static $listing_doc_headers = [ + "ID REQUEST LOG", + "STATUS (approved, declined, requested)", + ]; + + public static $listing_data_doc_headers = [ + "ID REQUEST LOG", + "CODE", + "NAME", + "DATE OF SUBMISSION", + "SERVICE TYPE", + "CLAIM METHOD", + "STATUS", + ]; + + + public static $status = [ + 'draft' => 'Draft', + 'requested' => 'Requested', + 'approved' => 'Approved', + 'declined' => 'Declined' + ]; + + public static $payment_types = [ + 'cashless' => 'Cashless', + 'reimbursement' => 'Reimbursement' + ]; + + public $appends = [ + 'payment_type_name' + ]; + + protected static function boot() + { + parent::boot(); + + static::creating(function ($model) { + try { + $model->uuid = (string) Str::orderedUuid(); // generate uuid + // $model->code = self::getNextCode(); + } catch (\Exception $e) { + abort(500, $e->getMessage()); + } + }); + + static::created(function ($model) { + // try { + // if (!empty($model->status) && $model->status == 'requested') { + // $model->histories()->create([ + // 'title' => 'New Claim Requested', + // 'description' => "Claim Requested for Member : {$model->member->member_id} - ({$model->member->full_name})", + // 'type' => 'info' + // ]); + // } + // } catch (\Exception $e) { + // abort(500, $e->getMessage()); + // } + }); + + static::updated(function ($model) { + if ($model->hasChanges(['status'])) { + + // if ($model->status == 'requested') { + // $model->histories()->create([ + // 'title' => 'New Claim Requested', + // 'description' => "Claim Requested for Member : {$model->member->member_id} - ({$model->member->full_name})", + // 'type' => 'info' + // ]); + // } + + // if ($model->status == 'received') { + // ClaimReceived::dispatch($model); + // } + + // if ($model->status == 'approved') { + // ClaimApproved::dispatch($model); + // } + + // if ($model->status == 'postpone') { + // ClaimPostpone::dispatch($model); + // } + + // if ($model->status == 'paid') { + // ClaimPaid::dispatch($model); + // } + + // if ($model->status == 'declined') { + // ClaimDeclined::dispatch($model); + // } + } + }); + } + + // public static function getNextCode() + // { + // $last_number = self::withTrashed()->max('code'); + // $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[1] + 1); + + // return self::makeCode($next_number); + // } + + // public static function makeCode($next_number) + // { + // return (string) self::$code_prefix .'-'. str_pad($next_number, 5, 0, STR_PAD_LEFT); + // } + + public function claim() + { + return $this->belongsTo(Claim::class, 'claim_id'); + } + + public function claims() + { + return $this->hasMany(Claim::class, 'claim_request_id'); + } + + public function files() + { + return $this->morphMany(File::class, 'fileable'); + } + + public function claimResults() + { + return $this->files()->where('type', 'claim-result')->whereNull('deleted_at'); + } + + public function claimConditions() + { + return $this->files()->where('type', 'claim-kondisi')->whereNull('deleted_at'); + } + + public function claimDiagnosis() + { + return $this->files()->where('type', 'claim-diagnosis')->whereNull('deleted_at'); + } + + public function generatedDocuments() + { + return $this->morphMany(GeneratedDocument::class, 'generated_documentable'); + } + + public function histories() + { + return $this->morphMany(ClaimHistory::class, 'historiable'); + } + + public function organization() + { + return $this->belongsTo(Organization::class, 'organization_id'); + } + + public function member() + { + return $this->belongsTo(Member::class, 'member_id', 'id'); + } + + public function service() + { + return $this->belongsTo(Service::class, 'service_code', 'code'); + } + + public function getPaymentTypeNameAttribute() + { + return self::$payment_types[$this->payment_type] ?? $this->payment_type; + } + + public function getStatusAttribute($value) + { + return self::$payment_types[$value] ?? $value; + } +} diff --git a/app/Models/RequestLogBenefit.php b/app/Models/RequestLogBenefit.php new file mode 100644 index 00000000..331227f1 --- /dev/null +++ b/app/Models/RequestLogBenefit.php @@ -0,0 +1,27 @@ +belongsTo(Benefit::class, 'benefit_id', 'id'); + } +} diff --git a/app/Models/RequestLogMedicine.php b/app/Models/RequestLogMedicine.php new file mode 100644 index 00000000..2cd1cec8 --- /dev/null +++ b/app/Models/RequestLogMedicine.php @@ -0,0 +1,30 @@ +belongsTo(Benefit::class, 'benefit_id', 'id'); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 8cef58dd..22b1bee4 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -18,6 +18,8 @@ class User extends Authenticatable * * @var array */ + + protected $connection = 'mysql'; protected $fillable = [ 'person_id', 'name', @@ -103,4 +105,9 @@ class User extends Authenticatable { return $this->morphMany(NotificationToken::class, 'notifiabletoken'); } + + public function getOrganization() + { + return $this->hasOne(OrganizationUser::class, 'user_id'); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index d56e97c2..ec3e3e7e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -7,12 +7,23 @@ use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Validator; use Illuminate\Support\ServiceProvider; use App\Models\Corporate; +use App\Models\CorporateFormularium; use App\Models\CorporateService; use App\Models\CorporatePlan; use App\Models\CorporateBenefit; use App\Models\Member; +use App\Models\CorporateHospital; +use App\Models\ExclusionRules; +use App\Models\ExclusionImport; +use App\Models\Icd; +use App\Models\IcdTemplate; +use App\Models\FormulariumTemplate; use App\Models\AuditTrail; use Illuminate\Support\Facades\Auth; + +use App\Models\OLDLMS\PersonalAccessToken; +use Laravel\Sanctum\Sanctum; + use Str; class AppServiceProvider extends ServiceProvider @@ -35,7 +46,7 @@ class AppServiceProvider extends ServiceProvider public function boot() { Schema::defaultStringLength(191); - + Str::macro('initials', fn($value, $sep = ' ', $glue = '') => trim(collect(explode($sep, $value))->map(function ($segment) { return $segment[0] ?? ''; })->join($glue))); @@ -46,7 +57,7 @@ class AppServiceProvider extends ServiceProvider // }); Corporate::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -55,7 +66,7 @@ class AppServiceProvider extends ServiceProvider }); Member::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -63,10 +74,20 @@ class AppServiceProvider extends ServiceProvider $this->logAuditTrail($model, 'deleted'); }); + //Hospital + CorporateHospital::updated(function ($model) { + + $this->logAuditTrail($model, 'updated'); + }); + + CorporateHospital::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + // Corporate Service CorporateService::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -76,7 +97,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Plans CorporatePlan::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -86,7 +107,7 @@ class AppServiceProvider extends ServiceProvider // Corporate Benefits CorporateBenefit::updated(function ($model) { - + $this->logAuditTrail($model, 'updated'); }); @@ -95,6 +116,60 @@ class AppServiceProvider extends ServiceProvider }); + // Corporate Exclusion + ExclusionRules::updated(function ($model) { + $this->logAuditTrail($model, 'updated'); + }); + + ExclusionRules::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + + ExclusionImport::updated(function ($model) { + + $this->logAuditTrail($model, 'updated'); + }); + + ExclusionImport::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + + // ICD or exlusion + Icd::updated(function ($model) { + $this->logAuditTrail($model, 'updated'); + }); + + Icd::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + + // ICD or exlusion + IcdTemplate::updated(function ($model) { + $this->logAuditTrail($model, 'updated'); + }); + IcdTemplate::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + + // Formualrium Template + FormulariumTemplate::updated(function ($model) { + $this->logAuditTrail($model, 'updated'); + }); + FormulariumTemplate::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + + // Formualrium Template + CorporateFormularium::updated(function ($model) { + $this->logAuditTrail($model, 'updated'); + }); + CorporateFormularium::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + + Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); + + } private function logAuditTrail($model, $action) @@ -109,6 +184,21 @@ class AppServiceProvider extends ServiceProvider 'user_id' => Auth::id(), ]); + // Simpan jejak audit + $auditTrail->save(); + } + private function logAuditTrailExclusion($model, $action) + { + // Membuat jejak audit baru + $auditTrail = new AuditTrail([ + 'model' => get_class($model), + 'model_id' => $model->corporate_id, + 'action' => $action, + 'old_values' => json_encode($model->getOriginal()), + 'new_values' => json_encode($model->getAttributes()), + 'user_id' => Auth::id(), + ]); + // Simpan jejak audit $auditTrail->save(); } diff --git a/app/Services/ClaimRequestService.php b/app/Services/ClaimRequestService.php index 08c31f1b..71626fc4 100644 --- a/app/Services/ClaimRequestService.php +++ b/app/Services/ClaimRequestService.php @@ -6,32 +6,101 @@ use App\Events\ClaimApproved; use App\Events\ClaimRequested; use App\Models\Claim; use App\Models\ClaimRequest; +use App\Models\Organization; +use App\Helpers\Helper; use App\Models\Icd; use App\Models\Member; use Carbon\Carbon; +use App\Exceptions\ImportRowException; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; + + use DB; use Str; class ClaimRequestService{ - public static function storeClaimRequest($member, $paymentType, $serviceCode, $submissionDate = null, $status = 'requested') + public static function storeClaimRequest($row = null, $code, $member, $paymentType, $serviceCode, $requestLogID, $submissionDate = null, $status = 'requested', $organization_code = null) { - try { + // try { + $organization = False; + if($organization_code){ + $organization = Organization::where('code', $organization_code)->first(); + if (!$organization){ + throw new ImportRowException(__('Code Provider Tidak ditemukan', [ + 'attribute' => 'provider_code', + 'code' => $row['provider_code'] + ]), 403, null, $row); + } + }; + DB::beginTransaction(); $claimRequestData = [ + 'code' => $code, + 'request_log_id' => $requestLogID, 'member_id' => $member->id, 'submission_date' => $submissionDate ?? now(), 'status' => $status, 'payment_type' => $paymentType, 'service_code' => $serviceCode, 'policy_id' => $member->currentPolicy->id ?? null, + 'organization_id' => $organization ? $organization->id : 0, ]; - + $claimRequest = ClaimRequest::create($claimRequestData); DB::commit(); + return $claimRequest; + // } catch (\Exception $error) { + // DB::rollBack(); + + // throw new \Exception($error); + // } + } + + public static function storeClaimManagement($row, $member, $claim_request_id){ + try { + $organization = 0; + if($row['provider_code']){ + $organization = Organization::where('code', $row['provider_code'])->first(); + if (!$organization){ + throw new ImportRowException(__('Provider Tidak ditemukan'), 0, null, $row); + } + }; + if(!$member){ + throw new ImportRowException(__('Member Tidak ditemukan'), 0, null, $row); + }; + DB::beginTransaction(); + $data = [ + 'member_id' => $member->id, + 'currency' => 'IDR', + 'plan_id' => $member->currentPlan->id, + 'total_claim' => $row['tot_amt_insurred'] ? $row['tot_amt_insurred'] : 0, + 'benefit_code' => $row['benefit_code'] ? $row['benefit_code'] : '-', + 'benefit_desc' => $row['benefit_desc'] ? $row['benefit_desc'] : '-', + 'amount_incurred' => $row['tot_amt_insurred'] ? $row['tot_amt_insurred'] : 0, + 'amount_approved' => $row['tot_amt_approved'] ? $row['tot_amt_approved'] : 0, + 'amount_not_approved' => $row['tot_amt_not_approved'] ? $row['tot_amt_not_approved'] :0, + 'excess_paid' => $row['tot_excess_paid'] ? $row['tot_excess_paid'] : 0, + 'claim_request_id' => $claim_request_id, + 'organization_id' => $organization ? $organization->id : NULL, + 'status' => 'requested' + ]; + + + $claimManagement = Claim::create($data); + + // update client id di claim request + ClaimRequest::where('id', $claim_request_id)->update([ + 'claim_id' => $claimManagement->id, + ]); + + DB::commit(); + return $claimManagement; + + } catch (\Exception $error) { DB::rollBack(); @@ -39,4 +108,73 @@ class ClaimRequestService{ } } + public static function updateClaimRequest($organization_id, $claim_request_id){ + try { + $data = [ + 'organization_id' => $organization_id + ]; + DB::commit(); + $update = ClaimRequest::where('id', $claim_request_id)->update($data); + return ClaimRequest::find($claim_request_id); + + } catch (\Exception $error) { + DB::rollBack(); + + throw new \Exception($error); + } + } + + protected function validatePlanRow($row) + { + if (empty($row['member_id'])) { + throw new ImportRowException(__('Member ID Required'), 0, null, $row); + } + } + + public function handleClaimRequestRow($row) + { + try { + $member = Member::where('member_id', $row['member_id'])->with(['currentPlan'])->first(); + if(!$member){ + throw new ImportRowException(__('Member Tidak ditemukan'), 0, null, $row); + }; + $code = $row['client_claim_id']; + $organization_id = $row['provider_code']; + $submissionDate = Helper::formatDateDB($row['admission_date']); + $paymentType = $row['claim_type']; + $status = $row['status']; + $serviceCode = $row['coverage_type']; + + $newClaimRequest = $this->storeClaimRequest( + row: $row, + code: $code, + member: $member, + paymentType: $paymentType, + serviceCode: $serviceCode, + submissionDate: $submissionDate, + status: $status, + organization_code: $organization_id + ); + + $newlyCreatedID = $newClaimRequest->id; + + $newClaimManangement = $this->storeClaimManagement($row, $member, $newlyCreatedID); + ClaimRequested::dispatch($newClaimRequest); + // Log History + $newClaimRequest->histories()->create([ + 'title' => 'New Claim Requested', + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'type' => 'info', + 'system_origin' => 'import-internal-aso' + ]); + + $claim_request_data = $row; + $this->validatePlanRow($claim_request_data); + + return $newClaimRequest; + } catch (\Exception $e) { + throw $e; + } + } + } \ No newline at end of file diff --git a/app/Services/CorporateMemberService.php b/app/Services/CorporateMemberService.php index 3fe73695..1a7c65c7 100644 --- a/app/Services/CorporateMemberService.php +++ b/app/Services/CorporateMemberService.php @@ -6,6 +6,7 @@ use App\Models\Member; use App\Models\Encounter; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; class CorporateMemberService { @@ -34,7 +35,7 @@ class CorporateMemberService 'division' => 'corporate_divisions.name', default => '' }; - if ($request->order){ + if ($request->order) { $query->getQuery()->orderBy($orderBy, $request->order); } }) @@ -44,14 +45,57 @@ class CorporateMemberService } public function getAllMemberClaimReports(int $corporateId, Request $request) + { + $limit = $request->has('per_page') ? $request->input('per_page') : 10; + + $results = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->where('corporate_employees.corporate_id', '=', $corporateId) + ->when($request->input('search'), function ($query, $search) { + $query->where(function ($query) use ($search) { + $query->orWhere('claim_requests.code', 'like', "%" . $search . "%") + ->orWhere('members.member_id', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%") + ->orWhere('corporate_divisions.name', 'like', "%" . $search . "%") + ->orWhere('claim_requests.status', 'like', "%" . $search . "%") + ->orWhere('claim_requests.submission_date', 'like', "%" . $search . "%"); + }); + }) + ->when($request->has('orderBy'), function ($query) use ($request) { + $orderBy = $request->orderBy; + $direction = $request->order ?? 'asc'; + + $query->orderBy($orderBy, $direction); + }) + ->select('members.id', 'claim_requests.code','members.member_id', 'members.name as full_name', 'corporate_divisions.name AS division_name', + DB::raw(' + CASE + WHEN claim_requests.status = "requested" THEN "requested" + WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" + ELSE "" + END AS status + '), + 'claim_requests.id AS claim_request_id', 'claim_requests.submission_date') + ->paginate($limit); + return $results; + } + + public function getAllMemberClaimSubmits(int $corporateId, Request $request) { $limit = $request->has('perPage') ? $request->input('perPage') : 10; return Member::query() - ->joinClaimRequests('right') + // ->joinClaimRequests('right') ->joinCorporateEmployees('left') ->joinCorporateDivisions('left') - ->with('currentPlan') + ->with('currentPlans') ->withSum('claims', 'total_claim') ->whereHas('employeds', function (Builder $corporateEmployee) use ($corporateId) { $corporateEmployee->where('corporate_id', $corporateId); @@ -80,11 +124,62 @@ class CorporateMemberService $query->getQuery()->orderBy('corporate_divisions.name', $request->order); } }) - ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active', 'claim_requests.id', 'claim_requests.member_id', 'claim_requests.submission_date']) + // ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active', 'claim_requests.id', 'claim_requests.member_id', 'claim_requests.submission_date']) + ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active', ]) ->paginate($limit); } public function getAllMemberAlarmCenter(int $corporateId, Request $request) + { + $limit = $request->has('perPage') ? $request->input('perPage') : 10; + $start_date = date('Y-m-d', strtotime($request->input('start_date') . ' +1 day')); + $end_date = date('Y-m-d', strtotime($request->input('end_date') . ' +1 day')); + + // dd($request); + return Member::query() + ->joinCorporateEmployees('left') + ->joinMemberPlans('left') + ->joinPlans('left') + ->with(['currentPlan', 'person']) + ->where('corporate_employees.corporate_id', $corporateId) + ->when($request->input('search'), function (Builder $query, $search) { + $query->where(function (Builder $query) use ($search) { + $query->orWhere('members.member_id', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%"); + }); + }) + ->when($request->input('start_date'), function (Builder $query, $start) { + $query->where('member_plans.start', '>=', $start); + }) + ->when($request->input('end_date'), function (Builder $query, $end) { + $query->where('member_plans.end', '<', $end); + }) + ->when($request->input('division'), function (Builder $query, $value) { + $query->where('corporate_employees.division_id', $value); + }) + ->when($request->input('status'), function (Builder $query, $value) { + $query->where('plans.active', $value); + }) + ->when($request->has('orderBy'), function (Builder $query) use ($request) { + $orderBy = match ($request->input('orderBy')) { + 'memberId' => 'member_id', + 'fullName' => 'name', + 'status' => 'active', + 'start_date' => 'member_plans.start', + 'end_date' => 'member_plans.end', + 'service' => 'plans.service_code', + + default => '' + }; + + $query->getQuery()->orderBy($orderBy, $request->order); + }) + ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'members.members_effective_date AS start_date', 'members.members_expire_date AS end_date', 'plans.active', 'plans.service_code']) + ->selectRaw("(select sum(`claims`.`total_claim`) from `claims` where `members`.`id` = `claims`.`member_id` AND `claims`.`deleted_at` IS NULL) AS `claims_sum_total_claim`") + ->paginate($limit); + } + + public function getAllMemberEmployeeData(int $corporateId, Request $request) { $limit = $request->has('perPage') ? $request->input('perPage') : 10; @@ -122,8 +217,8 @@ class CorporateMemberService ->paginate($limit); } - public function getAllEncounter(int $corporateId){ + public function getAllEncounter(int $corporateId) + { return Encounter::query()->select(['id'])->paginate(10); - } } diff --git a/app/Services/RequestLogService.php b/app/Services/RequestLogService.php new file mode 100644 index 00000000..5a5a5c64 --- /dev/null +++ b/app/Services/RequestLogService.php @@ -0,0 +1,171 @@ +first(); + if (!$organization){ + throw new ImportRowException(__('Code Provider Tidak ditemukan', [ + 'attribute' => 'provider_code', + 'code' => $row['provider_code'] + ]), 403, null, $row); + } + }; + + DB::beginTransaction(); + + $requestLogData = [ + 'code' => $code, + 'member_id' => $member->id, + 'submission_date' => $submissionDate ?? now(), + 'status' => $status, + 'payment_type' => $paymentType, + 'service_code' => $serviceCode, + 'policy_id' => $member->currentPolicy->id ?? null, + 'organization_id' => $organization ? $organization->id : 0, + 'source' => $source, + ]; + + $requestLog = RequestLog::create($requestLogData); + + DB::commit(); + + return $requestLog; + } catch (\Exception $error) { + DB::rollBack(); + + throw new \Exception($error); + } + } + + public static function storeClaimManagement($row, $member, $claim_request_id){ + try { + $organization = 0; + if($row['provider_code']){ + $organization = Organization::where('code', $row['provider_code'])->first(); + if (!$organization){ + throw new ImportRowException(__('Provider Tidak ditemukan'), 0, null, $row); + } + }; + if(!$member){ + throw new ImportRowException(__('Member Tidak ditemukan'), 0, null, $row); + }; + DB::beginTransaction(); + $data = [ + 'member_id' => $member->id, + 'currency' => 'IDR', + 'plan_id' => $member->currentPlan->id, + 'total_claim' => $row['tot_amt_insurred'] ? $row['tot_amt_insurred'] : 0, + 'benefit_code' => $row['benefit_code'] ? $row['benefit_code'] : '-', + 'benefit_desc' => $row['benefit_desc'] ? $row['benefit_desc'] : '-', + 'amount_incurred' => $row['tot_amt_insurred'] ? $row['tot_amt_insurred'] : 0, + 'amount_approved' => $row['tot_amt_approved'] ? $row['tot_amt_approved'] : 0, + 'amount_not_approved' => $row['tot_amt_not_approved'] ? $row['tot_amt_not_approved'] :0, + 'excess_paid' => $row['tot_excess_paid'] ? $row['tot_excess_paid'] : 0, + 'claim_request_id' => $claim_request_id, + 'organization_id' => $organization ? $organization->id : NULL, + 'status' => 'requested' + ]; + + + $claimManagement = Claim::create($data); + + // update client id di claim request + ClaimRequest::where('id', $claim_request_id)->update([ + 'claim_id' => $claimManagement->id, + ]); + + DB::commit(); + return $claimManagement; + + + } catch (\Exception $error) { + DB::rollBack(); + + throw new \Exception($error); + } + } + + public static function updateClaimRequest($organization_id, $claim_request_id){ + try { + $data = [ + 'organization_id' => $organization_id + ]; + DB::commit(); + $update = ClaimRequest::where('id', $claim_request_id)->update($data); + return ClaimRequest::find($claim_request_id); + + } catch (\Exception $error) { + DB::rollBack(); + + throw new \Exception($error); + } + } + + protected function validatePlanRow($row) + { + if (empty($row['member_id'])) { + throw new ImportRowException(__('Member ID Required'), 0, null, $row); + } + } + + public function handleRequestLogRow($row) + { + try { + $requestLog = RequestLog::where('id', $row['id'])->first(); + if(!$requestLog){ + throw new ImportRowException(__('Request LOG Tidak ditemukan'), 0, null, $row); + }; + $status = RequestLog::$status; + + if (!array_key_exists($row['status'], $status)){ + throw new ImportRowException(__('Status Request LOG Tidak ditemukan'), 0, null, $row); + } + + // Update Request LOG Status & Link with Claim + DB::beginTransaction(); + $requestLog->update([ + 'status' => $row['status'] + ]); + $requestLog->save(); + DB::commit(); + return $requestLog; + } catch (\Exception $e) { + DB::rollBack(); + + throw $e; + } + } + +} \ No newline at end of file diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore old mode 100644 new mode 100755 diff --git a/config/database.php b/config/database.php index e529ac2f..2b1a1a86 100644 --- a/config/database.php +++ b/config/database.php @@ -56,7 +56,7 @@ return [ 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, - 'strict' => env('DB_STRICT', true), + 'strict' => env('DB_STRICT', false), 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), diff --git a/database/migrations/2023_09_18_145312_create_filesdoc_table.php b/database/migrations/2023_09_18_145312_create_filesdoc_table.php new file mode 100644 index 00000000..004141eb --- /dev/null +++ b/database/migrations/2023_09_18_145312_create_filesdoc_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->bigInteger('corporate_id'); + $table->string('original_name', 255); + $table->string('path', 255); + $table->bigInteger('created_by'); + $table->bigInteger('updated_by'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('files_doc'); + } +}; diff --git a/database/migrations/2023_09_18_154540_add_active_to_icd.php b/database/migrations/2023_09_18_154540_add_active_to_icd.php new file mode 100644 index 00000000..22257349 --- /dev/null +++ b/database/migrations/2023_09_18_154540_add_active_to_icd.php @@ -0,0 +1,32 @@ +integer('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('icd', function (Blueprint $table) { + $table->dropColumn('active'); + }); + } +}; diff --git a/database/migrations/2023_09_19_111722_add_field_status_download_to_files_doc.php b/database/migrations/2023_09_19_111722_add_field_status_download_to_files_doc.php new file mode 100644 index 00000000..48677b8d --- /dev/null +++ b/database/migrations/2023_09_19_111722_add_field_status_download_to_files_doc.php @@ -0,0 +1,32 @@ +tinyInteger('status_download')->default(0)->after('path'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('files_doc', function (Blueprint $table) { + $table->dropColumn('status_download'); + }); + } +}; diff --git a/database/migrations/2023_09_19_164907_create_icd_template.php b/database/migrations/2023_09_19_164907_create_icd_template.php new file mode 100644 index 00000000..9174bc8d --- /dev/null +++ b/database/migrations/2023_09_19_164907_create_icd_template.php @@ -0,0 +1,34 @@ +id(); + $table->string('name'); + $table->string('code'); + $table->string('description'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('icd_template'); + } +}; diff --git a/database/migrations/2023_09_20_090317_add_active_to_icd_template.php b/database/migrations/2023_09_20_090317_add_active_to_icd_template.php new file mode 100644 index 00000000..977af55f --- /dev/null +++ b/database/migrations/2023_09_20_090317_add_active_to_icd_template.php @@ -0,0 +1,32 @@ +integer('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('icd_template', function (Blueprint $table) { + $table->dropColumn('active'); + }); + } +}; diff --git a/database/migrations/2023_09_20_152738_add_icd_template_id_to_icd.php b/database/migrations/2023_09_20_152738_add_icd_template_id_to_icd.php new file mode 100644 index 00000000..603b9104 --- /dev/null +++ b/database/migrations/2023_09_20_152738_add_icd_template_id_to_icd.php @@ -0,0 +1,32 @@ +integer('icd_template_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('icd', function (Blueprint $table) { + $table->dropColumn('icd_template_id'); + }); + } +}; diff --git a/database/migrations/2023_09_21_171455_add_active_to_exclusion.php b/database/migrations/2023_09_21_171455_add_active_to_exclusion.php new file mode 100644 index 00000000..127f2dcb --- /dev/null +++ b/database/migrations/2023_09_21_171455_add_active_to_exclusion.php @@ -0,0 +1,32 @@ +integer('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('exclusions', function (Blueprint $table) { + $table->dropColumn('active'); + }); + } +}; diff --git a/database/migrations/2023_09_22_095728_create_exclusion_import_table.php b/database/migrations/2023_09_22_095728_create_exclusion_import_table.php new file mode 100644 index 00000000..2554f2ca --- /dev/null +++ b/database/migrations/2023_09_22_095728_create_exclusion_import_table.php @@ -0,0 +1,34 @@ +id(); + $table->integer('corporate_id'); + $table->string('file_name'); + $table->string('file_path'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('exclusion_imports'); + } +}; diff --git a/database/migrations/2023_09_22_111147_create_formularium_templates2_table.php b/database/migrations/2023_09_22_111147_create_formularium_templates2_table.php new file mode 100644 index 00000000..96cec199 --- /dev/null +++ b/database/migrations/2023_09_22_111147_create_formularium_templates2_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('name'); + $table->string('description'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('formularium_templates'); + } +}; diff --git a/database/migrations/2023_09_22_143511_add_formularium_template_id_to_formularium.php b/database/migrations/2023_09_22_143511_add_formularium_template_id_to_formularium.php new file mode 100644 index 00000000..f06d93aa --- /dev/null +++ b/database/migrations/2023_09_22_143511_add_formularium_template_id_to_formularium.php @@ -0,0 +1,32 @@ +integer('formularium_template_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('formulariums', function (Blueprint $table) { + $table->dropColumn('formularium_template_id'); + }); + } +}; diff --git a/database/migrations/2023_09_22_170828_add_column_to_formularium.php b/database/migrations/2023_09_22_170828_add_column_to_formularium.php new file mode 100644 index 00000000..59ed19b4 --- /dev/null +++ b/database/migrations/2023_09_22_170828_add_column_to_formularium.php @@ -0,0 +1,52 @@ +text('description')->after('name');; + $table->string('manufacturer')->after('description'); + $table->string('category_name')->after('manufacturer'); + $table->string('kategori_obat')->after('category_name'); + $table->string('uom')->after('kategori_obat'); + $table->text('general_indication')->after('uom'); + $table->string('atc_code')->after('general_indication'); + $table->string('class')->after('atc_code'); + $table->string('bpom_registration')->after('class'); + $table->string('classifications')->after('bpom_registration'); + $table->string('cat_for')->after('classifications'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('formulariums', function (Blueprint $table) { + $table->dropColumn('description'); + $table->dropColumn('manufacturer'); + $table->dropColumn('category_name'); + $table->dropColumn('kategori_obat'); + $table->dropColumn('uom'); + $table->dropColumn('general_indication'); + $table->dropColumn('atc_code'); + $table->dropColumn('class'); + $table->dropColumn('bpom_registration'); + $table->dropColumn('classifications'); + $table->dropColumn('cat_for'); + }); + } +}; diff --git a/database/migrations/2023_09_25_091157_add_column_to_formularium.php b/database/migrations/2023_09_25_091157_add_column_to_formularium.php new file mode 100644 index 00000000..9fa87d61 --- /dev/null +++ b/database/migrations/2023_09_25_091157_add_column_to_formularium.php @@ -0,0 +1,32 @@ +text('composition')->after('general_indication'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('formulariums', function (Blueprint $table) { + $table->dropColumn('composition'); + }); + } +}; diff --git a/database/migrations/2023_09_25_133336_add_column_to_corporate_formulariums.php b/database/migrations/2023_09_25_133336_add_column_to_corporate_formulariums.php new file mode 100644 index 00000000..d1fe8ef3 --- /dev/null +++ b/database/migrations/2023_09_25_133336_add_column_to_corporate_formulariums.php @@ -0,0 +1,32 @@ +integer('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('corporate_formulariums', function (Blueprint $table) { + $table->dropColumn('active'); + }); + } +}; diff --git a/database/migrations/2023_09_26_100614_add_column_to_claims.php b/database/migrations/2023_09_26_100614_add_column_to_claims.php new file mode 100644 index 00000000..a37f739a --- /dev/null +++ b/database/migrations/2023_09_26_100614_add_column_to_claims.php @@ -0,0 +1,34 @@ +char('uuid')->after('id'); + $table->string('claim_request_id')->after('code'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claims', function (Blueprint $table) { + $table->dropColumn('uuid'); + $table->dropColumn('claim_request_id'); + }); + } +}; diff --git a/database/migrations/2023_10_11_131156_create_claim_logs_table.php b/database/migrations/2023_10_11_131156_create_claim_logs_table.php new file mode 100644 index 00000000..dd43ab81 --- /dev/null +++ b/database/migrations/2023_10_11_131156_create_claim_logs_table.php @@ -0,0 +1,37 @@ +id(); + $table->bigInteger('claim_request_id'); + $table->string('status', 255); + $table->dateTime('date'); + $table->text('description')->nullable(); + $table->text('system_origin')->nullable(); + $table->bigInteger('created_by'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_logs'); + } +}; diff --git a/database/migrations/2023_10_11_145555_create_claim_request_files_table.php b/database/migrations/2023_10_11_145555_create_claim_request_files_table.php new file mode 100644 index 00000000..73e07d98 --- /dev/null +++ b/database/migrations/2023_10_11_145555_create_claim_request_files_table.php @@ -0,0 +1,36 @@ +id(); + $table->bigInteger('claim_request_id'); + $table->dateTime('date'); + $table->string('type', 255); + $table->text('description')->nullable(); + $table->bigInteger('created_by'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_request_files'); + } +}; diff --git a/database/migrations/2023_10_19_132434_create_corporate_hospitals.php b/database/migrations/2023_10_19_132434_create_corporate_hospitals.php new file mode 100644 index 00000000..ae434a69 --- /dev/null +++ b/database/migrations/2023_10_19_132434_create_corporate_hospitals.php @@ -0,0 +1,42 @@ +id(); + $table->bigInteger('corporate_id'); + $table->bigInteger('organization_id'); + $table->string('code', 255); + $table->string('name', 255); + $table->text('description')->nullable(); + $table->tinyInteger('active')->default(1); + $table->text('reason')->nullable(); + $table->timestamps(); + $table->softDeletes(); + $table->bigInteger('created_by')->nullable(); + $table->bigInteger('updated_by')->nullable(); + $table->bigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('corporate_hospitals'); + } +}; diff --git a/database/migrations/2023_10_20_091646_rename_feild_formularium_table.php b/database/migrations/2023_10_20_091646_rename_feild_formularium_table.php new file mode 100644 index 00000000..8a781ac3 --- /dev/null +++ b/database/migrations/2023_10_20_091646_rename_feild_formularium_table.php @@ -0,0 +1,32 @@ +renameColumn('formularium_id', 'formularium_template_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('corporate_formulariums', function (Blueprint $table) { + $table->renameColumn('formularium_template_id', 'formularium_id'); + }); + } +}; diff --git a/database/migrations/2023_10_21_115939_add_column_reason_to_exclusion.php b/database/migrations/2023_10_21_115939_add_column_reason_to_exclusion.php new file mode 100644 index 00000000..eb08cb27 --- /dev/null +++ b/database/migrations/2023_10_21_115939_add_column_reason_to_exclusion.php @@ -0,0 +1,32 @@ +string('reason')->after('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('exclusions', function (Blueprint $table) { + $table->dropColumn('reason'); + }); + } +}; diff --git a/database/migrations/2023_10_23_114257_add_column_active_to_drugs.php b/database/migrations/2023_10_23_114257_add_column_active_to_drugs.php new file mode 100644 index 00000000..04b9f3b0 --- /dev/null +++ b/database/migrations/2023_10_23_114257_add_column_active_to_drugs.php @@ -0,0 +1,34 @@ +text('reason')->nullable()->after('status'); + $table->tinyInteger('active')->default(1)->after('reason'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('drugs', function (Blueprint $table) { + $table->dropColumn('reason'); + $table->dropColumn('active'); + }); + } +}; diff --git a/database/migrations/2023_10_24_130726_add_column_organizations_to_claim.php b/database/migrations/2023_10_24_130726_add_column_organizations_to_claim.php new file mode 100644 index 00000000..d1c8d5e8 --- /dev/null +++ b/database/migrations/2023_10_24_130726_add_column_organizations_to_claim.php @@ -0,0 +1,32 @@ +integer('organization_id')->after('benefit_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claims', function (Blueprint $table) { + $table->dropColumn('organization_id'); + }); + } +}; diff --git a/database/migrations/2023_10_25_095323_add_column_organizations_to_claim_request.php b/database/migrations/2023_10_25_095323_add_column_organizations_to_claim_request.php new file mode 100644 index 00000000..cc95fc86 --- /dev/null +++ b/database/migrations/2023_10_25_095323_add_column_organizations_to_claim_request.php @@ -0,0 +1,32 @@ +integer('organization_id')->after('claim_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claim_request', function (Blueprint $table) { + $table->dropColumn('organization_id'); + }); + } +}; diff --git a/database/migrations/2023_10_25_150556_add_column_to_claims.php b/database/migrations/2023_10_25_150556_add_column_to_claims.php new file mode 100644 index 00000000..0eb531cd --- /dev/null +++ b/database/migrations/2023_10_25_150556_add_column_to_claims.php @@ -0,0 +1,42 @@ +string('benefit_code')->after('organization_id'); + $table->string('benefit_desc')->after('benefit_code'); + $table->integer('amount_incurred')->after('benefit_desc'); + $table->integer('amount_approved')->after('amount_incurred'); + $table->integer('amount_not_approved')->after('amount_approved'); + $table->integer('excess_paid')->after('amount_not_approved'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claims', function (Blueprint $table) { + $table->dropColumn('benefit_code'); + $table->dropColumn('benefit_desc'); + $table->dropColumn('amount_incurred'); + $table->dropColumn('amount_approved'); + $table->dropColumn('amount_not_approved'); + $table->dropColumn('excess_paid'); + }); + } +}; diff --git a/database/migrations/2023_10_26_085839_add_column_invoice_date_to_claim_requests.php b/database/migrations/2023_10_26_085839_add_column_invoice_date_to_claim_requests.php new file mode 100644 index 00000000..aca5eb06 --- /dev/null +++ b/database/migrations/2023_10_26_085839_add_column_invoice_date_to_claim_requests.php @@ -0,0 +1,32 @@ +dateTime('invoice_date')->nullable()->after('claim_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claim_requests', function (Blueprint $table) { + $table->dropColumn('invoice_date'); + }); + } +}; diff --git a/database/migrations/2023_10_26_110846_create_claim_history_care_table.php b/database/migrations/2023_10_26_110846_create_claim_history_care_table.php new file mode 100644 index 00000000..93c60d3f --- /dev/null +++ b/database/migrations/2023_10_26_110846_create_claim_history_care_table.php @@ -0,0 +1,42 @@ +id(); + $table->timestamps(); + $table->string('service_code'); + $table->date('admision_date'); + $table->date('discharge_date'); + $table->integer('claim_id'); + $table->integer('organization_id'); + $table->integer('practitioner_id'); + $table->string('medical_record_number'); + $table->string('symptoms'); + $table->string('sign'); + $table->integer('main_diagnosis_id'); + $table->integer('status'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_history_cares'); + } +}; diff --git a/database/migrations/2023_10_26_115410_create_diagnosis_secondary_claim_history_care_table.php b/database/migrations/2023_10_26_115410_create_diagnosis_secondary_claim_history_care_table.php new file mode 100644 index 00000000..02fa5dc2 --- /dev/null +++ b/database/migrations/2023_10_26_115410_create_diagnosis_secondary_claim_history_care_table.php @@ -0,0 +1,34 @@ +id(); + $table->timestamps(); + $table->integer('claim_history_care_id'); + $table->integer('icd_id'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('diagnosis_secondary_claim_history_care'); + } +}; diff --git a/database/migrations/2023_10_27_111432_create_claim_daily_monitoring_tables.php b/database/migrations/2023_10_27_111432_create_claim_daily_monitoring_tables.php new file mode 100644 index 00000000..55db727d --- /dev/null +++ b/database/migrations/2023_10_27_111432_create_claim_daily_monitoring_tables.php @@ -0,0 +1,39 @@ +id(); + $table->integer('claim_id'); + $table->text('subject'); + $table->decimal('body_temperature', 11, 2); + $table->decimal('respiration_rate', 11, 2); + $table->decimal('sistole', 11, 2); + $table->decimal('diastole', 11, 2); + $table->text('analysis'); + $table->text('complaints'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_daily_monitoring'); + } +}; diff --git a/database/migrations/2023_10_27_112206_create_medical_plan_table.php b/database/migrations/2023_10_27_112206_create_medical_plan_table.php new file mode 100644 index 00000000..a5b6ea42 --- /dev/null +++ b/database/migrations/2023_10_27_112206_create_medical_plan_table.php @@ -0,0 +1,33 @@ +id(); + $table->bigInteger('claim_daily_monitoring_id'); + $table->text('plan'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('medical_plan'); + } +}; diff --git a/database/migrations/2023_10_27_134210_add_column_to_formularium_templates.php b/database/migrations/2023_10_27_134210_add_column_to_formularium_templates.php new file mode 100644 index 00000000..2b9830d2 --- /dev/null +++ b/database/migrations/2023_10_27_134210_add_column_to_formularium_templates.php @@ -0,0 +1,32 @@ +tinyInteger('active')->default(1)->after('description'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('formularium_templates', function (Blueprint $table) { + $table->dropColumn('active'); + }); + } +}; diff --git a/database/migrations/2023_10_28_160127_create_laboratorium_result_table.php b/database/migrations/2023_10_28_160127_create_laboratorium_result_table.php new file mode 100644 index 00000000..b0a2d9f6 --- /dev/null +++ b/database/migrations/2023_10_28_160127_create_laboratorium_result_table.php @@ -0,0 +1,35 @@ +id(); + $table->integer('claim_id'); + $table->string('date'); + $table->text('location'); + $table->text('examination'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('laboratorium_result'); + } +}; diff --git a/database/migrations/2023_10_30_115027_create_claim_services_table.php b/database/migrations/2023_10_30_115027_create_claim_services_table.php new file mode 100644 index 00000000..dd12ed2e --- /dev/null +++ b/database/migrations/2023_10_30_115027_create_claim_services_table.php @@ -0,0 +1,37 @@ +id(); + $table->bigInteger('claim_request_id'); + $table->bigInteger('service_id'); + $table->bigInteger('hospital_id'); + $table->dateTime('addmission_date'); + $table->dateTime('discharge_date'); + $table->bigInteger('created_by')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_services'); + } +}; diff --git a/database/migrations/2023_10_30_133300_create_claim_service_benefits_table.php b/database/migrations/2023_10_30_133300_create_claim_service_benefits_table.php new file mode 100644 index 00000000..1c8a2bcb --- /dev/null +++ b/database/migrations/2023_10_30_133300_create_claim_service_benefits_table.php @@ -0,0 +1,34 @@ +id(); + $table->bigInteger('claim_service_id'); + $table->bigInteger('benefit_id'); + $table->bigInteger('created_by')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_service_benefits'); + } +}; diff --git a/database/migrations/2023_11_03_110023_add_column_to_claim_service_benefits.php b/database/migrations/2023_11_03_110023_add_column_to_claim_service_benefits.php new file mode 100644 index 00000000..9e313d16 --- /dev/null +++ b/database/migrations/2023_11_03_110023_add_column_to_claim_service_benefits.php @@ -0,0 +1,38 @@ +integer('amount_incurred')->default(0)->after('benefit_id'); + $table->integer('amount_approved')->default(0)->after('amount_incurred'); + $table->integer('amount_not_approved')->default(0)->after('amount_approved'); + $table->integer('excess_paid')->default(0)->after('amount_not_approved'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claim_service_benefits', function (Blueprint $table) { + $table->dropColumn('amount_incurred'); + $table->dropColumn('amount_approved'); + $table->dropColumn('amount_not_approved'); + $table->dropColumn('excess_paid'); + }); + } +}; diff --git a/database/migrations/2023_11_07_124118_add_columns_corporate_id_to_users_table.php b/database/migrations/2023_11_07_124118_add_columns_corporate_id_to_users_table.php new file mode 100644 index 00000000..78f562be --- /dev/null +++ b/database/migrations/2023_11_07_124118_add_columns_corporate_id_to_users_table.php @@ -0,0 +1,32 @@ +integer('corporate_id')->default(0)->after('phone'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('corporate_id'); + }); + } +}; diff --git a/database/migrations/2023_11_20_103217_create_notifications_table.php b/database/migrations/2023_11_20_103217_create_notifications_table.php new file mode 100644 index 00000000..aeca488a --- /dev/null +++ b/database/migrations/2023_11_20_103217_create_notifications_table.php @@ -0,0 +1,38 @@ +id(); + $table->bigInteger('hospital_id'); + $table->string('title', 255); + $table->string('description', 255); + $table->string('avatar', 255)->nullable(); + $table->integer('type'); + $table->boolean('isUnRead')->default(false); + $table->bigInteger('created_by')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('notifications'); + } +}; diff --git a/database/migrations/2023_11_20_104805_create_notification_types_table.php b/database/migrations/2023_11_20_104805_create_notification_types_table.php new file mode 100644 index 00000000..b1271fa8 --- /dev/null +++ b/database/migrations/2023_11_20_104805_create_notification_types_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('type', 255); + $table->string('description', 255); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('notification_types'); + } +}; diff --git a/database/migrations/2023_11_27_155931_create_request_log_table.php b/database/migrations/2023_11_27_155931_create_request_log_table.php new file mode 100644 index 00000000..a61d01e8 --- /dev/null +++ b/database/migrations/2023_11_27_155931_create_request_log_table.php @@ -0,0 +1,45 @@ +id(); + $table->uuid('uuid'); + $table->string('code')->index(); + $table->dateTime('submission_date')->nullable(); + $table->foreignId('member_id'); + $table->string('payment_type'); + $table->string('service_code'); + $table->foreignId('policy_id'); + $table->string('status')->nullable(); + $table->string('source')->nullable(); + + $table->timestamps(); + $table->softDeletes(); + $table->unsignedBigInteger('created_by')->nullable()->index(); + $table->unsignedBigInteger('updated_by')->nullable()->index(); + $table->unsignedBigInteger('deleted_by')->nullable()->index(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('request_logs'); + } +}; diff --git a/database/migrations/2023_11_28_092019_add_columns_organization_id_to_table_request_logs.php b/database/migrations/2023_11_28_092019_add_columns_organization_id_to_table_request_logs.php new file mode 100644 index 00000000..a64cd329 --- /dev/null +++ b/database/migrations/2023_11_28_092019_add_columns_organization_id_to_table_request_logs.php @@ -0,0 +1,32 @@ +integer('organization_id')->default(0)->after('policy_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('organization_id'); + }); + } +}; diff --git a/database/migrations/2023_11_28_104608_add_columns_suspended_to_members_table.php b/database/migrations/2023_11_28_104608_add_columns_suspended_to_members_table.php new file mode 100644 index 00000000..57502a1f --- /dev/null +++ b/database/migrations/2023_11_28_104608_add_columns_suspended_to_members_table.php @@ -0,0 +1,32 @@ +string('suspended')->after('active')->default('N'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('members', function (Blueprint $table) { + $table->dropColumn('suspended'); + }); + } +}; diff --git a/database/migrations/2023_11_30_092154_add_columns_to_request_logs.php b/database/migrations/2023_11_30_092154_add_columns_to_request_logs.php new file mode 100644 index 00000000..94df90fd --- /dev/null +++ b/database/migrations/2023_11_30_092154_add_columns_to_request_logs.php @@ -0,0 +1,35 @@ +integer('final_log') + ->default(0) + ->after('status') + ->comment('untuk flag request masuk ke final, jika 0 masih request dan 1 itu sudah masuk ke finallog'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('final_log'); + }); + } +}; diff --git a/database/migrations/2023_11_30_101523_add_columns_to_request_logs.php b/database/migrations/2023_11_30_101523_add_columns_to_request_logs.php new file mode 100644 index 00000000..ded8a874 --- /dev/null +++ b/database/migrations/2023_11_30_101523_add_columns_to_request_logs.php @@ -0,0 +1,32 @@ +string('status_final_log')->after('status')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('status_final_log'); + }); + } +}; diff --git a/database/migrations/2023_12_09_090301_create_organization_user.php b/database/migrations/2023_12_09_090301_create_organization_user.php new file mode 100644 index 00000000..320d9227 --- /dev/null +++ b/database/migrations/2023_12_09_090301_create_organization_user.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('user_id'); + $table->foreignId('organization_id'); + $table->integer('status')->nullable()->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('organization_user'); + } +}; diff --git a/database/migrations/2023_12_11_100126_create_request_log_benefits_table.php b/database/migrations/2023_12_11_100126_create_request_log_benefits_table.php new file mode 100644 index 00000000..070b64d9 --- /dev/null +++ b/database/migrations/2023_12_11_100126_create_request_log_benefits_table.php @@ -0,0 +1,38 @@ +id(); + $table->timestamps(); + $table->foreignId('request_log_id'); + $table->foreignId('benefit_id'); + $table->integer('amount_incurred'); + $table->integer('amount_approved'); + $table->integer('amount_not_approved'); + $table->integer('excess_paid'); + $table->string('keterangan'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('request_log_benefits'); + } +}; diff --git a/database/migrations/2023_12_13_091954_create_request_log_medicines_table.php b/database/migrations/2023_12_13_091954_create_request_log_medicines_table.php new file mode 100644 index 00000000..3013006a --- /dev/null +++ b/database/migrations/2023_12_13_091954_create_request_log_medicines_table.php @@ -0,0 +1,34 @@ +id(); + $table->timestamps(); + $table->foreignId('request_log_id'); + $table->integer('price'); + $table->string('medicine'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('request_log_medicines'); + } +}; diff --git a/database/migrations/2023_12_15_153059_add_columns_to_request_logs.php b/database/migrations/2023_12_15_153059_add_columns_to_request_logs.php new file mode 100644 index 00000000..81bb25c6 --- /dev/null +++ b/database/migrations/2023_12_15_153059_add_columns_to_request_logs.php @@ -0,0 +1,32 @@ +dateTime('discharge_date')->after('submission_date')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('discharge_date'); + }); + } +}; diff --git a/database/migrations/2023_12_15_154820_create_request_log_daily_monitoring_table.php b/database/migrations/2023_12_15_154820_create_request_log_daily_monitoring_table.php new file mode 100644 index 00000000..f09cf94e --- /dev/null +++ b/database/migrations/2023_12_15_154820_create_request_log_daily_monitoring_table.php @@ -0,0 +1,42 @@ +id(); + $table->foreignId('request_log_id'); + $table->timestamps(); + $table->text('subject'); + $table->decimal('body_temperature', 11, 2); + $table->decimal('respiration_rate', 11, 2); + $table->decimal('sistole', 11, 2); + $table->decimal('diastole', 11, 2); + $table->text('analysis'); + $table->text('complaints'); + $table->dateTime('lab_date')->nullable(); + $table->string('provider')->nullable(); + $table->string('examination')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('request_log_daily_monitorings'); + } +}; diff --git a/database/migrations/2023_12_20_184642_add_column_to_claim_requests.php b/database/migrations/2023_12_20_184642_add_column_to_claim_requests.php new file mode 100644 index 00000000..f556686a --- /dev/null +++ b/database/migrations/2023_12_20_184642_add_column_to_claim_requests.php @@ -0,0 +1,32 @@ +bigInteger('request_log_id')->after('code'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claim_requests', function (Blueprint $table) { + $table->dropColumn('request_log_id'); + }); + } +}; diff --git a/database/seeders/ServiceSeeder.php b/database/seeders/ServiceSeeder.php index f98f6bf2..95d0443a 100644 --- a/database/seeders/ServiceSeeder.php +++ b/database/seeders/ServiceSeeder.php @@ -19,9 +19,9 @@ class ServiceSeeder extends Seeder $services = [ [ 'id' => 1, - 'name' => 'Out Patient', + 'name' => 'Outpatient', 'code' => 'OP', - 'description' => 'Out Patient', + 'description' => 'Outpatient', ], [ 'id' => 2, diff --git a/frontend/client-portal/.env.development b/frontend/client-portal/.env.development index ced427a5..1292c8a9 100644 --- a/frontend/client-portal/.env.development +++ b/frontend/client-portal/.env.development @@ -2,6 +2,8 @@ GENERATE_SOURCEMAP=false PORT=8083 -REACT_APP_HOST_API_URL="http://localhost:8000" +REACT_APP_HOST_API_URL="https://aso-api.linksehat.dev/api/client" +# VITE_API_URL="https://aso-api.linksehat.dev/api/client" VITE_API_URL="http://localhost:8000/api/client" + diff --git a/frontend/client-portal/package.json b/frontend/client-portal/package.json index 811bf1c2..b9acad50 100644 --- a/frontend/client-portal/package.json +++ b/frontend/client-portal/package.json @@ -9,6 +9,7 @@ "lint:fix": "eslint --fix --ext .ts,.tsx ./src", "start": "vite --port=3000", "build": "vite build --mode production && cp .htaccess build/.htaccess && rm -f -r ../../public/client-portal && cp -r build ../../public/client-portal", + "build-staging": "vite build --mode staging && cp .htaccess build/.htaccess && rm -f -r ../../public/client-portal-staging && cp -r build ../../public/client-portal-staging", "serve": "vite preview", "clear-all": "rm -rf build node_modules", "re-start": "rm -rf build node_modules && yarn install && yarn start", @@ -37,6 +38,7 @@ ] }, "dependencies": { + "@ajoelp/json-to-formdata": "^1.5.0", "@date-io/date-fns": "^2.16.0", "@emotion/cache": "^11.10.5", "@emotion/react": "^11.10.6", @@ -50,6 +52,7 @@ "@mui/utils": "^5.11.13", "@mui/x-data-grid": "^5.17.26", "@mui/x-date-pickers": "5.0.0-beta.2", + "@reduxjs/toolkit": "^1.9.7", "@vitejs/plugin-react": "^1.3.2", "apexcharts": "^3.37.2", "axios": "^0.27.2", @@ -76,6 +79,7 @@ "react-lazy-load-image-component": "^1.5.6", "react-number-format": "^5.1.4", "react-quill": "2.0.0-beta.4", + "react-redux": "^8.1.3", "react-router": "^6.9.0", "react-router-dom": "^6.9.0", "simplebar": "^5.3.9", diff --git a/frontend/client-portal/pnpm-lock.yaml b/frontend/client-portal/pnpm-lock.yaml index 5661a2fe..587278ef 100644 --- a/frontend/client-portal/pnpm-lock.yaml +++ b/frontend/client-portal/pnpm-lock.yaml @@ -1,6 +1,13 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + dependencies: + '@ajoelp/json-to-formdata': + specifier: ^1.5.0 + version: 1.5.0 '@date-io/date-fns': specifier: ^2.16.0 version: 2.16.0(date-fns@2.29.3) @@ -40,6 +47,9 @@ dependencies: '@mui/x-date-pickers': specifier: 5.0.0-beta.2 version: 5.0.0-beta.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@mui/material@5.11.14)(@mui/system@5.11.14)(date-fns@2.29.3)(react-dom@17.0.2)(react@17.0.2) + '@reduxjs/toolkit': + specifier: ^1.9.7 + version: 1.9.7(react-redux@8.1.3)(react@17.0.2) '@vitejs/plugin-react': specifier: ^1.3.2 version: 1.3.2 @@ -82,6 +92,9 @@ dependencies: numeral: specifier: ^2.0.6 version: 2.0.6 + pnpm: + specifier: ^8.6.9 + version: 8.8.0 pusher-js: specifier: ^8.0.2 version: 8.0.2 @@ -115,6 +128,9 @@ dependencies: react-quill: specifier: 2.0.0-beta.4 version: 2.0.0-beta.4(react-dom@17.0.2)(react@17.0.2) + react-redux: + specifier: ^8.1.3 + version: 8.1.3(@types/react-dom@17.0.19)(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1) react-router: specifier: ^6.9.0 version: 6.9.0(react@17.0.2) @@ -228,6 +244,12 @@ devDependencies: packages: + /@ajoelp/json-to-formdata@1.5.0: + resolution: {integrity: sha512-nrlfeTSL0X0dtx5r2KpzPiqLSIQquiiJjUKsQAKzWaCmO2QoYZCyb5ENZwF3YoffKronOCJr25mxaD8JRJmK8w==} + dependencies: + lodash: 4.17.21 + dev: false + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} @@ -1676,6 +1698,7 @@ packages: /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true dev: false optional: true @@ -2319,6 +2342,25 @@ packages: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} dev: false + /@reduxjs/toolkit@1.9.7(react-redux@8.1.3)(react@17.0.2): + resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 9.0.21 + react: 17.0.2 + react-redux: 8.1.3(@types/react-dom@17.0.19)(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1) + redux: 4.2.1 + redux-thunk: 2.4.2(redux@4.2.1) + reselect: 4.1.8 + dev: false + /@remix-run/router@1.4.0: resolution: {integrity: sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==} engines: {node: '>=14'} @@ -2555,6 +2597,13 @@ packages: '@types/range-parser': 1.2.4 dev: false + /@types/hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw==} + dependencies: + '@types/react': 17.0.53 + hoist-non-react-statics: 3.3.2 + dev: false + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true @@ -2602,7 +2651,6 @@ packages: resolution: {integrity: sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==} dependencies: '@types/react': 17.0.53 - dev: true /@types/react-is@17.0.3: resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} @@ -2651,6 +2699,10 @@ packages: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: true + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + /@typescript-eslint/eslint-plugin@5.56.0(@typescript-eslint/parser@5.56.0)(eslint@8.36.0)(typescript@4.9.5): resolution: {integrity: sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4450,6 +4502,10 @@ packages: engines: {node: '>= 4'} dev: true + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -5102,6 +5158,12 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /pnpm@8.8.0: + resolution: {integrity: sha512-eY5rMiZpzmPI2oVr1irR97bzb036oKwCWvK91wDQndXcqUPlytPtrF0bO668Syw/uA+7hTf5NnM8Mr4ux4BRRA==} + engines: {node: '>=16.14'} + hasBin: true + dev: false + /popmotion@11.0.3: resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} dependencies: @@ -5318,6 +5380,40 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /react-redux@8.1.3(@types/react-dom@17.0.19)(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1): + resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: ^4 || ^5.0.0-beta.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@types/hoist-non-react-statics': 3.3.2 + '@types/react': 17.0.53 + '@types/react-dom': 17.0.19 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-is: 18.2.0 + redux: 4.2.1 + use-sync-external-store: 1.2.0(react@17.0.2) + dev: false + /react-refresh@0.13.0: resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} engines: {node: '>=0.10.0'} @@ -5368,6 +5464,20 @@ packages: object-assign: 4.1.1 dev: false + /redux-thunk@2.4.2(redux@4.2.1): + resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + peerDependencies: + redux: ^4 + dependencies: + redux: 4.2.1 + dev: false + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.21.0 + dev: false + /regenerate-unicode-properties@10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} @@ -5424,6 +5534,10 @@ packages: resolution: {integrity: sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==} dev: false + /reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + dev: false + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5986,6 +6100,14 @@ packages: punycode: 2.3.0 dev: true + /use-sync-external-store@1.2.0(react@17.0.2): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 17.0.2 + dev: false + /vite-plugin-pwa@0.12.8(vite@3.2.5)(workbox-build@6.5.4)(workbox-window@6.5.4): resolution: {integrity: sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA==} peerDependencies: diff --git a/frontend/client-portal/public/icons/ic_gmail.svg b/frontend/client-portal/public/icons/ic_gmail.svg new file mode 100644 index 00000000..c71a7032 --- /dev/null +++ b/frontend/client-portal/public/icons/ic_gmail.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frontend/client-portal/public/images/gmail.png b/frontend/client-portal/public/images/gmail.png new file mode 100644 index 00000000..fe8d5f99 Binary files /dev/null and b/frontend/client-portal/public/images/gmail.png differ diff --git a/frontend/client-portal/src/@types/claim-submit.ts b/frontend/client-portal/src/@types/claim-submit.ts new file mode 100644 index 00000000..ab368d7c --- /dev/null +++ b/frontend/client-portal/src/@types/claim-submit.ts @@ -0,0 +1,8 @@ +export type CardSubmit = { + rows?: Array; + id: number, + name: string, + member_id: string, + usesage_limit: number, + limit: number +} \ No newline at end of file diff --git a/frontend/client-portal/src/@types/corporates.ts b/frontend/client-portal/src/@types/corporates.ts new file mode 100644 index 00000000..f8aaf228 --- /dev/null +++ b/frontend/client-portal/src/@types/corporates.ts @@ -0,0 +1,198 @@ +// ---------------------------------------------------------------------- + +export type Corporate = { + id: number; + code: string; + name?: string; + reason?: string; + payor_id?: string; + welcome_message?: string; + automatic_linking?: boolean; + linking_rules?: string; + type?: string; + avatar_url?: string; + help_text?: string; + logo?: any; + logo_url?: string; + active: boolean | number; + divisions?: Division[]; + employees?: Employee[]; + current_policy?: Policy; +}; + +export type Division = { + id: number; + corporate_id: number; + code: string; + name?: string; +} + +export type Employee = { + id: number; + name: string; +} + +export type Policy = { + id: number; + corporate_id: number; + code: string; + total_premi: number; + minimal_deposit_percentage: number; + minimal_deposit_net: number; + minimal_alert_percentage: number; + minimal_alert_net: number; + minimal_stop_service_percentage: number; + minimal_stop_service_net: number; + start: string | Date; + end: string | Date; +} + +export type CorporatePlan = { + id: number; + corporate_id: number; + code: string; + name: string; + description: string | null; + active: boolean | number; +} + +export type Plan = { + id: number; + corporate_plan: CorporatePlan | null; + service_code: string; + corporate_plan_id: string; + code: string; + type: string; + start: string; + end: string; + require_referral: string; + referral_source: string; + referral_duration: string; + family_plan: string; + family_plan_share_rules: string; + limit_rules: string; + layer: string; + layer_conditions: string; + budget_type: string; + budget_code: string; + budget_conditions: string; + surgery_limit: string; + non_surgery_limit: string; + max_claim_limit: string; + max_claim_count: string; + area_limit: string; + limit_shared_plans: string; + limit_shared_plan_type: string; + cashless_percentage: string; + reimbursement_percentage: string; + digital_percentage: string; + co_share_m_percentage: string; + co_share_s_percentage: string; + co_share_c_percentage: string; + cashless_deductible: string; + reimbursement_deductible: string; + digital_deductible: string; + co_share_m_deductible: string; + co_share_s_deductible: string; + co_share_c_deductible: string; + co_share_deductible_condition: string; + msc: string; + genders: string; + min_age: string; + max_age: string; + rule_of_excess: string; + max_excess_covered: string; + prorate_type: string; + prorate_lookup: string; + currency: string; + max_surgery_reinstatement_days: string; + max_surgery_periode_days: string; +} + +export type CorporateBenefit = { + id: number; + corporate_id: number; + code: string; + name: string; + description: string | null; + active: boolean | number; +} + +export type Benefit = { + service_code : string; + plan_code : string; + benefit_code : string; + code : string; + description : string; + budget : string; + budget_conditions : string; + budget_code : string; + primary_benefit_code : string; + benefit_mode : string; + room_class_coverage : string; + max_bed_coverage : string; + tolerance_parameter : string; + max_room_class : string; + limit_amount : string; + area_limit : string; + shared_benefit : string; + shared_benefit_type : string; + msc : string; + genders : string; + min_age : string; + max_age : string; + max_frequency_period : string; + daily_frequency : string; + weekly_frequency : string; + monthly_frequency : string; + yearly_frequency : string; + custom_frequency_days : string; + custom_duration_value : string; + allowed_transaction_types : string; + high_plan_factor : string; + pre_post_treatment : string; + pre_treatment_days : string; + post_treatment_days : string; + layer_type_1 : string; + layer_value_1 : string; + layer_type_2 : string; + layer_value_2 : string; + cashless_percentage : string; + reimbursement_percentage : string; + digital_percentage : string; + co_share_m_percentage : string; + co_share_s_percentage : string; + co_share_c_percentage : string; + cashless_deductible : string; + reimbursement_deductible : string; + digital_deductible : string; + co_share_m_deductible : string; + co_share_s_deductible : string; + co_share_c_deductible : string; + prorate_type : string; + prorate_lookup : string; + max_days_for_disability : string; + max_period_for_disability : string; + currency : string; + show_benefit_item : string; + show_benefit_value : string; +} + +export type CorporateService = { + id?: string | number; + corporate_id?: string | number; + description?: string; + name?: string; + service_code: string; + reason: string; + status: string; + configurations: any; +} + +export type MasterExclusion = { + id?: string | number; + name?: string; + code: string; + description?: string; +} + diff --git a/frontend/client-portal/src/@types/diagnosis.ts b/frontend/client-portal/src/@types/diagnosis.ts index a33734b5..f6d674ce 100644 --- a/frontend/client-portal/src/@types/diagnosis.ts +++ b/frontend/client-portal/src/@types/diagnosis.ts @@ -2,6 +2,7 @@ export type Icd = { id: number; type: string; rev: string; + active: number; version?: string; code: string; name: string; diff --git a/frontend/client-portal/src/@types/table.ts b/frontend/client-portal/src/@types/table.ts index 4ba7bafc..2e71163b 100644 --- a/frontend/client-portal/src/@types/table.ts +++ b/frontend/client-portal/src/@types/table.ts @@ -23,6 +23,11 @@ export type DivisionDataProps = { id: number; name: string; }; + +export type StatusDataProps = { + id: number; + name: string; +}; /* -------------------------------------------------------------------------- */ /* -------------------------------- headcell -------------------------------- */ @@ -42,6 +47,13 @@ export type DivisionData = { }; /* -------------------------------------------------------------------------- */ +/* ----------------------------- status filter ---------------------------- */ +export type Status = { + id: number; + name: string; +}; +/* -------------------------------------------------------------------------- */ + /* ----------------------------------- row ---------------------------------- */ export type TableListProps = { headCells?: HeadCell[]; @@ -71,6 +83,7 @@ export type TableListProps = { setAppliedParams: Dispatch>; }; searchs: { + useSearchs: boolean; searchText: string; setSearchText: Dispatch>; handleSearchSubmit: (event: FormEvent) => void; @@ -84,5 +97,33 @@ export type TableListProps = { handleDivisionChange: (event: SelectChangeEvent) => void; }; }; + filterStatus?: { + useFilter: boolean; + config: { + label: string; + statusValue: string; + statusData: Status[]; + handleStatusChange: (event: SelectChangeEvent) => void; + }; + }; + filterStartDate: { + useFilter: boolean; + startDate: string; + setStartDate: Dispatch>; + handleStartDateChange: (event: FormEvent) => void; + }; + filterEndDate: { + useFilter: boolean; + endDate: string; + setEndDate: Dispatch>; + handleEndDateChange: (event: FormEvent) => void; + }; + exportReport: { + useExport: boolean; + startDate: string; + endDate: string; + status: string; + handleExportReport: (event: FormEvent) => void; + }; }; /* -------------------------------------------------------------------------- */ diff --git a/frontend/client-portal/src/App.tsx b/frontend/client-portal/src/App.tsx index 8ff04cf4..38581096 100644 --- a/frontend/client-portal/src/App.tsx +++ b/frontend/client-portal/src/App.tsx @@ -9,27 +9,31 @@ import { ProgressBarStyle } from './components/ProgressBar'; import ThemeColorPresets from './components/ThemeColorPresets'; import MotionLazyContainer from './components/animate/MotionLazyContainer'; import { SnackbarProvider } from 'notistack'; +import { Provider } from 'react-redux'; +import store from './store'; // ---------------------------------------------------------------------- export default function App() { return ( - - - - - - - {/* */} - - - - - - - + + + + + + + + {/* */} + + + + + + + + ); } diff --git a/frontend/client-portal/src/components/CardClaimSubmit.tsx b/frontend/client-portal/src/components/CardClaimSubmit.tsx new file mode 100644 index 00000000..a4f20ed1 --- /dev/null +++ b/frontend/client-portal/src/components/CardClaimSubmit.tsx @@ -0,0 +1,274 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { styled } from '@mui/material/styles'; +import { + Paper, + Table as TableContent, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Button, + TableSortLabel, + Box, + Card, + Grid, + FormControl, + InputLabel, + Select, + MenuItem, + SelectChangeEvent, + Stack, + Typography, + LinearProgress, + linearProgressClasses, + InputAdornment, +} from '@mui/material'; +import { visuallyHidden } from '@mui/utils'; +/* ---------------------------------- axios --------------------------------- */ +import axios from '../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { Fragment, useContext, useEffect, useState } from 'react'; +import { useSearchParams } from 'react-router-dom'; +/* -------------------------------- component ------------------------------- */ +import BaseTablePagination from './BaseTablePagination'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../theme/palette'; +/* ---------------------------------- utils --------------------------------- */ +import { UserCurrentCorporateContext } from '../contexts/UserCurrentCorporate'; +import { fSplit } from '../utils/formatNumber'; +/* ---------------------------------- types --------------------------------- */ +import { DivisionDataProps, Order, PaginationTableProps, TableListProps } from '../@types/table'; +/* ----------------------------------- icon --------------------------------- */ +import SearchIcon from '@mui/icons-material/Search'; +import { FormControlLabel } from '@mui/material'; +import { Checkbox } from '@mui/material'; +import HistoryRoundedIcon from '@mui/icons-material/HistoryRounded'; +import KeyboardArrowRightRoundedIcon from '@mui/icons-material/KeyboardArrowRightRounded'; +import { LoadingButton } from '@mui/lab'; + +/* --------------------------------- styled --------------------------------- */ +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: '#D1F1F1', + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + backgroundColor: '#54D62C', + }, +})); +/* -------------------------------------------------------------------------- */ + +export default function Table({ + rows, + loadings, + params, + searchs, +}: TableListProps) { + + + /* ------------------------------ handle checkbox ----------------------------*/ + const handleCheckboxChange = async (event: React.ChangeEvent) => { + // Anda bisa menambahkan logika di sini + if (event.target.checked) { + // Checkbox dicentang + console.log('Checkbox dicentang'); + // Tambahkan kode lain yang ingin Anda jalankan saat checkbox dicentang + } else { + // Checkbox tidak dicentang + console.log('Checkbox tidak dicentang'); + // Tambahkan kode lain yang ingin Anda jalankan saat checkbox tidak dicentang + } + }; + + + return ( + // + + {/* Field 1 */} + + {searchs && searchs.useSearchs ? ( + + +
+ searchs.setSearchText(event.target.value)} + value={searchs.searchText} + fullWidth + placeholder='Search Name or Member ID... ' + InputProps={{ + startAdornment: ( + + + + ), + }} + + /> + +
+
+ ) : null } +
+ {/* End Field 1 */} + + {/* Field 2 */} + + + + + + +
+ } + label="" + labelPlacement="end" + sx={{marginLeft: '20px'}} + /> + +
+
+ user-profile +
+ + Alexandra Rhea Putranto + KM002-01 + + + + + + + LIMIT + + + + + + {fSplit(8000000)} + + + / {fSplit(10000000000)} + + + + + + + + + + + + + {/* + + */} + +
+
+
+
+ + + + + +
+ } + label="" + labelPlacement="end" + sx={{marginLeft: '20px'}} + /> + +
+
+ user-profile +
+ + Alexandra Rhea Putranto + KM002-01 + + + + + + + LIMIT + + + + + + {fSplit(8000000)} + + + / {fSplit(10000000000)} + + + + + + + + + + + + + {/* + + */} + +
+
+
+
+ {/* End Field 2 */} + + Claim Submit Selected + +
+ //
+ ); +} diff --git a/frontend/client-portal/src/components/Label.tsx b/frontend/client-portal/src/components/Label.tsx new file mode 100644 index 00000000..c633ec4f --- /dev/null +++ b/frontend/client-portal/src/components/Label.tsx @@ -0,0 +1,98 @@ +// @mui +import { alpha, Theme, useTheme, styled } from '@mui/material/styles'; +import { BoxProps } from '@mui/material'; +// theme +import { ColorSchema } from '../theme/palette'; + +// ---------------------------------------------------------------------- + +type LabelColor = 'default' | 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'; + +type LabelVariant = 'filled' | 'outlined' | 'ghost'; + +const RootStyle = styled('span')( + ({ + theme, + ownerState, + }: { + theme: Theme; + ownerState: { + color: LabelColor; + variant: LabelVariant; + }; + }) => { + const isLight = theme.palette.mode === 'light'; + const { color, variant } = ownerState; + + const styleFilled = (color: ColorSchema) => ({ + color: theme.palette[color].contrastText, + backgroundColor: theme.palette[color].main, + }); + + const styleOutlined = (color: ColorSchema) => ({ + color: theme.palette[color].main, + backgroundColor: 'transparent', + border: `1px solid ${theme.palette[color].main}`, + }); + + const styleGhost = (color: ColorSchema) => ({ + color: theme.palette[color][isLight ? 'dark' : 'light'], + backgroundColor: alpha(theme.palette[color].main, 0.16), + }); + + return { + height: 22, + minWidth: 22, + lineHeight: 0, + borderRadius: 6, + // cursor: 'default', + alignItems: 'center', + whiteSpace: 'nowrap', + display: 'inline-flex', + justifyContent: 'center', + padding: theme.spacing(0, 1), + color: theme.palette.grey[800], + fontSize: theme.typography.pxToRem(12), + fontFamily: theme.typography.fontFamily, + backgroundColor: theme.palette.grey[300], + fontWeight: theme.typography.fontWeightBold, + + ...(color !== 'default' + ? { + ...(variant === 'filled' && { ...styleFilled(color) }), + ...(variant === 'outlined' && { ...styleOutlined(color) }), + ...(variant === 'ghost' && { ...styleGhost(color) }), + } + : { + ...(variant === 'outlined' && { + backgroundColor: 'transparent', + color: theme.palette.text.primary, + border: `1px solid ${theme.palette.grey[500_32]}`, + }), + ...(variant === 'ghost' && { + color: isLight ? theme.palette.text.secondary : theme.palette.common.white, + backgroundColor: theme.palette.grey[500_16], + }), + }), + }; + } +); + +// ---------------------------------------------------------------------- + +interface Props extends BoxProps { + color?: LabelColor; + variant?: LabelVariant; +} + +export default function Label({ color = 'default', variant = 'ghost', children, sx }: Props) { + const theme = useTheme(); + + return ( + + {children} + + ); +} + + diff --git a/frontend/client-portal/src/components/Table.tsx b/frontend/client-portal/src/components/Table.tsx index 2f7e86f9..9feb4a64 100644 --- a/frontend/client-portal/src/components/Table.tsx +++ b/frontend/client-portal/src/components/Table.tsx @@ -37,9 +37,11 @@ import palette from '../theme/palette'; /* ---------------------------------- utils --------------------------------- */ import { UserCurrentCorporateContext } from '../contexts/UserCurrentCorporate'; import { fSplit } from '../utils/formatNumber'; +import { Download, Search as SearchIcon, Upload } from '@mui/icons-material'; /* ---------------------------------- types --------------------------------- */ import { DivisionDataProps, Order, PaginationTableProps, TableListProps } from '../@types/table'; - +import { InputAdornment } from '@mui/material'; +import GetAppIcon from '@mui/icons-material/GetApp'; /* --------------------------------- styled --------------------------------- */ const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ height: 10, @@ -62,7 +64,11 @@ export default function Table({ loadings, params, filters, + filterStatus, + filterStartDate, + filterEndDate, searchs, + exportReport, }: TableListProps) { /* ------------------------------- handle sort ------------------------------ */ const handleRequestSort = async (event: React.MouseEvent, property: string) => { @@ -130,6 +136,7 @@ export default function Table({ const parameters = Object.fromEntries([ ...params.searchParams.entries(), ['page', newPage + 1], + ['per_page', paginations.rowsPerPage] ]); paginations.setPage(newPage); await new Promise((resolve) => setTimeout(resolve, 500)); @@ -153,7 +160,7 @@ export default function Table({ /* -------------------------------------------------------------------------- */ return ( - + // {/* Field 1 */} @@ -192,20 +199,132 @@ export default function Table({ - ) : ( - -
- searchs.setSearchText(event.target.value)} - value={searchs.searchText} - fullWidth - /> - -
- )} + ) : null } + + {searchs && searchs.useSearchs ? ( + + {filterStatus && filterStatus.useFilter ? ( + +
+ searchs.setSearchText(event.target.value)} + value={searchs.searchText} + fullWidth + InputProps={{ + startAdornment: ( + + + + ), + }} + placeholder="Search Name or Member ID... " + /> + +
+ ) : + +
+ searchs.setSearchText(event.target.value)} + value={searchs.searchText} + fullWidth + InputProps={{ + startAdornment: ( + + + + ), + }} + placeholder="Search Name or Member ID... " + /> + +
+ } + +
+ ) : null } + + {/* Start date */} + {filterStartDate && filterStartDate.useFilter ? ( + +
+ filterStartDate.setStartDate(event.target.value)} + fullWidth + label="Start Date" + InputLabelProps={{ + shrink: true, + }} + /> + +
+ ) : null } + + {/* End Date */} + + {filterEndDate && filterEndDate.useFilter ? ( + +
+ filterEndDate.setEndDate(event.target.value)} + fullWidth + label="End Date" + InputLabelProps={{ + shrink: true, + }} + /> + +
+ ) : null } + + {/* Filter status */} + {filterStatus && filterStatus.useFilter ? ( + + + Status + + + + ) : null } + + {/* Export Report */} + + {exportReport && exportReport.useExport ? ( + + + + + + ) : null } +
{/* End Field 1 */} @@ -219,7 +338,7 @@ export default function Table({ {/* End Table Header */} {/* Table Body */} - {loadings.isLoading ? ( + {loadings.isLoading && rows.length >= 1 ? ( Loading . . . @@ -263,6 +382,6 @@ export default function Table({ {/* End Field 2 */} -
+ //
); } diff --git a/frontend/client-portal/src/components/UploadImage.tsx b/frontend/client-portal/src/components/UploadImage.tsx new file mode 100644 index 00000000..a69c73ec --- /dev/null +++ b/frontend/client-portal/src/components/UploadImage.tsx @@ -0,0 +1,128 @@ +import React, { Dispatch, FunctionComponent, useCallback, useState } from 'react'; + +import { useDropzone } from 'react-dropzone'; +import { Box, Stack, Typography } from '@mui/material'; +import BlockContent from './upload/BlockContent'; +import { styled } from '@mui/material/styles'; +import { UploadIllustration } from '../assets'; +import Iconify from './Iconify'; + +const RootStyle = styled('div')(({ theme }) => ({ + width: 144, + height: 144, + margin: 'auto', + borderRadius: '50%', + padding: theme.spacing(1), + border: `2px dashed ${theme.palette.grey[500_32]}`, +})); +const DropZoneStyle = styled('div')({ + zIndex: 0, + width: '100%', + height: '100%', + outline: 'none', + display: 'flex', + overflow: 'hidden', + borderRadius: '50%', + position: 'relative', + alignItems: 'center', + justifyContent: 'center', + '& > *': { width: '100%', height: '100%' }, + '&:hover': { + cursor: 'pointer', + '& .placeholder': { + zIndex: 9, + }, + }, +}); + +const PlaceholderStyle = styled('div')(({ theme }) => ({ + display: 'flex', + position: 'absolute', + alignItems: 'center', + flexDirection: 'column', + justifyContent: 'center', + color: theme.palette.text.secondary, + // backgroundColor: theme.palette.background.neutral, + transition: theme.transitions.create('opacity', { + easing: theme.transitions.easing.easeInOut, + duration: theme.transitions.duration.shorter, + }), + '&:hover': { opacity: 0.72 }, +})); + +const UploadImage: FunctionComponent<{ + setFile: Dispatch; + currentImage: string; +}> = ({ setFile, currentImage, setSave, error, file, helperText, sx, ...other }) => { + const onDrop = useCallback( + (acceptedFiles) => { + // Do something with the files + console.log(acceptedFiles); + setFile(acceptedFiles[0]); + setImage(acceptedFiles[0]); + }, + [setFile, setSave] + ); + + const { getRootProps, getInputProps, isDragActive, isDragReject } = useDropzone({ + onDrop, + multiple: false, + }); + + const [image, setImage] = useState(null); + + return ( + + + + {/* */} + {image ? ( + preview + ) : currentImage ? ( + preview + ) : ( + + + {image ? 'Update photo' : 'Upload photo'} + + )} + + + + {image ? 'Update photo' : 'Upload photo'} + + {/* */} + {/* */} + + {isDragReject &&

Unsupported file type...

} +
+
+ ); +}; + +export default UploadImage; diff --git a/frontend/client-portal/src/components/hook-form/RHFAutocomplete.tsx b/frontend/client-portal/src/components/hook-form/RHFAutocomplete.tsx new file mode 100644 index 00000000..3872aec5 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/RHFAutocomplete.tsx @@ -0,0 +1,41 @@ +import { Autocomplete, TextField, TextFieldProps } from '@mui/material'; +import { useState } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; + +interface IProps { + options: any[]; + name: string; + label?: string; +} + +export default function RHFAutocomplete({ name, options, label, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + console.log(control) + + const [value, setValue] = useState(options[0]); + const [inputValue, setInputValue] = useState(''); + + return ( + ( + { + // console.log('fuck', newValue) + setValue(newValue.id); + }} + inputValue={inputValue} + onInputChange={(event, newInputValue) => { + setInputValue(newInputValue); + }} + renderInput={(params) => } + {...other} + /> + )} + /> + ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/components/hook-form/RHFSwitch.tsx b/frontend/client-portal/src/components/hook-form/RHFSwitch.tsx index a56c548a..3110e5b2 100644 --- a/frontend/client-portal/src/components/hook-form/RHFSwitch.tsx +++ b/frontend/client-portal/src/components/hook-form/RHFSwitch.tsx @@ -9,9 +9,10 @@ type IProps = Omit; interface Props extends IProps { name: string; + disabled?: boolean; } -export default function RHFSwitch({ name, ...other }: Props) { +export default function RHFSwitch({ name, disabled = false, ...other }: Props) { const { control } = useFormContext(); return ( @@ -20,7 +21,7 @@ export default function RHFSwitch({ name, ...other }: Props) { } + render={({ field }) => } /> } {...other} diff --git a/frontend/client-portal/src/components/hook-form/v2/FormProvider.tsx b/frontend/client-portal/src/components/hook-form/v2/FormProvider.tsx new file mode 100644 index 00000000..c57e3cd8 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/FormProvider.tsx @@ -0,0 +1,26 @@ +import { ReactNode } from 'react'; +// form +import { FormProvider as Form, UseFormReturn } from 'react-hook-form'; + +// ---------------------------------------------------------------------- + +type Props = { + children: ReactNode; + methods: UseFormReturn; + onSubmit?: VoidFunction; + preventEnterSubmit?: boolean; +}; + +export default function FormProvider({ children, onSubmit, methods, preventEnterSubmit }: Props) { + const checkKeyDown = (e: any) => { + if (e.key === 'Enter' && preventEnterSubmit){ + e.preventDefault(); + } + }; + + return ( +
+ checkKeyDown(e)}>{children}
+ + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFAutocomplete.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFAutocomplete.tsx new file mode 100644 index 00000000..b52f932a --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFAutocomplete.tsx @@ -0,0 +1,102 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Autocomplete, AutocompleteProps, FormHelperText, TextField, UseAutocompleteProps } from '@mui/material'; +import { useState } from 'react'; +import { FilterOptionsState } from '@mui/material/useAutocomplete'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string, + label: string, + options: any, + getOptionLabel: (option: any) => string, + isOptionEqualToValue: any, + disableClearable: boolean, + freeSolo: boolean, + renderOption?: any, + onInputChange?: any, + onKeyDown?: any, + onKeyPress?: any, + noOptionsText?: string, + popupIcon?: any, + disabled?: boolean, + sx?: any, + sxTextField?: any, + InputProps?: any, + onSelect?: (option: any) => void, + filterOptions?: (options: any[], state: FilterOptionsState) => any[]; +} + +const RHFAutocomplete = ( {name, label, options, ...rest} : IProps ) => { + const { control } = useFormContext(); + const { + sx, sxTextField, InputProps, + onSelect, + getOptionLabel, filterOptions, + popupIcon, + isOptionEqualToValue, disableClearable, + freeSolo, renderOption, + onInputChange, onKeyDown, onKeyPress, + noOptionsText, disabled } = rest; + + return ( + { + return ( + <> + ( + + )} + onChange={(e, newValue) => { + onChange(newValue); + onSelect && onSelect(newValue); + }} + /> + + {!!error && ( + + {error.message} + + )} + + + + ); + }} + /> + ); + + + +} + +export default RHFAutocomplete; \ No newline at end of file diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFAutocompleteTags.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFAutocompleteTags.tsx new file mode 100644 index 00000000..c8195440 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFAutocompleteTags.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; +import Chip from '@mui/material/Chip'; +import TextField from '@mui/material/TextField'; +import Autocomplete from '@mui/material/Autocomplete'; +import { FormHelperText } from '@mui/material'; +import { Controller, useFormContext } from 'react-hook-form'; +import { useEffect } from 'react'; + +interface IProps { + name: string, + label: string, + options: any, + defaultValue: any +} + +const RHFAutocompleteTags = ({ name, label, options, defaultValue, ...rest }: IProps) => { + const { control } = useFormContext(); + const fixedOptions: any = []; + const [value, setValue] = React.useState([...fixedOptions]); + + useEffect(() => { + setValue(defaultValue) + }, [options, defaultValue]) + + return ( + { + return ( + <> + { + setValue([ + ...fixedOptions, + ...newValue.filter((option) => fixedOptions.indexOf(option) === -1), + ]); + onChange(newValue); + }} + isOptionEqualToValue={(option, value)=>{ + return option.optionID === value.optionID + }} + options={options} + getOptionLabel={(option: { optionID: string, optionLabel: string }) => `${option.optionLabel}` || ""} + renderTags={(tagValue, getTagProps) => + tagValue.map((option, index) => ( + + + + )) + } + renderInput={(params) => ( + + )} + /> + {!!error && ( + + {error.message} + + )} + + ); + }} + /> + + ); +} + +export default RHFAutocompleteTags; \ No newline at end of file diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFCheckbox.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFCheckbox.tsx new file mode 100644 index 00000000..c1ad1d7c --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFCheckbox.tsx @@ -0,0 +1,111 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Checkbox, FormControlLabel, FormGroup, FormControlLabelProps, Grid, FormHelperText } from '@mui/material'; +import RHFDatePicker from './RHFDatePicker'; + +// ---------------------------------------------------------------------- + +interface RHFCheckboxProps extends Omit { + name: string; +} + +export function RHFCheckbox({ name, ...other }: RHFCheckboxProps) { + const { control } = useFormContext(); + + return ( + ( + <> + + {!!error && ( + + {error.message} + + )} + + + )} + /> + } + {...other} + /> + ); +} + +interface RHFCheckboxEndDateProps extends Omit { + name: string; + endPeriodProp: any; + idx?: any; +} + +export function RHFCheckboxEndDate({ name, endPeriodProp, idx, ...other }: RHFCheckboxEndDateProps) { + const { control } = useFormContext(); + + return ( + + { + endPeriodProp(e.target.checked, idx) + }} + /> + } + /> + } + {...other} + /> + ); +} + + +// ---------------------------------------------------------------------- + +interface RHFMultiCheckboxProps extends Omit { + name: string; + options: string[]; +} + +export function RHFMultiCheckbox({ name, options, ...other }: RHFMultiCheckboxProps) { + const { control } = useFormContext(); + + return ( + { + const onSelected = (option: string) => + field.value.includes(option) + ? field.value.filter((value: string) => value !== option) + : [...field.value, option]; + + return ( + + {options.map((option) => ( + field.onChange(onSelected(option))} + /> + } + label={option} + {...other} + /> + ))} + + ); + }} + /> + ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFDatePicker.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFDatePicker.tsx new file mode 100644 index 00000000..e2fa986d --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFDatePicker.tsx @@ -0,0 +1,54 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDatePicker, LocalizationProvider } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + dateFormat: string; + fullWidth?: boolean; + minDate?: any; + maxDate?: any; + disabled?: boolean; +} + +export default function RHFDatePicker({ name, label, dateFormat, minDate, maxDate, disabled, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth } = other; + + return ( + + ( + <> + field.onChange(date)} + inputFormat={dateFormat} + value={field.value} + mask={''} + minDate={(minDate) ? new Date(minDate) : null} + maxDate={(maxDate) ? new Date(maxDate) : null} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFDateTimePicker.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFDateTimePicker.tsx new file mode 100644 index 00000000..6dbc7eb2 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFDateTimePicker.tsx @@ -0,0 +1,53 @@ +// form +import { useFormContext, Controller, useForm } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDateTimePicker, LocalizationProvider } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + dateFormat: string; + fullWidth?: boolean; + onChange?: (date: any) => void; + disabled?: boolean; +} + +export default function RHFDateTimePicker({ name, label, dateFormat, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth, onChange, disabled } = other; + + return ( + + ( + <> + { + field.onChange(date); + onChange && onChange(date); + }} + inputFormat={dateFormat} + value={field.value} + mask={''} + disabled={disabled} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFEditor.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFEditor.tsx new file mode 100644 index 00000000..84cf1c27 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFEditor.tsx @@ -0,0 +1,37 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText } from '@mui/material'; +// +import Editor, { Props as EditorProps } from '../../editor'; + +// ---------------------------------------------------------------------- + +interface Props extends EditorProps { + name: string; +} + +export default function RHFEditor({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + ( + + {error?.message} + + } + {...other} + /> + )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFRadioGroup.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFRadioGroup.tsx new file mode 100644 index 00000000..a2776f13 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFRadioGroup.tsx @@ -0,0 +1,61 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { + Radio, + RadioGroup, + FormHelperText, + RadioGroupProps, + FormControlLabel, +} from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + options: string[]; + getOptionLabel?: string[]; + fullWidth?: boolean; + disabled?: boolean; +} + +export default function RHFRadioGroup({ + name, + options, + getOptionLabel, + fullWidth, + disabled, + ...other +}: IProps & RadioGroupProps) { + const { control } = useFormContext(); + + return ( + ( +
+ + {options.map((option, index) => ( + } + label={getOptionLabel?.length ? getOptionLabel[index] : option} + disabled={disabled} + /> + + ))} + + + {!!error && ( + + {error.message} + + )} +
+ )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFSelect.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFSelect.tsx new file mode 100644 index 00000000..4f6c02b8 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFSelect.tsx @@ -0,0 +1,35 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { TextField, TextFieldProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + children: any; +} + +export default function RHFSelect({ name, children, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + + {children} + + )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFSelectV2.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFSelectV2.tsx new file mode 100644 index 00000000..9337605f --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFSelectV2.tsx @@ -0,0 +1,32 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormControl, FormHelperText, InputLabel, Select, SelectProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + id: string; + children: any; +} + +export default function RHFSelectV2({ name, id, children, ...other }: IProps & SelectProps) { + const { control } = useFormContext(); + + return ( + ( + + {other.label} + + {error && {error.message}} + + )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFSwitch.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFSwitch.tsx new file mode 100644 index 00000000..a56c548a --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFSwitch.tsx @@ -0,0 +1,29 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Switch, FormControlLabel, FormControlLabelProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +type IProps = Omit; + +interface Props extends IProps { + name: string; +} + +export default function RHFSwitch({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + } + /> + } + {...other} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFTextField.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFTextField.tsx new file mode 100644 index 00000000..6ffc8208 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFTextField.tsx @@ -0,0 +1,29 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { TextField, TextFieldProps, Typography } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextField({ name, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + <> + {/* + * + */} + + + )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldMoney.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldMoney.tsx new file mode 100644 index 00000000..078c39b2 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldMoney.tsx @@ -0,0 +1,42 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextFieldMoney({ name, ...other }: IProps & TextFieldProps) { + const { control, watch, setValue } = useFormContext(); + const values = watch(); + + return ( + ( + <> + { (values[name] === '0') && setValue(name, '') }} + onBlur={() => { (values[name] === '') && setValue(name, '0') }} + {...other} + inputProps={{ min: 0, max: 5, style: { textAlign: 'right' } }} + InputProps={{ + startAdornment: Rp, + inputComponent: MoneyFormat as any, + }} + /> + + )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldNumber.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldNumber.tsx new file mode 100644 index 00000000..1646f7a8 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldNumber.tsx @@ -0,0 +1,61 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; +// import AutoNumeric from "autonumeric" +// import { useEffect, useRef } from 'react'; +// import React from 'react'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + endAdornment?: React.ReactNode; +} + +export default function RHFTextFieldNumber({ name, endAdornment, ...other }: IProps & TextFieldProps) { + const { control, watch, setValue } = useFormContext(); + const values = watch(); + + // const ref = React.createRef(); + // const mountedRef = useRef(false); + // useEffect(() => { + // mountedRef.current = true; + // new AutoNumeric(ref.current as HTMLElement) + + // return () => { + // mountedRef.current = false; + // } + // }, []) + + + + return ( + ( + <> + { (watch(name) == '0') && setValue(name, '') }} + onBlur={() => { (watch(name) == '') && setValue(name, '0') }} + {...other} + inputProps={{ min: 0, max: 5, style: { textAlign: 'right' } }} + InputProps={{ + inputComponent: MoneyFormat as any, + endAdornment: endAdornment, + + }} + + /> + + )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldPercentage.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldPercentage.tsx new file mode 100644 index 00000000..f09eba7f --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFTextFieldPercentage.tsx @@ -0,0 +1,39 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextFieldPercentage({ name, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + <> + %, + inputComponent: MoneyFormat as any, + }} + /> + + )} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFTimePicker.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFTimePicker.tsx new file mode 100644 index 00000000..70e9d8fe --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFTimePicker.tsx @@ -0,0 +1,46 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDatePicker, LocalizationProvider, TimePicker } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + fullWidth?: boolean; + disabled?: boolean; +} + +export default function RHFTimePicker({ name, label, disabled, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth } = other; + + return ( + + ( + <> + field.onChange(date)} + value={field.value} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/components/hook-form/v2/RHFUpload.tsx b/frontend/client-portal/src/components/hook-form/v2/RHFUpload.tsx new file mode 100644 index 00000000..fddf48d6 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/RHFUpload.tsx @@ -0,0 +1,112 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText } from '@mui/material'; +// type +import { + UploadAvatar, + UploadMultiFile, + UploadSingleFile, + UploadProps, + UploadMultiFileProps, +} from '../../upload'; +import { Accept } from 'react-dropzone'; + +// ---------------------------------------------------------------------- + +interface Props extends Omit { + name: string; +} + +export function RHFUploadAvatar({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && !field.value; + + return ( +
+ + {checkError && ( + + {error.message} + + )} +
+ ); + }} + /> + ); +} + +// ---------------------------------------------------------------------- + +export function RHFUploadSingleFile({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && !field.value; + + return ( + + {error.message} + + ) + } + {...other} + /> + ); + }} + /> + ); +} + +// ---------------------------------------------------------------------- + +interface RHFUploadMultiFileProps extends Omit { + name: string; +} + +export function RHFUploadMultiFile({ name, ...other }: RHFUploadMultiFileProps) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && field.value?.length === 0; + + return ( + + {error?.message} + + ) + } + {...other} + /> + ); + }} + /> + ); +} diff --git a/frontend/client-portal/src/components/hook-form/v2/index.ts b/frontend/client-portal/src/components/hook-form/v2/index.ts new file mode 100644 index 00000000..f58a39a7 --- /dev/null +++ b/frontend/client-portal/src/components/hook-form/v2/index.ts @@ -0,0 +1,12 @@ +export * from './RHFCheckbox'; +export * from './RHFUpload'; + +export { default as FormProvider } from './FormProvider'; + +export { default as RHFSwitch } from './RHFSwitch'; +export { default as RHFAutocomplete } from './RHFAutocomplete'; +export { default as RHFSelect } from './RHFSelect'; +export { default as RHFEditor } from './RHFEditor'; +export { default as RHFTextField } from './RHFTextField'; +export { default as RHFRadioGroup } from './RHFRadioGroup'; +export { default as RHFSelectV2 } from './RHFSelectV2'; diff --git a/frontend/client-portal/src/components/numeric_format/DiscountPctFormat.tsx b/frontend/client-portal/src/components/numeric_format/DiscountPctFormat.tsx new file mode 100644 index 00000000..78c3ec6e --- /dev/null +++ b/frontend/client-portal/src/components/numeric_format/DiscountPctFormat.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { InputAttributes, NumericFormat, NumericFormatProps } from "react-number-format"; + +interface CustomProps { + onChange: (event: { target: { name: string; value: string } }) => void; + name: string; +} + +const DiscountPctFormat = React.forwardRef< + NumericFormatProps, + CustomProps +>(function DiscountPctFormat(props, ref) { + const { onChange, ...other } = props; + + return ( + { + onChange({ + target: { + name: props.name, + value: values.value, + }, + }); + }} + thousandSeparator + valueIsNumericString + allowLeadingZeros={false} + /> + ); +}); + +export default DiscountPctFormat; \ No newline at end of file diff --git a/frontend/client-portal/src/components/numeric_format/MoneyFormat.tsx b/frontend/client-portal/src/components/numeric_format/MoneyFormat.tsx new file mode 100644 index 00000000..6d564143 --- /dev/null +++ b/frontend/client-portal/src/components/numeric_format/MoneyFormat.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { InputAttributes, NumericFormat, NumericFormatProps } from "react-number-format"; + +interface CustomProps { + onChange: (event: { target: { name: string; value: string } }) => void; + name: string; +} + +const MoneyFormat = React.forwardRef< + NumericFormatProps, + CustomProps +>(function MoneyFormat(props, ref) { + const { onChange, ...other } = props; + + return ( + { + onChange({ + target: { + name: props.name, + value: values.value, + }, + }); + }} + thousandSeparator + valueIsNumericString + allowLeadingZeros={false} + /> + ); +}); + +export default MoneyFormat; \ No newline at end of file diff --git a/frontend/client-portal/src/components/table/Index.ts b/frontend/client-portal/src/components/table/Index.ts new file mode 100644 index 00000000..8b4b0f88 --- /dev/null +++ b/frontend/client-portal/src/components/table/Index.ts @@ -0,0 +1 @@ +export { default as TableMoreMenu } from './TableMoreMenu'; \ No newline at end of file diff --git a/frontend/client-portal/src/components/table/TableMoreMenu.tsx b/frontend/client-portal/src/components/table/TableMoreMenu.tsx new file mode 100644 index 00000000..6fe3f43e --- /dev/null +++ b/frontend/client-portal/src/components/table/TableMoreMenu.tsx @@ -0,0 +1,60 @@ +import { useEffect, useState } from 'react'; +// @mui +import { IconButton } from '@mui/material'; +// +import Iconify from '../Iconify'; +import MenuPopover from '../MenuPopover'; + +// ---------------------------------------------------------------------- + +type Props = { + actions: React.ReactNode; + disableRipple?: boolean; +}; + +export default function TableMoreMenu({ actions, disableRipple }: Props) { + const [open, setOpen] = useState(null); + + // Close menu popover + useEffect(() => { + setOpen(null); + }, [actions]) + + const handleOpen = (event: React.MouseEvent) => { + setOpen(event.currentTarget); + }; + + const handleClose = () => { + setOpen(null); + }; + + return ( + <> + + + + + + {actions} + +     +  ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/layouts/dashboard/header/CorporatePopover.tsx b/frontend/client-portal/src/layouts/dashboard/header/CorporatePopover.tsx index 331af30f..c7b27186 100644 --- a/frontend/client-portal/src/layouts/dashboard/header/CorporatePopover.tsx +++ b/frontend/client-portal/src/layouts/dashboard/header/CorporatePopover.tsx @@ -2,6 +2,7 @@ import { FormControl, InputLabel, MenuItem, Select, SelectChangeEvent } from '@m import { useContext, useEffect, useState } from 'react'; import { UserCurrentCorporateContext } from '../../../contexts/UserCurrentCorporate'; import axios from '../../../utils/axios'; +import { useNavigate } from 'react-router-dom'; /* ---------------------------------- types --------------------------------- */ type CorporateDataProps = { @@ -13,9 +14,17 @@ type CorporateDataProps = { export default function CorporatePopover() { const { corporateValue, setCorporateValue } = useContext(UserCurrentCorporateContext); const [corporateData, setCorporateData] = useState([]); + //Check route in profile + const navigate = useNavigate(); + const currentPathname = window.location.pathname; + const desiredPart = currentPathname.split('/')[1]; const handleCorporateChange = (event: SelectChangeEvent) => { setCorporateValue(event.target.value as string); + if(desiredPart === 'user-profile') + { + navigate('/alarm-center'); + } }; useEffect(() => { diff --git a/frontend/client-portal/src/layouts/dashboard/navbar/NavConfig.tsx b/frontend/client-portal/src/layouts/dashboard/navbar/NavConfig.tsx index 4859a683..633d8a1b 100644 --- a/frontend/client-portal/src/layouts/dashboard/navbar/NavConfig.tsx +++ b/frontend/client-portal/src/layouts/dashboard/navbar/NavConfig.tsx @@ -6,15 +6,38 @@ const navConfig = [ { items: [{ title: 'Dashboard', path: '/dashboard' }], }, + + // Corporate + // ---------------------------------------------------------------------- + { + subheader: 'Corporate', + items: [ + { + title: 'Corporate', + path: '/corporate', + // icon: ICONS.default, + }, + ], + }, + + // Alarm Center // ---------------------------------------------------------------------- { subheader: 'Case Management', items: [ + { + title: 'Employee Data', + path: '/employee-data', + }, { title: 'Alarm Center', path: '/alarm-center', }, + { + title: 'Claim Submit', + path: '/claim-submit', + }, { title: 'Claim Report', path: '/claim-report', @@ -22,6 +45,7 @@ const navConfig = [ ], }, + // User Management // ---------------------------------------------------------------------- // { diff --git a/frontend/client-portal/src/layouts/dashboard/navbar/NavbarAccount.tsx b/frontend/client-portal/src/layouts/dashboard/navbar/NavbarAccount.tsx index 91671ffa..4d19c36e 100644 --- a/frontend/client-portal/src/layouts/dashboard/navbar/NavbarAccount.tsx +++ b/frontend/client-portal/src/layouts/dashboard/navbar/NavbarAccount.tsx @@ -26,7 +26,7 @@ export default function NavbarAccount({ isCollapse }: Props) { const { user } = useAuth(); - console.log('current user is ', user) +// console.log('current user is ', user) return ( + - - + {/* */} + {/* - + */} @@ -121,7 +129,7 @@ export default function Drugs() { */} - + {/* */} diff --git a/frontend/client-portal/src/pages/AlarmCenter/List.tsx b/frontend/client-portal/src/pages/AlarmCenter/List.tsx index 27c13602..f87fe1e5 100644 --- a/frontend/client-portal/src/pages/AlarmCenter/List.tsx +++ b/frontend/client-portal/src/pages/AlarmCenter/List.tsx @@ -12,6 +12,9 @@ import { Button, TableSortLabel, Box, + SelectChangeEvent, + Typography, + MenuItem } from '@mui/material'; import { visuallyHidden } from '@mui/utils'; /* ---------------------------------- axios --------------------------------- */ @@ -32,6 +35,13 @@ import palette from '../../theme/palette'; import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; import { useSearchParams, useNavigate, Link } from 'react-router-dom'; +import { fDateSuffix } from '../../utils/formatTime'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import { enqueueSnackbar } from 'notistack'; + +import DetailDataMember from './ListMember'; +import Label from '../../components/Label'; /* ---------------------------------- types --------------------------------- */ @@ -221,11 +231,117 @@ export default function List() { }; const searchs = { + useSearchs: true, searchText: searchText, setSearchText: setSearchText, handleSearchSubmit: handleSearchSubmit, }; + /* ------------------------------ handle filter ----------------------------- */ + const [statusValue, setStatusValue] = useState('all'); + const [filterData, setStatusData] = useState([]); + + // handle status + const handleStatusChanges = (event: SelectChangeEvent) => { + setStatusValue(event.target.value as string); + + if (event.target.value === 'all') { + searchParams.delete('status'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([ + ...searchParams.entries(), + ['status', event.target.value as string], + ]); + setAppliedParams(params); + } + }; + + const filterStatus = { + useFilter: false, + config: { + label: 'Status', + statusValue: statusValue, + filterData: filterData, + handleStatusChange: handleStatusChanges, + }, + }; + + // handle start date + const [startDateValue, setStartDateValue] = useState(''); + + const handleStartDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + console.log(startDateValue) + if (startDateValue === '') { + searchParams.delete('start_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['start_date', startDateValue]]); + setAppliedParams(params); + } + }; + + const filterStartDate = { + useFilter: true, + startDate: startDateValue, + setStartDate: setStartDateValue, + handleStartDateChange: handleStartDateChanges, + }; + + // handle end date + const [endDateValue, setEndDateValue] = useState(''); + + const handleEndDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + if (endDateValue === '') { + searchParams.delete('end_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['end_date', endDateValue]]); + setAppliedParams(params); + } + }; + + const filterEndDate = { + useFilter: true, + endDate: endDateValue, + setEndDate: setEndDateValue, + handleEndDateChange: handleEndDateChanges, + }; + + /* -------------------------------- handle export --------------------------- */ + const handleExportReport = async () => { + var filter = Object.fromEntries([...searchParams.entries()]); + + await axios + .get(corporateValue + '/claims/export', { params: filter }) + .then((res) => { + enqueueSnackbar('Data berhasil di Export', { + variant: 'success', + anchorOrigin: { horizontal: 'right', vertical: 'top' }, + }); + + document.location.href = res.data.data.file_url; + }) + .catch((err) => + enqueueSnackbar('Data Gagal di Export', { + variant: 'error', + anchorOrigin: { horizontal: 'right', vertical: 'top' }, + }) + ); + }; + const exportReport = { + useExport: true, + startDate: startDateValue, + endDate: endDateValue, + status: statusValue, + handleExportReport: handleExportReport + } + /* -------------------------------- headCell -------------------------------- */ const headCells: HeadCell[] = [ { @@ -251,14 +367,20 @@ export default function List() { id: 'end_date', align: 'center', label: 'End Date', - isSort: false, - }, - { - id: 'status', - align: 'center', - label: 'Status', isSort: true, }, + // { + // id: 'status', + // align: 'center', + // label: 'Status', + // isSort: false, + // }, + { + id: 'action', + align: 'center', + label: '', + isSort: false, + }, ]; /* -------------------------------------------------------------------------- */ @@ -277,50 +399,64 @@ export default function List() { params: { ...parameters }, }); + const status = [ + {"id": 1, "name": "Done" }, + {"id": 0, "name": "On Going" }, + + ] + setStatusData(status) + setData( response.data.data.map((obj: any) => { return { ...obj, - memberId: - // - + // memberId: + // // + // + // , + start_date: + , - status: - obj.status === 1 ? ( - - ) : ( - - ), + end_date: + + , + // status: + // obj.status === 1 ? ( + // + // Done + // + // ) : ( + // + // Ongoing + // + // ), + action: + + navigate('member/'+obj.id )}> + + View + + + } /> }; }) ); @@ -353,6 +489,10 @@ export default function List() { params={params} searchs={searchs} // filters={filters} + filterStatus={filterStatus} + filterStartDate={filterStartDate} + filterEndDate={filterEndDate} + exportReport={exportReport} /> ); diff --git a/frontend/client-portal/src/pages/AlarmCenter/ListMember.tsx b/frontend/client-portal/src/pages/AlarmCenter/ListMember.tsx new file mode 100644 index 00000000..193c33db --- /dev/null +++ b/frontend/client-portal/src/pages/AlarmCenter/ListMember.tsx @@ -0,0 +1,504 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Stack, + Button, + TableSortLabel, + Box, + SelectChangeEvent, + Typography, + MenuItem, + Grid +} from '@mui/material'; +import { visuallyHidden } from '@mui/utils'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import BaseTablePagination from '../../components/BaseTablePagination'; +import TableComponent from '../../components/Table'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; + +/* ---------------------------------- hooks --------------------------------- */ +import useMap from '../../hooks/useMap'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate, Link, useParams } from 'react-router-dom'; +import { fDateSuffix, fPostFormat } from '../../utils/formatTime'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import Label from '../../components/Label'; + + +/* ---------------------------------- types --------------------------------- */ + +type DataList = { + name: string; +}; + +// type PaginationTableProps = { +// current_page: number; +// from: number; +// last_page: number; +// links: []; +// path: string; +// per_page: number; +// to: number; +// total: number; +// }; + +// type DataTableProps = { +// fullName: string; +// memberId: string; +// service: string; +// start_date: string; +// end_date: string; +// status: boolean | number; +// }; + +// /* -------------------------------------------------------------------------- */ + +// /* -------------------------- enchanced table head -------------------------- */ + +// type Order = 'asc' | 'desc'; + +// interface HeadCell { +// id: string; +// label: string; +// } + +// const headCells: readonly HeadCell[] = [ +// { +// id: 'name', +// label: 'Name', +// }, +// { +// id: 'member_id', +// label: 'Member ID', +// }, +// { +// id: 'service', +// label: 'Service', +// }, +// { +// id: 'start_date', +// label: 'Start Date', +// }, +// { +// id: 'end_date', +// label: 'End Date', +// }, +// { +// id: 'status', +// label: 'Status', +// }, +// ]; + +// interface EnhancedTableProps { +// onRequestSort: (event: React.MouseEvent, property: string) => void; +// order: Order; +// orderBy: string; +// } + +// function EnhancedTableHead(props: EnhancedTableProps) { +// const { order, orderBy, onRequestSort } = props; +// const createSortHandler = (property: string) => (event: React.MouseEvent) => { +// onRequestSort(event, property); +// }; + +// return ( +// +// +// No +// {headCells.map((headCell) => ( +// +// +// {headCell.label} +// {orderBy === headCell.id ? ( +// +// {order === 'desc' ? 'sorted descending' : 'sorted ascending'} +// +// ) : null} +// +// +// ))} +// +// +// ); +// } + +/* -------------------------------------------------------------------------- */ + +export default function List() { + const navigate = useNavigate(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const [data, setData] = useState([]); + const { id } = useParams(); + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('asc'); + const [orderBy, setOrderBy] = useState('fullName'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + const [name, setName] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: false, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* ------------------------------ handle filter ----------------------------- */ + const [statusValue, setStatusValue] = useState('all'); + const [filterData, setStatusData] = useState([]); + + // handle status + const handleStatusChanges = (event: SelectChangeEvent) => { + setStatusValue(event.target.value as string); + + if (event.target.value === 'all') { + searchParams.delete('status'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([ + ...searchParams.entries(), + ['status', event.target.value as string], + ]); + setAppliedParams(params); + } + }; + + const filterStatus = { + useFilter: false, + config: { + label: 'Status', + statusValue: statusValue, + filterData: filterData, + handleStatusChange: handleStatusChanges, + }, + }; + + // handle start date + const [startDateValue, setStartDateValue] = useState(''); + + const handleStartDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + console.log(startDateValue) + if (startDateValue === '') { + searchParams.delete('start_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['start_date', startDateValue]]); + setAppliedParams(params); + } + }; + + const filterStartDate = { + useFilter: false, + startDate: startDateValue, + setStartDate: setStartDateValue, + handleStartDateChange: handleStartDateChanges, + }; + + // handle end date + const [endDateValue, setEndDateValue] = useState(''); + + const handleEndDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + if (endDateValue === '') { + searchParams.delete('end_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['end_date', endDateValue]]); + setAppliedParams(params); + } + }; + + const filterEndDate = { + useFilter: false, + endDate: endDateValue, + setEndDate: setEndDateValue, + handleEndDateChange: handleEndDateChanges, + }; + + /* -------------------------------- handle export --------------------------- */ + const handleExportReport = async () => { + var filter = Object.fromEntries([...searchParams.entries()]); + + await axios + .get('claims/export', { params: filter }) + .then((res) => { + enqueueSnackbar('Data berhasil di Export', { + variant: 'success', + anchorOrigin: { horizontal: 'right', vertical: 'top' }, + }); + + document.location.href = res.data.data.file_url; + }) + .catch((err) => + enqueueSnackbar('Data Gagal di Export', { + variant: 'error', + anchorOrigin: { horizontal: 'right', vertical: 'top' }, + }) + ); + }; + + const exportReport = { + useExport: false, + startDate: startDateValue, + endDate: endDateValue, + status: statusValue, + handleExportReport: handleExportReport + } + + /* -------------------------------- headCell -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'admission_date', + align: 'center', + label: 'Admission Date', + isSort: true, + }, + { + id: 'discharge_date', + align: 'center', + label: 'Discharge Date', + isSort: true, + }, + { + id: 'code', + align: 'left', + label: 'Code', + isSort: true, + }, + { + id: 'status', + align: 'center', + label: 'Status', + isSort: false, + }, + { + id: 'action', + align: 'center', + label: '', + isSort: false, + }, + ]; + /* -------------------------------------------------------------------------- */ + + useEffect(() => { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`${corporateValue}/alarm-center-members/${id}`, { + params: { ...parameters }, + }); + + const status = [ + {"id": 1, "name": "Done" }, + {"id": 0, "name": "On Going" }, + + ] + setStatusData(status) + const datatable = response.data.data; + + // if (response.data.data.length > 0){ + // setIsLoading(true); + // } else { + // setIsLoading(false); + // } + + const dataName = response.data.data[0].fullName + setName(dataName) + setData( + datatable.map((obj: any) => { + return { + ...obj, + admission_date: + + , + discharge_date: + + , + status: + obj.status === 'Done' ? ( + + ) : ( + + ), + action: + + navigate('service-monitoring/'+obj.claim_id )}> + + View + + + } /> + }; + }) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + setIsLoading(false); + })(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + console.log(loadings); + return ( + + + + navigate(`/alarm-center`)} + sx={{ cursor: 'pointer' }} + /> + + {name} + + + + + + + + + + + + + + ); +} diff --git a/frontend/client-portal/src/pages/AlarmCenter/ServiceMonitoring.tsx b/frontend/client-portal/src/pages/AlarmCenter/ServiceMonitoring.tsx index 1721a088..9b75ce5d 100644 --- a/frontend/client-portal/src/pages/AlarmCenter/ServiceMonitoring.tsx +++ b/frontend/client-portal/src/pages/AlarmCenter/ServiceMonitoring.tsx @@ -9,9 +9,15 @@ import { Card, Stack, Typography, + TableHead, + TableCell, + TableBody, + Table, + TableRow, + Link, } from '@mui/material'; import { styled } from '@mui/material/styles'; -import { Favorite } from '@mui/icons-material'; +import DownloadIcon from '@mui/icons-material/Download'; // components import Page from '../../components/Page'; import Iconify from '../../components/Iconify'; @@ -21,8 +27,16 @@ import { useState, SyntheticEvent, useContext, useEffect } from 'react'; import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; import { useNavigate, useParams } from 'react-router-dom'; import axios from '../../utils/axios'; -import { fDate } from '../../utils/formatTime'; +import { fDate, fDateSuffix, fDateTime, fDateTimeSuffix } from '../../utils/formatTime'; + +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; +import { Timeline, TimelineConnector, TimelineContent, TimelineDot, TimelineSeparator } from '@mui/lab'; +import Select from '../../theme/overrides/Select'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import { MenuItem } from '@mui/material'; +import Label from '../../components/Label'; // sections // import ListTable from '../../sections/claimreports/ListTable'; // import ClaimStatusCard from '../../sections/claimreports/ClaimStatusCard'; @@ -42,7 +56,7 @@ function TabPanel(props: TabPanelProps) { hidden={value !== index} id={`simple-tabpanel-${index}`} aria-labelledby={`simple-tab-${index}`} - style={{ backgroundColor: '#F9FAFB' }} + // style={{ backgroundColor: '#F9FAFB' }} {...other} > {value === index && ( @@ -61,6 +75,8 @@ function a11yProps(index: number) { }; } + + interface StyledTabsProps { children?: React.ReactNode; value: number; @@ -71,7 +87,7 @@ const StyledTabs = styled((props: StyledTabsProps) => )({ '& .MuiTabs-indicator': { display: 'flex', justifyContent: 'center', - backgroundColor: 'transparent', + backgroundColor: '19BBBB', }, '& .MuiTabs-indicatorSpan': { maxWidth: 40, @@ -85,27 +101,73 @@ interface StyledTabProps { icon?: string | React.ReactElement; } + const StyledTab = styled((props: StyledTabProps) => )( ({ theme }) => ({ textTransform: 'none', fontWeight: 500, fontSize: theme.typography.pxToRem(20), - color: theme.palette.primary.main, - maxWidth: '100%', + color: '#637381', + maxWidth: '15%', flex: 1, margin: '0 !important', '&.Mui-selected': { - color: '#FFF', - backgroundColor: theme.palette.primary.main, + color: '#212B36', }, '&:hover': { - backgroundColor: theme.palette.primary.dark, - color: '#FFF', + color: '#212B36', opacity: 1, }, }) ); +type Data = { + id: number, + company_name: string, + member_name: string, + member_code: string, + member_id: number, + phone: string, + email: string, + birth_date: string, + symptoms: string, + sign: string, + main_diagnose: string, + main_diagnose_code: string, + comparative_diagnosis: string, + comparative_diagnosis_code: string, + service_name: string, + benefit_name: string, + hospital: string, + admission_date: string, + discharge_date: string, + dialy_monitoring: DailyMonitoring[], + laboratorium_result: LaboratoriumResult[], + +} + +type DailyMonitoring = { + date: string, + time: string, + status: string, + subject_title: string, + body_temperature: string, + sistole: string, + diastole: string, + respiration_rate: string, + analisis_title: string, + Perencanaan: string, + +} + +type LaboratoriumResult = { + datetime: string, + reimbursement_code: string, + examination: string, + location: string, + files: string, +} + export default function ServiceMonitoring() { const { themeStretch } = useSettings(); const navigate = useNavigate(); @@ -115,234 +177,389 @@ export default function ServiceMonitoring() { setValue(newValue); }; - const [data, setData] = useState({}); + const [data, setData] = useState(null); const [corporate, setCorporate] = useState(); const { corporateValue } = useContext(UserCurrentCorporateContext); const { id } = useParams(); - const claimId = '2'; - console.log('id', id); + useEffect(() => { - console.log('fetching data...'); - axios - .get('/data/' + id) - .then((response) => { - console.log('data fetched...', response.data); - setData(response.data); - }) - .catch((error) => { - console.error('error fetching data...', error); - }); + (async () => { - axios - .get('/corporate-manage/' + corporateValue) - .then((response) => { - console.log('corporate fetched...', response.data); - setCorporate(response.data); - }) - .catch((error) => { - console.error('error fetching corporate...', error); - }); - }, []); + await new Promise((resolve) => setTimeout(resolve, 250)); - console.log('Data:', data); - const [encounterData, setEncounterData] = useState({}); - - useEffect(() => { - console.log('fetching encounter data...'); - axios - .get('/claims/${claim_id}/encounters') - .then((response) => { - console.log('encounter data fetched...', response.data); - setEncounterData(response.data); - }) - .catch((error) => { - console.error('error fetching encounter data...', error); - }); - }, []); + const response = await axios.get(`${corporateValue}/service-monitoring/${id}`); + setData(response.data.data); + })(); + }, [corporateValue]); + + function handleDownloadClick(fileUrl: string) { + const tempLink = document.createElement('a'); + tempLink.href = fileUrl; + tempLink.setAttribute('download', 'nama-file-yang-diunduh.pdf'); // Ganti 'nama-file-yang-diunduh.pdf' sesuai kebutuhan + tempLink.style.display = 'none'; + document.body.appendChild(tempLink); + tempLink.click(); + document.body.removeChild(tempLink); + } return ( - - - - navigate('/alarm-center')} - sx={{ marginRight: '10px', color: '#424242' }} - > - - - Service Monitoring - - - Done - - - + + + + + navigate(`/alarm-center/member/${data.member_id}}`)} + sx={{ cursor: 'pointer' }} + /> + + Service Monitoring + + + + {/* Item 1 */} - + - - Employee Profiles + Employee Profiles + + + + + Company Name + {data?.company_name} + + + + + Member ID + {data?.member_code || 'Loading...'} + + - + - Nama perusahaan - {corporate?.name} + Full Name + {data?.member_name} + + - Nama Lengkap - {data?.name || 'Loading...'} + Date of Birth + {data?.birth_date ? fDateSuffix(data?.birth_date) : '-' || 'Loading...'} + + + + - Tanggal lahir - - {data?.birth_date ? fDate(data?.birth_date) : ''} - + Phone Number + {data?.phone} + + - Email - {data?.email} + Email + {data?.email || 'Loading...'} - - No telepon - {data?.phone} - - - - ID Karyawan - 12345678 - + {/* Item 2 */} - - + + - - Diagnose Summary + Diagnose Summary - - - Gejala - Nyeri dada - - - Tanda - Sesak Napas - - - Main Diagnose - - J46 Status asthmaticus, Acute severe asthma - - - - Diagnosis pembanding - K21 Gastro-oesophageal reflux disease - + + + + Symptoms + {data?.symptoms} + + + + + Sign + {data?.sign || 'Loading...'} + + + + + Main Diagnosis + + {data?.main_diagnose} + + + + + + + Comparative Diagnosis + + {data?.comparative_diagnosis} + + + + + + + + + + {/* Item 3 */} - - + + - - Services + Services - - - - Evakuasi medis - Land Transportation + + + + Code + {data?.service_name} - - Rumah sakit - Primaya Hospital + + + + Benefit Name + {data?.benefit_name || 'Loading...'} - - - Tanggal mulai - 17 Aug 2022 - - - Selesai - 18 Aug 2022 - + + + + Hospital + {data?.hospital} - - Daftar layanan - - Inpatient, Medivac (Medical Evacuation) - + + + + Admission Date + {data?.admission_date ? fDateSuffix(data?.admission_date) : '-'} - + + + + Discharge Date + { data?.discharge_date ? fDateSuffix(data?.discharge_date) : '-'} + + - - - - } label="Daily Monitoring" {...a11yProps(0)} /> - } - label="Laboratorium Result" - {...a11yProps(1)} - /> - - - - Item One - - - Item Two - + + + + + + + + + + + + + {data?.dialy_monitoring.length > 0 ? data?.dialy_monitoring.map((row, index) => ( + + + + + + + {fDateSuffix(row.date)} + + + + + +
+ + + + Subject + {row.subject_title} + + + + + Objektif + + + + + Body Temperature + + + + + {row.body_temperature} + + + + + + + Sistole + + + + + {row.sistole} + + + + + + + Diastole + + + + + {row.diastole} + + + + + + + Respiration Rate + + + + + {row.respiration_rate} + + + + + Analysis + + + + + {row.analisis_title} + + + + + Perencanaan + + + + +
    + {row.Perencanaan.length > 0 ? row.Perencanaan.map((r, index) => ( +
  • {r}
  • + )) :
  • -
  • } +
+
+
+
+
+ +
+
+
+
+ )) : + + No Data Found + + } +
+
+
+ +
+ + + + + {data?.laboratorium_result.length > 0 ? data?.laboratorium_result.map((row, index) => ( + + + {row[index]?.datetime ? fDateSuffix(row[index].datetime) : ''} + {row.length > 0 ? row.map((list, i) => ( + + + + + + Date + Examination + Location + + + + + + + + + {list.examination} + {list.location} + + handleDownloadClick(list.file)} > + + Download + + + } /> + + +
+
+ )) : Data Not Found} +
+
+ )) : + + Data Not Found + + } +
+
+
+
-
); } diff --git a/frontend/client-portal/src/pages/AlarmCenter/UserProfile.tsx b/frontend/client-portal/src/pages/AlarmCenter/UserProfile.tsx index 7265980a..0c7a740b 100644 --- a/frontend/client-portal/src/pages/AlarmCenter/UserProfile.tsx +++ b/frontend/client-portal/src/pages/AlarmCenter/UserProfile.tsx @@ -24,7 +24,6 @@ export default function UserProfile() { const { themeStretch } = useSettings(); // const navigate = useNavigate(); const [data, setData] = useState(); - const [data1, setData1] = useState(); const { corporateValue } = useContext(UserCurrentCorporateContext); const { id } = useParams(); @@ -40,10 +39,10 @@ export default function UserProfile() { }); }, []); - console.log('data', data); +// console.log('data', data); return ( - + {/* navigate()}> @@ -62,7 +61,7 @@ export default function UserProfile() { {/* Item 2 */} - + @@ -75,7 +74,7 @@ export default function UserProfile() { {/* Item 2 */} - + diff --git a/frontend/client-portal/src/pages/ClaimReport/Detail.tsx b/frontend/client-portal/src/pages/ClaimReport/Detail.tsx new file mode 100644 index 00000000..ec709358 --- /dev/null +++ b/frontend/client-portal/src/pages/ClaimReport/Detail.tsx @@ -0,0 +1,69 @@ +// mui +import { Container, Grid, Stack, Typography } from '@mui/material'; +// components +import Page from '../../components/Page'; +// utils +import useSettings from '../../hooks/useSettings'; +// section +import CardFamilyInformation from '../../sections/alarm-center/user-profile/CardFamilyInformation'; +// react +import { useNavigate, useParams } from 'react-router-dom'; +import ButtonBack from '../../components/ButtonBack'; +import { useEffect, useState, useContext } from 'react'; +import axios from '../../utils/axios'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +// pages +import DetailTimeline from '../../pages/ClaimReport/DetailTimeline'; +import DetailStepper from '../../pages/ClaimReport/DetailStepper'; +import { format } from 'date-fns'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; + +// ---------------------------------------------------------------------- + +export default function Detail() { + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const [data, setData] = useState(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + const { id } = useParams(); + + useEffect(() => { + axios + .get(corporateValue + '/claim-report/detail/' + id) + .then((response) => { + setData(response.data); + }) + .catch((error) => { + console.error(error); + }); + + }, []); + + return ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + Detail + {data ? ( + + Submission Date + {(data && data.data) ? format(new Date(data.data.status.submission_date), "d MMM yyyy") : ''} + + ) : ''} + + {data ? ( + + + + + + + + + ) : ''} + + + ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/pages/ClaimReport/DetailHistory.tsx b/frontend/client-portal/src/pages/ClaimReport/DetailHistory.tsx new file mode 100644 index 00000000..f50494f1 --- /dev/null +++ b/frontend/client-portal/src/pages/ClaimReport/DetailHistory.tsx @@ -0,0 +1,291 @@ +// mui +import { + Container, + Grid, + Stack, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Button, + Box, + TableSortLabel, + Avatar } from '@mui/material'; +// components +import Page from '../../components/Page'; +// utils +import useSettings from '../../hooks/useSettings'; +// section +import CardFamilyInformation from '../../sections/alarm-center/user-profile/CardFamilyInformation'; +// react +import { useNavigate, useParams } from 'react-router-dom'; +import ButtonBack from '../../components/ButtonBack'; +import { useEffect, useState, useContext } from 'react'; +import axios from '../../utils/axios'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { format } from 'date-fns'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import { fCurrency } from '../../utils/formatNumber'; + +// ---------------------------------------------------------------------- + +export default function DetailHistory() { + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const [data, setData] = useState(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + const { id } = useParams(); + + useEffect(() => { + axios + .get(corporateValue + '/claim-report/detail-history/' + id) + .then((response) => { + setData(response.data); + }) + .catch((error) => { + console.error(error); + }); + + }, []); + + return ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + History + + {data ? ( + + + + Name + {data.data.member.name} + + + Member ID + {data.data.member.member_id} + + + Claim Code + {data.data.member.code} + + + + + + {/* Table Header */} + + + + No + + + Date + + + Requirment + + + Request Claim + + + Approval Claim + + + + {/* End Table Header */} + {/* Table Body */} + + {data?.data?.claim_item?.length === 0 ? ( + + + No data available + + + ) : ( + data.data.claim_item?.map((dataItem, index) => ( + + + {parseInt(index)+1} + + + + {format(new Date(dataItem.submission_date), "d MMM yyyy")} + + + + {dataItem.description} + + + {fCurrency(dataItem.nominal_ditagihkan)} + + + {fCurrency(dataItem.nominal_dicover)} + + + )) + )} + + + {/* End Table Body */} +
+
+
+ {data.data.tot_claim_item ? ( + + + + {/* Table Body */} + + + + + + + + + + + + + Request Claim + + + {data.data.tot_claim_item.nominal_ditagihkan ? fCurrency(data.data.tot_claim_item.nominal_ditagihkan) : '-'} + + + + + + + + + + + + + + Approval Claim + + + {data.data.tot_claim_item.nominal_dicover ? fCurrency(data.data.tot_claim_item.nominal_dicover) : '-'} + + + + + + + + + + + + + + Difference + + + {data.data.tot_claim_item.difference ? fCurrency(data.data.tot_claim_item.difference) : '-'} + + + + {/* End Table Body */} +
+
+ + Note : Apabila terdapat perbedaan nominal silahkan hubungi kami + Gmail Icon + +
+ ) : ''} +
+ ) : ''} +
+
+ ); +} \ No newline at end of file diff --git a/frontend/client-portal/src/pages/ClaimReport/DetailStepper.tsx b/frontend/client-portal/src/pages/ClaimReport/DetailStepper.tsx new file mode 100644 index 00000000..18dc959a --- /dev/null +++ b/frontend/client-portal/src/pages/ClaimReport/DetailStepper.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stepper from '@mui/material/Stepper'; +import Step from '@mui/material/Step'; +import StepLabel from '@mui/material/StepLabel'; +import { useEffect, useState } from 'react'; +import ClearIcon from '@mui/icons-material/Clear'; + +const steps = [ + 'Request', + 'Review', + 'Approval', + 'Decline', +]; + +export default function HorizontalLinearAlternativeLabelStepper({data}) { + const [active, setActive] = useState(0); + const [status, SetStatus] = useState(null); + let updatedSteps = [...steps]; + useEffect(() => { + if (data && data.data) { + if (data.data.status.status === 'requested') { + setActive(1); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'reviewed') { + setActive(2); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'approved') + { + setActive(3); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if(data.data.status.status === 'declined') + { + setActive(4) + updatedSteps = updatedSteps.filter(step => step !== 'Approval'); + } + } + SetStatus(updatedSteps); + }, [data]); + + + + + return ( + + + {status?.map((label) => ( + + : ''}>{label} + + ))} + + + ); +} diff --git a/frontend/client-portal/src/pages/ClaimReport/DetailTimeline.tsx b/frontend/client-portal/src/pages/ClaimReport/DetailTimeline.tsx new file mode 100644 index 00000000..dc071b58 --- /dev/null +++ b/frontend/client-portal/src/pages/ClaimReport/DetailTimeline.tsx @@ -0,0 +1,428 @@ +import * as React from 'react'; +import Timeline from '@mui/lab/Timeline'; +import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; +import TimelineSeparator from '@mui/lab/TimelineSeparator'; +import TimelineConnector from '@mui/lab/TimelineConnector'; +import TimelineContent from '@mui/lab/TimelineContent'; +import TimelineDot from '@mui/lab/TimelineDot'; +import {Typography, Card, Stack, ButtonBase, Box, Divider} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import Iconify from '../../components/Iconify'; +import { useEffect, useState, useRef, useContext } from 'react'; +import { format } from 'date-fns'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; +import DescriptionIcon from '@mui/icons-material/Description'; +import { LoadingButton } from '@mui/lab'; +import axios from '../../utils/axios'; +import { makeFormData } from '../../utils/jsonToFormData'; +import { enqueueSnackbar } from 'notistack'; +import { useParams} from 'react-router-dom'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; + +const Item1 = styled(Paper)(({ theme }) => ({ + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + backgroundColor: '#919EAB29', + color: '#637381', + width: 'fit-content', + marginRight: 'auto', +})); + +const Item2 = styled(Paper)(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + color: theme.palette.text.secondary, + width: 'fit-content', + marginLeft: 'auto', +})); + +export default function NoOppositeContent({data}) { + const [timeline, setTimeline] = useState(null); + const [requestFile, setRequestFile] = useState(null); + const [document, setDocument] = useState(null); + useEffect(() => { + if (data && data.data) { + setTimeline(data.data.timeline); + setRequestFile(data.data.request_files); + setDocument(data.data.documents); + } + + }, [data]); + + // Diagnosis + const fileRequestDocumentInputDiagnosis = useRef(null); + const [fileDiagnosis, setFileDiagnosis] = useState([]); + const handleRequestDocumentInputChangeDiagnosis = (event) => { + if (event.target.files[0]) { + setFileDiagnosis([...fileDiagnosis, ...event.target.files]); + } + }; + const removeFileDiagnois = (filesState, index) => { + setFileDiagnosis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Kondisi + const fileRequestDocumentInputKondisi = useRef(null); + const [fileKondisi, setFileKondisi] = useState([]); + const handleRequestDocumentInputChangeKondisi = (event) => { + if (event.target.files[0]) { + setFileKondisi([...fileKondisi, ...event.target.files]); + } + }; + const removeFileKondisi = (filesState, index) => { + setFileKondisi( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Result + const fileRequestDocumentInputResult = useRef(null); + const [fileResult, setFileResult] = useState([]); + const handleRequestDocumentInputChangeResult = (event) => { + if (event.target.files[0]) { + setFileResult([...fileResult, ...event.target.files]); + } + }; + const removeFileResult = (filesState, index) => { + setFileResult( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + const { corporateValue } = useContext(UserCurrentCorporateContext); + const { id } = useParams(); + const [submitLoading, setSubmitLoading] = useState(false); + const submitRequestFiles = () => { + setSubmitLoading(true); + const formData = makeFormData({ + fileDiagnosis: fileDiagnosis, + fileKondisis: fileKondisi, + fileResults: fileResult + }); + axios + .post(corporateValue + '/claim-report/'+id+'/request-files', formData) + .then((response) => { + window.location.reload(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }); + } + const submitButton = requestFile?.find((dataRequestFile) => dataRequestFile.check_files === null); + return ( + <> + {timeline?.map((dataTimeline, index) => ( + + {dataTimeline.date ? format(new Date(dataTimeline.date), "d MMM yyyy") : ''} + + + + + + + + + + {dataTimeline.date ? format(new Date(dataTimeline.date), "HH : mm") : ''} + {dataTimeline.txt_status} + + + Detail: + {dataTimeline.description} + + {dataTimeline.status === 'reviewed' && requestFile ? ( + <> + {submitButton ? ( + Request Document + ) : ( + Request Document Success Uploaded + )} + {/* Diagnosis */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-diagnosis' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Diagnosis + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosis && + fileDiagnosis.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileDiagnois(fileDiagnosis, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputDiagnosis.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeDiagnosis(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Kondisi */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-kondisi' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Condition + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisi && + fileKondisi.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileKondisi(fileKondisi, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputKondisi.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeKondisi(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Supporting Result */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-result' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Supporting Result + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileResult && + fileResult.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileResult(fileResult, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputResult.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeResult(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {submitButton ? ( + { + submitRequestFiles(); + }} + loading={submitLoading} + > + Submit + + ) : ''} + + ) : ''} + + + {dataTimeline.status === 'requested' ? ( + + + + + Documents + + + {document?.map((dataDocument, index) => ( + + + {dataDocument.type === 'claim-diagnosis' ? + 'Diagnosis' + : dataDocument.type === 'claim-kondisi' ? + 'Condition' + : dataDocument.type === 'claim-result' ? + 'Supporting Result' + : dataDocument.type === 'claim-invoice' ? + 'Invoice' + : ''} + + + + + {dataDocument.original_name ? dataDocument.original_name : '-'} + + + + ))} + + + + ) : ''} + + + + ))} + + ); +} diff --git a/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx b/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx index 44c59d93..c0fd6eb8 100644 --- a/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx @@ -1,183 +1,211 @@ // @mui -import { - Button, - Box, - Stepper, - Step, - StepLabel, - Card, - Typography, - Divider, - Stack, - } from '@mui/material'; - import { Add } from '@mui/icons-material'; - // components - import MuiDialog from '../../components/MuiDialog'; - // theme - import palette from '../../theme/palette'; - // React - import { ReactElement } from 'react'; - - type DataContent = { - info: string; - date: string; - time: string; - }; - - type MuiDialogProps = { - title?: { - name?: string; - icon?: string; - }; - openDialog: boolean; - setOpenDialog: Function; - content?: ReactElement; - data?: DataContent[]; - }; - - const steps = ['Review', 'Approval', 'Disbursement']; - - const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => { - function clickHandler(arg0: string) { - throw new Error('Function not implemented.'); - } +import { Box, Stepper, Step, StepLabel, Card, Typography, Divider, Stack } from '@mui/material'; +// React +import { useContext, useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router'; +// axios +import axios from '../../utils/axios'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { fDate, fPostFormat } from '../../utils/formatTime'; +import Iconify from '../../components/Iconify'; - // const getContent = () => ( - - // ); - - return ( - - <> - - - Claim Request - - - Submission date - 15 / 05 / 2022 - - - - - {steps.map((label) => ( - - {label} - - ))} - - - - - 17 Mei 2022 - - - - - - {/* Item 1 */} - - - 09:10 WIB - - Approval - - - - - - Details : mohon melengkapi kekurangan dokumen - - - Lab pemeriksaan darah - - - - - {/* Item 2 */} - - - 09:00 WIB - - Approval - - - - - - Details : Penilaian Dokter - - - - {/* Item 3 */} - - - 08:00 WIB - - Review - - - - - - Details : Klaim Diajukan - - - - - - - // - ); +const steps = ['Review', 'Approval', 'Disbursement']; + +interface DataHistoriesClaimRequest { + title: string; + description: string; + created_at: string; +} + +interface DataFilesClaimRequest { + id: number; + fileName: string; + fileUrl: string; +} + +interface DataClaimRequest { + claimId: number; + claimRequestId: number; + fullName: string; + histories: DataHistoriesClaimRequest[]; + status: string; + submissionDate: string | Date; + files: { + claimConditions: DataFilesClaimRequest[]; + claimResults: DataFilesClaimRequest[]; + claimDiagnosis: DataFilesClaimRequest[]; }; - - export default DialogDetailClaim; - \ No newline at end of file +} + +const DialogDetailClaim = () => { + const { id } = useParams(); + const navigate = useNavigate(); + const { corporateValue } = useContext(UserCurrentCorporateContext); + const [corporateValueBefore, setCorporateValueBefore] = useState(corporateValue); + const [data, setData] = useState(null); + + // inisialisasi pertama + useEffect(() => { + axios + .get(`${corporateValue}/claim-report/${id}`) + .then((response) => { + setData(response.data.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + }, []); + + // Navigasi ke claim-report ketika corporateValue berubah + useEffect(() => { + if (corporateValueBefore !== corporateValue) { + navigate(`/claim-report`); + } + }, [corporateValue]); + + return ( + <> + + + Claim Request for {data?.fullName} + + + Submission date + + {fPostFormat(data ? data.submissionDate : new Date(), 'dd / MM / yyyy')} + + + + + + {steps.map((label) => ( + + {label} + + ))} + + + + + {fDate(data ? data?.histories[0].created_at : new Date())} + + + + + + {data?.histories.map((history, index) => ( + + + + {fPostFormat(history.created_at, 'HH:mm')} WIB + + + + + + Details : {history.description} + + + {history.title} + + + + ))} + + + + Dokumen Kelengkapan + + + + + Kondisi + + } + spacing={1} + sx={{ marginY: 2 }} + > + {data && + data.files.claimConditions.map((file, index) => ( + + + + - {file.fileName} + + + + ))} + + + Diagnosa + } + spacing={1} + sx={{ marginY: 2 }} + > + {data && + data.files.claimDiagnosis.map((file, index) => ( + + + + - {file.fileName} + + + + ))} + + + Hasil + } + spacing={1} + sx={{ marginY: 2 }} + > + {data && + data.files.claimResults.map((file, index) => ( + + + + - {file.fileName} + + + + ))} + + + + + + + ); +}; + +export default DialogDetailClaim; diff --git a/frontend/client-portal/src/pages/ClaimReport/Index.tsx b/frontend/client-portal/src/pages/ClaimReport/Index.tsx index 7e46fa2b..aa00441f 100644 --- a/frontend/client-portal/src/pages/ClaimReport/Index.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/Index.tsx @@ -4,7 +4,6 @@ import { useContext, useEffect, useState } from 'react'; import { Container, Grid } from '@mui/material'; /* ------------------------------- components ------------------------------- */ import Page from '../../components/Page'; -import TableList from '../../components/Table'; /* ---------------------------------- hooks --------------------------------- */ import useSettings from '../../hooks/useSettings'; /* -------------------------------- sections -------------------------------- */ @@ -13,161 +12,67 @@ import CardClaimStatus from '../../sections/claim-report/CardClaimStatus'; import axios from '../../utils/axios'; /* --------------------------------- context -------------------------------- */ import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; -/* --------------------------------- orders --------------------------------- */ -import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; -import { useSearchParams } from 'react-router-dom'; import List from './List'; -import ClaimItems from '../Claims/components/ClaimItems'; -import DiagnosisHistory from '../Claims/components/DiagnosisHistory'; -import Documents from '../Claims/components/Documents'; +// theme +import palette from '../../theme/palette'; +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; + +interface ClaimStatusType { + name: string; + value: number; + color: string; +} export default function Drugs() { const { themeStretch } = useSettings(); const { corporateValue } = useContext(UserCurrentCorporateContext); - - const [listClaimStatusItems, setListClaimStatusItems] = useState([]); - const [listAllMemberByClaimStatus, setListAllMemberByClaimStatus] = useState([]); - - /* -------------------------------------------------------------------------- */ - /* setTable */ - /* -------------------------------------------------------------------------- */ - - const [isLoading, setIsLoading] = useState(true); - - const loadings = { - isLoading: isLoading, - setIsLoading: setIsLoading, - }; - - /* ------------------------------ handle params ----------------------------- */ - const [searchParams, setSearchParams] = useSearchParams(); - const [appliedParams, setAppliedParams] = useState({}); - - const params = { - searchParams: searchParams, - setSearchParams: setSearchParams, - appliedParams: appliedParams, - setAppliedParams: setAppliedParams, - }; - /* -------------------------------------------------------------------------- */ - - /* ------------------------------ handle order ------------------------------ */ - const [order, setOrder] = useState('asc'); - const [orderBy, setOrderBy] = useState('fullName'); - - const orders = { - order: order, - setOrder: setOrder, - orderBy: orderBy, - setOrderBy: setOrderBy, - }; - /* -------------------------------------------------------------------------- */ - - /* ---------------------------- handle pagination --------------------------- */ - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(10); - - const [paginationTable, setPaginationTable] = useState({ - current_page: 0, - from: 0, - last_page: 0, - links: [], - path: '', - per_page: 0, - to: 0, - total: 0, - }); - - const paginations = { - page: page, - setPage: setPage, - rowsPerPage: rowsPerPage, - setRowsPerPage: setRowsPerPage, - paginationTable: paginationTable, - setPaginationTable: setPaginationTable, - }; - /* -------------------------------------------------------------------------- */ - - /* -------------------------------- headCell -------------------------------- */ - const headCells: HeadCell[] = [ - { - id: 'memberId', - align: 'left', - label: 'Member ID', - isSort: true, - }, - { - id: 'fullName', - align: 'center', - label: 'Name', - isSort: true, - }, - { - id: 'division', - align: 'center', - label: 'Divisi', - isSort: true, - }, - { - id: 'submissionDate', - align: 'center', - label: 'Submission Date', - isSort: true, - }, - { - id: 'status', - align: 'center', - label: 'Status', - isSort: true, - }, - ]; - /* -------------------------------------------------------------------------- */ + const [listClaimStatusItems, setListClaimStatusItems] = useState([]); useEffect(() => { (async () => { - setIsLoading(true); + const claimStatus = await axios.get(`${corporateValue}/claim-report/claim-status`); - const parameters = - Object.keys(appliedParams).length !== 0 - ? appliedParams - : Object.fromEntries([ - ...searchParams.entries(), - ['order', orders.order], - ['orderBy', orders.orderBy], - ]); - - const claim = await axios.get(`${corporateValue}/members`, { - params: { ...parameters, type: 'claim-report' }, - }); - - setSearchParams(parameters); - - setListClaimStatusItems(claim.data.data.allClaimStatus); - setListAllMemberByClaimStatus(claim.data.data.allMembersByClaimStatus.data); - setPaginationTable(claim.data.data.allMembersByClaimStatus); - - setIsLoading(false); + setListClaimStatusItems([ + { + name: 'Requested', + value: claimStatus.data.data.requesteds, + color: '#159C9C', + }, + { + name: 'Approval', + value: claimStatus.data.data.approveds, + color: '#229A16', + }, + // { + // name: 'Disbrusment', + // value: claimStatus.data.data.disbrusments, + // color: '#BF6919', + // }, + { + name: 'Decline', + value: claimStatus.data.data.rejecteds, + color: '#B72136', + }, + ]); })(); - }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + }, [corporateValue]); return ( + - - - {/* */} + diff --git a/frontend/client-portal/src/pages/ClaimReport/List.tsx b/frontend/client-portal/src/pages/ClaimReport/List.tsx index 52b45fae..d9bc3008 100644 --- a/frontend/client-portal/src/pages/ClaimReport/List.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/List.tsx @@ -1,404 +1,268 @@ /* ---------------------------------- @mui ---------------------------------- */ -import { - Paper, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - TextField, - Stack, - IconButton, - Button, - TableSortLabel, - Box, - } from '@mui/material'; - import DialogDetailClaim from '../../sections/dashboard/DialogDetailClaim'; - import { visuallyHidden } from '@mui/utils'; - import { MoreVert as MoreVertIcon } from '@mui/icons-material'; - /* ---------------------------------- axios --------------------------------- */ - // import axios from 'axios'; - import axios from '../../utils/axios'; - /* ---------------------------------- react --------------------------------- */ - import { useContext, useEffect, useState } from 'react'; - - /* -------------------------------- component ------------------------------- */ - import Iconify from '../../components/Iconify'; - import BaseTablePagination from '../../components/BaseTablePagination'; - import TableComponent from '../../components/Table'; - import { Navigate } from 'react-router-dom'; - - /* ---------------------------------- hooks --------------------------------- */ - import useMap from '../../hooks/useMap'; - /* ---------------------------------- theme --------------------------------- */ - import palette from '../../theme/palette'; - import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; - import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; - import { useSearchParams, useNavigate } from 'react-router-dom'; - - - /* ---------------------------------- types --------------------------------- */ - - // type PaginationTableProps = { - // current_page: number; - // from: number; - // last_page: number; - // links: []; - // path: string; - // per_page: number; - // to: number; - // total: number; - // }; - - // type DataTableProps = { - // fullName: string; - // memberId: string; - // service: string; - // start_date: string; - // end_date: string; - // status: boolean | number; - // }; - - // /* -------------------------------------------------------------------------- */ - - // /* -------------------------- enchanced table head -------------------------- */ - - // type Order = 'asc' | 'desc'; - - // interface HeadCell { - // id: string; - // label: string; - // } - - // const headCells: readonly HeadCell[] = [ - // { - // id: 'name', - // label: 'Name', - // }, - // { - // id: 'member_id', - // label: 'Member ID', - // }, - // { - // id: 'service', - // label: 'Service', - // }, - // { - // id: 'start_date', - // label: 'Start Date', - // }, - // { - // id: 'end_date', - // label: 'End Date', - // }, - // { - // id: 'status', - // label: 'Status', - // }, - // ]; - - // interface EnhancedTableProps { - // onRequestSort: (event: React.MouseEvent, property: string) => void; - // order: Order; - // orderBy: string; - // } - - // function EnhancedTableHead(props: EnhancedTableProps) { - // const { order, orderBy, onRequestSort } = props; - // const createSortHandler = (property: string) => (event: React.MouseEvent) => { - // onRequestSort(event, property); - // }; - - // return ( - // - // - // No - // {headCells.map((headCell) => ( - // - // - // {headCell.label} - // {orderBy === headCell.id ? ( - // - // {order === 'desc' ? 'sorted descending' : 'sorted ascending'} - // - // ) : null} - // - // - // ))} - // - // - // ); - // } - +import { Stack, Button, MenuItem } from '@mui/material'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import TableComponent from '../../components/Table'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate } from 'react-router-dom'; +import { fDate, fDateSuffix } from '../../utils/formatTime'; +import Typography from '@mui/material/Typography'; +import { format } from 'date-fns'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import SearchIcon from '@mui/icons-material/Search'; +import Label from '../../components/Label'; + +export default function List() { + const navigate = useNavigate(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const [data, setData] = useState([]); + /* -------------------------------------------------------------------------- */ - - export default function List() { - const navigate = useNavigate(); - - const { corporateValue } = useContext(UserCurrentCorporateContext); - - const [data, setData] = useState([]); - - /* -------------------------------------------------------------------------- */ - /* setting up for the table */ - /* -------------------------------------------------------------------------- */ - const [isLoading, setIsLoading] = useState(true); - - const loadings = { - isLoading: isLoading, - setIsLoading: setIsLoading, - }; - - /* ------------------------------ handle params ----------------------------- */ - const [searchParams, setSearchParams] = useSearchParams(); - const [appliedParams, setAppliedParams] = useState({}); - - const params = { - searchParams: searchParams, - setSearchParams: setSearchParams, - appliedParams: appliedParams, - setAppliedParams: setAppliedParams, - }; - /* -------------------------------------------------------------------------- */ - - /* ------------------------------ handle order ------------------------------ */ - const [order, setOrder] = useState('asc'); - const [orderBy, setOrderBy] = useState('fullName'); - - const orders = { - order: order, - setOrder: setOrder, - orderBy: orderBy, - setOrderBy: setOrderBy, - }; - /* -------------------------------------------------------------------------- */ - - /* ---------------------------- handle pagination --------------------------- */ - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(10); - - const [paginationTable, setPaginationTable] = useState({ - current_page: 0, - from: 0, - last_page: 0, - links: [], - path: '', - per_page: 0, - to: 0, - total: 0, - }); - - const paginations = { - page: page, - setPage: setPage, - rowsPerPage: rowsPerPage, - setRowsPerPage: setRowsPerPage, - paginationTable: paginationTable, - setPaginationTable: setPaginationTable, - }; - - /* -------------------------------------------------------------------------- */ - - /* ------------------------------ handle search ----------------------------- */ - const [searchText, setSearchText] = useState(''); - - const handleSearchSubmit = async (event: React.FormEvent) => { - event.preventDefault(); - - if (searchText === '') { - searchParams.delete('search'); - const params = Object.fromEntries([...searchParams.entries()]); - setAppliedParams(params); - } else { - const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); - setAppliedParams(params); + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('desc'); + const [orderBy, setOrderBy] = useState('member_id'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: true, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* -------------------------------- headCell -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'submission_date', + align: 'center', + label: 'Request Date', + isSort: true, + }, + { + id: 'member_id', + align: 'left', + label: 'Member ID', + isSort: true, + }, + { + id: 'code', + align: 'left', + label: 'Claim Code', + isSort: true, + }, + { + id: 'full_name', + align: 'left', + label: 'Name', + isSort: true, + }, + + { + id: 'division_name', + align: 'left', + label: 'Division', + isSort: true, + }, + { + id: 'status', + align: 'center', + label: 'Status', + isSort: true, + }, + { + id: 'action', + align: 'right', + label: '', + isSort: false, + }, + ]; + + useEffect(() => { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`${corporateValue}/members`, { + params: { ...parameters, type: 'claim-report' }, + }); + + setData( + response.data.data.map((obj: any) => ({ + ...obj, + status: + obj.status === 'requested' ? ( + + ) : obj.status === 'approved' ? ( + + ) : obj.status === 'declined' ? ( + + ) : obj.status === 'pending' ? ( + + ) : obj.status === 'reviewed' ? ( + + ) : ( + + ), + submission_date: + + , + action: + + navigate ('/claim-report/detail/'+obj.claimRequestId)}> + + Detail + + navigate ('/claim-report/detail-history/'+obj.claimRequestId)}> + + History + + + } /> + })) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); } - }; - - const searchs = { - searchText: searchText, - setSearchText: setSearchText, - handleSearchSubmit: handleSearchSubmit, - }; - - /* -------------------------------- headCell -------------------------------- */ - const headCells: HeadCell[] = [ - { - id: 'memberId', - align: 'left', - label: 'Member ID', - isSort: true, - }, - { - id: 'fullName', - align: 'left', - label: 'Name', - isSort: true, - }, - - { - id: 'division', - align: 'left', - label: 'Divisi', - isSort: true, - }, - /* { - id: 'end_date', - align: 'center', - label: 'End Date', - isSort: false, - }, */ - { - id: 'status', - align: 'center', - label: 'Status', - isSort: true, - }, - { - id: 'action', - align: 'right', - label: '', - isSort: false, - }, - - ]; + setIsLoading(false); + })(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); - const [open, setOpen] = useState(null); - - const handleOpen = (event: React.MouseEvent) => { - setOpen(event.currentTarget); - }; - - const handleClose = () => { - setOpen(null); - }; - - /* const clickHandler = (isDialog: string) => { - switch (isDialog) { - - case 'infoDetail': - setDialogTitle('Claim Details'); - setIsDialog(isDialog); - setOpenDialog(true); - break; - - default: - break; - } - }; */ - /* -------------------------------------------------------------------------- */ - - - - useEffect(() => { - (async () => { - setIsLoading(true); - - await new Promise((resolve) => setTimeout(resolve, 250)); - - const parameters = - Object.keys(appliedParams).length !== 0 - ? appliedParams - : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); - - const response = await axios.get(`${corporateValue}/members`, { - params: { ...parameters }, - }); - - setData( - response.data.data.map((obj: any) => { - - - return { - ...obj, - - /* memberId: , */ - status: - obj.status === 1 ? ( - - - - ) : ( - - ), - /* action: ( - clickHandler('infoDetail')}> - - - ), */ - - }; - }) - ); - - setPaginationTable(response.data); - setRowsPerPage(response.data.per_page); - - if (searchParams.get('page')) { - //@ts-ignore - const currentPage = parseInt(searchParams.get('page')) - 1; - - paginationTable.current_page = currentPage; - setPage(currentPage); - } - - setIsLoading(false); - })(); - }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); - - return ( - - - - - - ); - } - \ No newline at end of file + return ( + + + + ); +} diff --git a/frontend/client-portal/src/pages/ClaimSubmit/DialogDetailClaim.tsx b/frontend/client-portal/src/pages/ClaimSubmit/DialogDetailClaim.tsx new file mode 100644 index 00000000..12941722 --- /dev/null +++ b/frontend/client-portal/src/pages/ClaimSubmit/DialogDetailClaim.tsx @@ -0,0 +1,505 @@ +// @mui +import { styled } from '@mui/material/styles'; +import { + Button, + Box, + LinearProgress, + linearProgressClasses, + Stepper, + Step, + StepLabel, + Card, + Typography, + Divider, + Stack, + Grid, + Avatar, + ButtonBase, +} from '@mui/material'; +import { Add } from '@mui/icons-material'; +// components +import MuiDialog from '../../components/MuiDialog'; +/*------------------------------------ icon ----------------------------------- */ +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +// theme +import palette from '../../theme/palette'; +// React +import { Fragment, ReactElement, useEffect, useRef, useState } from 'react'; +import { useSearchParams, useNavigate, Link } from 'react-router-dom'; +import { fPostFormat } from '../../utils/formatTime'; +import { fCurrency } from '../../utils/formatNumber'; +import { LoadingButton } from '@mui/lab'; +import Iconify from '../../components/Iconify'; +import { useSelector } from 'react-redux'; +import { RootState } from '../../store'; +import { makeFormData } from '../../utils/jsonToFormData'; +import { useSnackbar } from 'notistack'; +import axiosInstance from '../../utils/axios'; + +// -------------------------------- type -------------------------------------- +type DataContentType = { + id: number; + fullName: string; + memberId: string; + limit: { + current: number; + total: number; + percentage: number; + }; + avatar?: { + url?: string; + title?: string; + }; +}; + +type ClaimSubmission = { + id: number; + personID: string; + personName: string; + typePatient: string; + limit: { + current: number; + total: number; + percentage: number; + }; + avatar: { + url: string; + }; + fileRealInvoice: any[]; + anotherDocument: any[]; + laboratoryResult: any[]; +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + data: DataContentType; +}; + +/* --------------------------------- styles --------------------------------- */ +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 300 : 800], + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + background: 'linear-gradient(270deg, #19BBBB 38.42%, #FF9565 76.21%, #FE7253 104.02%)', + }, +})); +/* -------------------------------------------------------------------------- */ + +const steps = ['Review', 'Approval', 'Disbursement']; + +const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => { + const navigate = useNavigate(); + const { enqueueSnackbar } = useSnackbar(); + + const [submitLoading, setSubmitLoading] = useState(false); + const selectedData = useSelector((state: RootState) => state.claims.data); + const [dataContent, setDataContent] = useState([]); + + useEffect(() => { + if (selectedData.length > 0) { + let temp: ClaimSubmission[] = selectedData.map((item) => ({ + id: item.id, + avatar: { + url: '', + }, + limit: item.limit, + personID: item.memberId, + personName: item.fullName, + typePatient: 'IP', + service_type: item.service_type, + anotherDocument: [], + fileRealInvoice: [], + laboratoryResult: [], + })); + + setDataContent(temp); + } else { + navigate('/claim-submit', { replace: true }); + } + }, [selectedData]); + + const handleServiceCode = (data: ClaimSubmission, index?: number) => { + let temp = dataContent.map((item) => { + if (item.personID === data.personID) { + return { + ...item, + typePatient: item.typePatient === 'IP' ? 'OP' : 'IP', + }; + } else { + return item; + } + }); + + setDataContent(temp); + }; + + const handleInputFile = ( + event: any, + data: ClaimSubmission, + typeFile: 'invoice' | 'another' | 'lab' + ) => { + if (event.target.files[0]) { + let temp = dataContent.map((item) => { + if (item.personID === data.personID) { + if (typeFile === 'invoice') { + return { + ...item, + fileRealInvoice: [...item.fileRealInvoice, event.target.files[0]], + }; + } else if (typeFile === 'another') { + return { + ...item, + anotherDocument: [...item.anotherDocument, event.target.files[0]], + }; + } else { + return { + ...item, + laboratoryResult: [...item.laboratoryResult, event.target.files[0]], + }; + } + } else { + return item; + } + }); + + setDataContent(temp); + } else { + console.log('NO FILE'); + } + }; + + const handleRemoveFile = ( + data: ClaimSubmission, + typeFile: 'invoice' | 'another' | 'lab', + index: number + ) => { + let temp = dataContent.map((item) => { + if (item.personID === data.personID) { + if (typeFile === 'invoice') { + return { + ...item, + fileRealInvoice: item.fileRealInvoice.filter((file, fileIndex) => fileIndex != index), + }; + } else if (typeFile === 'another') { + return { + ...item, + anotherDocument: item.anotherDocument.filter((file, fileIndex) => fileIndex != index), + }; + } else { + return { + ...item, + laboratoryResult: item.laboratoryResult.filter((file, fileIndex) => fileIndex != index), + }; + } + } else { + return item; + } + }); + + setDataContent(temp); + }; + + const onSubmit = () => { + setSubmitLoading(true); + const mapArrayToFormData = (claims: ClaimSubmission[]): FormData => { + const formData = new FormData(); + + claims.forEach((claim, index) => { + formData.append(`member_id[${index}]`, claim.id.toString()); + formData.append(`service_code[${index}]`, claim.typePatient); + + claim.laboratoryResult.forEach((file, fileIndex) => { + formData.append(`laboratorium[member_${claim.id}][${fileIndex}]`, file); + }); + + claim.anotherDocument.forEach((file, fileIndex) => { + formData.append(`prescription[member_${claim.id}][${fileIndex}]`, file); + }); + + claim.fileRealInvoice.forEach((file, fileIndex) => { + formData.append(`invoice[member_${claim.id}][${fileIndex}]`, file); + }); + }); + + return formData; + }; + + const formData = mapArrayToFormData(dataContent); + + axiosInstance + .post('/claim-requests', formData) + .then((response) => { + enqueueSnackbar(response.data.message ?? 'Berhasil membuat data', { variant: 'success' }); + navigate('/claim-submit', { replace: true }); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }) + .finally(() => { + setSubmitLoading(false); + }); + }; + + return ( + <> + + {/* Field 1 */} + + + navigate(`/claim-submit`)} + sx={{ cursor: 'pointer' }} + /> + + Claim Submission{' '} + + + Submission Date{' '} + + + {fPostFormat(new Date(), 'dd MMM yyyy')} + + + + {dataContent.map((row, index) => { + return ( + + + + + + + {row.service_type.map((r, i) => { + return( + + + ) + })} + {/* */} + + + {/* REAL INVOICE */} + + + + Real Invoice + + {row.fileRealInvoice && + row.fileRealInvoice.map((file, fileIndex) => ( + + + {file.name} + { + handleRemoveFile(row, 'invoice', fileIndex); + }} + /> + + + ))} + + + + + + + + + {/* DOCTOR'S PRESCRIPTION AND ANOTHER DOCUMENTS */} + + + + + Doctor's Prescription and Another Documents + + + {row.anotherDocument && + row.anotherDocument.map((file, fileIndex) => ( + + + {file.name} + { + handleRemoveFile(row, 'another', fileIndex); + }} + /> + + + ))} + + + + + + + + + {/* LABORATORY RESULTS */} + + + + Laboraroty Results + + {row.laboratoryResult && + row.laboratoryResult.map((file, fileIndex) => ( + + + {file.name} + { + handleRemoveFile(row, 'lab', fileIndex); + }} + /> + + + ))} + + + + + + + + + + + ); + })} + + + Claim Submit + + + + + ); +}; + +// let temp = [ +// { +// member: "", +// result_file: [ +// "file.pdf", +// "file2.pdf" +// ] +// } +// ] + +export default DialogDetailClaim; + +type ButtonIProp = { + row: ClaimSubmission; + type: 'invoice' | 'another' | 'lab'; + handle: (event: any, row: any, type: any) => void; +}; + +const Buttons = ({ handle, row, type }: ButtonIProp) => { + const ref = useRef(null); + + return ( + ref.current?.click()}> + + + + Add {type} + + + handle(event, row, type)} + /> + + ); +}; diff --git a/frontend/client-portal/src/pages/ClaimSubmit/Index.tsx b/frontend/client-portal/src/pages/ClaimSubmit/Index.tsx new file mode 100644 index 00000000..26f9764a --- /dev/null +++ b/frontend/client-portal/src/pages/ClaimSubmit/Index.tsx @@ -0,0 +1,276 @@ +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; +/* ----------------------------------- mui ---------------------------------- */ +import { Container, Grid, Typography } from '@mui/material'; +/* ------------------------------- components ------------------------------- */ +import Page from '../../components/Page'; +import TableList from '../../components/Table'; +/* ---------------------------------- hooks --------------------------------- */ +import useSettings from '../../hooks/useSettings'; +/* -------------------------------- sections -------------------------------- */ +import CardClaimStatus from '../../sections/claim-submit/CardClaimStatus'; +/* ---------------------------------- utils --------------------------------- */ +import axios from '../../utils/axios'; +/* --------------------------------- context -------------------------------- */ +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +/* --------------------------------- orders --------------------------------- */ +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams } from 'react-router-dom'; +import List from './List'; +import ClaimItems from '../Claims/components/ClaimItems'; +import DiagnosisHistory from '../Claims/components/DiagnosisHistory'; +import Documents from '../Claims/components/Documents'; +// theme +import palette from '../../theme/palette'; +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; +import { Stack } from '@mui/system'; +import { fDateSuffix } from '../../utils/formatTime'; +import DialogClaimSubmitMember from '../../sections/claim-submit/DialogClaimSubmitMember'; + +interface ClaimStatusType { + name: string; + value: number; + color: string; +} + +/* ------------------------------ default data ------------------------------ */ +type DataMember = { + id: number; + fullName: string; + memberId: string; + limit: { + current: number; + total: number; + percentage: number; + }; + avatar?: { + url?: string; + title?: string; + }; +}; + +type CardPolicyProps = { + limit: { + myLimit: { + balance: number; + total: number; + percentage: number; + }; + lockLimit: { + balance: number; + percentage: number; + }; + }; + topUpLimit: { + companyName: string; + policyNumber: number; + totalMembers: number; + totalCases: number; + totalPersen: number; + myLimit: { + balance: number; + total: number; + percentage: number; + }; + maxTopUp: number; + }; + members?: DataMember[]; +}; + +export default function Drugs() { + const { themeStretch } = useSettings(); + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const [listClaimStatusItems, setListClaimStatusItems] = useState([]); + const [listAllMemberByClaimStatus, setListAllMemberByClaimStatus] = useState([]); + + /* -------------------------------------------------------------------------- */ + /* setTable */ + /* -------------------------------------------------------------------------- */ + + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + const [policyData, setPolicyData] = useState(); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('asc'); + const [orderBy, setOrderBy] = useState('fullName'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + + + /* ---------------------------- Get Current Date ---------------------------- */ + const current = new Date(); + const date = fDateSuffix(current); + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + /* -------------------------------------------------------------------------- */ + + /* -------------------------------- headCell -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'memberId', + align: 'left', + label: 'Member ID', + isSort: true, + }, + { + id: 'codeRequest', + align: 'left', + label: 'Code Request', + isSort: true, + }, + { + id: 'fullName', + align: 'center', + label: 'Name', + isSort: true, + }, + { + id: 'division', + align: 'center', + label: 'Divisi', + isSort: true, + }, + { + id: 'submissionDate', + align: 'center', + label: 'Submission Date', + isSort: true, + }, + { + id: 'status', + align: 'center', + label: 'Status', + isSort: true, + }, + ]; + /* -------------------------------------------------------------------------- */ + + useEffect(() => { + (async () => { + setIsLoading(true); + + const claimStatus = await axios.get(`${corporateValue}/claim-report/claim-status`); + + setListClaimStatusItems([ + { + name: 'Requested', + value: claimStatus.data.data.requesteds, + color: palette.dark.primary.dark, + }, + { + name: 'Approval', + value: claimStatus.data.data.approveds, + color: palette.dark.warning.dark, + }, + { + name: 'Rejected', + value: claimStatus.data.data.rejecteds, + color: palette.dark.error.dark, + }, + ]); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([ + ...searchParams.entries(), + ['order', orders.order], + ['orderBy', orders.orderBy], + ]); + + const claim = await axios.get(`${corporateValue}/members`, { + params: { ...parameters, type: 'claim-report' }, + }); + + setSearchParams(parameters); + + // setListAllMemberByClaimStatus(claim.data.data.allMembersByClaimStatus.data); + setPaginationTable(claim.data.data.allMembersByClaimStatus); + + setIsLoading(false); + })(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + + return ( + + + + + + Select Employee + + + + Submission Date + {date} + + + + + + + + + ); +} diff --git a/frontend/client-portal/src/pages/ClaimSubmit/List.tsx b/frontend/client-portal/src/pages/ClaimSubmit/List.tsx new file mode 100644 index 00000000..9b63bdc8 --- /dev/null +++ b/frontend/client-portal/src/pages/ClaimSubmit/List.tsx @@ -0,0 +1,114 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { Stack, Button } from '@mui/material'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import CardClaimSubmit from '../../components/CardClaimSubmit'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate } from 'react-router-dom'; +import { fDate } from '../../utils/formatTime'; + +export default function List() { + const navigate = useNavigate(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const [data, setData] = useState([]); + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('desc'); + const [orderBy, setOrderBy] = useState('codeRequest'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: true, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + return ( + + + + ); +} diff --git a/frontend/client-portal/src/pages/Claims/Form.tsx b/frontend/client-portal/src/pages/Claims/Form.tsx index a4898695..e17b17e4 100644 --- a/frontend/client-portal/src/pages/Claims/Form.tsx +++ b/frontend/client-portal/src/pages/Claims/Form.tsx @@ -85,7 +85,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { useEffect(() => { - console.log('defaultValues', defaultValues); +// console.log('defaultValues', defaultValues); if (isEdit && currentClaim) { reset(defaultValues); setMember(defaultValues.member) @@ -102,7 +102,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { setValue(`uploaded_files.${type}`, [...currentFiles, ...files]); - console.log('currentFiles', getValues('uploaded_files')); +// console.log('currentFiles', getValues('uploaded_files')); }; const memberSelected = (member) => { @@ -110,7 +110,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { }; const checkLimit = async () => { - console.log('CHECKING LIMIT'); +// console.log('CHECKING LIMIT'); }; const onSubmit = async (data: any) => { diff --git a/frontend/client-portal/src/pages/Claims/Show.tsx b/frontend/client-portal/src/pages/Claims/Show.tsx index 9d856bd2..3b56af1b 100644 --- a/frontend/client-portal/src/pages/Claims/Show.tsx +++ b/frontend/client-portal/src/pages/Claims/Show.tsx @@ -68,7 +68,7 @@ export default function ClaimsCreateUpdate() { }; const handleSaveClaimItems = () => { - console.log('Storing ', claimItems); +// console.log('Storing ', claimItems); setLoadingClaimItems(true); axios .post(`claims/${id}/update-items`, { diff --git a/frontend/client-portal/src/pages/Claims/components/DialogMemberBenefit.tsx b/frontend/client-portal/src/pages/Claims/components/DialogMemberBenefit.tsx index 757b3448..20faddc4 100644 --- a/frontend/client-portal/src/pages/Claims/components/DialogMemberBenefit.tsx +++ b/frontend/client-portal/src/pages/Claims/components/DialogMemberBenefit.tsx @@ -12,17 +12,17 @@ export default function DialogMemberBenefit({member, setOpenDialog, openDialog, const toggleBenefit = (benefit) => { if (selectedBenefits.includes(benefit)) { - console.log('removing', benefit) +// console.log('removing', benefit) setSelectedBenefits(selectedBenefits.filter((throughBenefit) => benefit.id != throughBenefit.id)) } else { - console.log('adding', benefit) +// console.log('adding', benefit) setSelectedBenefits([...selectedBenefits, benefit]) } } const handleSubmit = () => { onSubmit(selectedBenefits); - console.log ('submitting') +// console.log ('submitting') setOpenDialog(false); setSelectedBenefits([]); } diff --git a/frontend/client-portal/src/pages/Corporate/Form.tsx b/frontend/client-portal/src/pages/Corporate/Form.tsx new file mode 100644 index 00000000..36231505 --- /dev/null +++ b/frontend/client-portal/src/pages/Corporate/Form.tsx @@ -0,0 +1,499 @@ +import * as Yup from 'yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate } from 'react-router-dom'; +import { useContext, useCallback, useEffect, useMemo, useState } from 'react'; +// form +import { Controller, useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +// @mui +import { styled } from '@mui/material/styles'; +import { LoadingButton } from '@mui/lab'; +import { + Box, + Button, + Card, + FormControl, + FormControlLabel, + FormHelperText, + FormLabel, + Grid, + InputLabel, + Menu, + MenuItem, + OutlinedInput, + Radio, + RadioGroup, + Select, + SelectChangeEvent, + Stack, + Typography, +} from '@mui/material'; + +// components +import { + FormProvider, + RHFTextField, + RHFRadioGroup, + RHFUploadAvatar, + RHFSwitch, + RHFEditor, + RHFDatepicker, + RHFMultiCheckbox, + RHFCheckbox, + RHFCustomMultiCheckbox, + RHFSelect, +} from '../../components/hook-form'; +import { Corporate } from '../../@types/corporates'; +import axios from '../../utils/axios'; +import { fCurrency } from '../../utils/formatNumber'; +// import RHFAutocomplete from '../../components/hook-form/RHFAutocomplete'; +import UploadImage from '../../components/UploadImage'; +import { fPostFormat } from '../../utils/formatTime'; +import AddIcon from '@mui/icons-material/Add'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +// import Link from '@/theme/overrides/Link'; + +const LabelStyle = styled(Typography)(({ theme }) => ({ + ...theme.typography.subtitle2, + color: theme.palette.text.secondary, + marginBottom: theme.spacing(1), +})); + +interface FormValuesProps extends Partial { + taxes: boolean; + inStock: boolean; +} + +type Props = { + // isEdit: boolean; + currentCorporate?: Corporate; +}; + +export default function CorporateForm({currentCorporate }: Props) { + const navigate = useNavigate(); + const [corporate_groups, setCorporateGroups] = useState([]); + const { corporateValue } = useContext(UserCurrentCorporateContext); + // const [ errors, setErrors ] = useState<{ [key: string]: string }>({}); + + const { enqueueSnackbar } = useSnackbar(); + let NewCorporateSchema = Yup.object().shape({ + welcome_message: Yup.string().required('Welcome Message is required'), + // reason: Yup.string().required('Reason for update is required when editing data'), + }); + + const defaultValues = useMemo( + () => ({ + code: currentCorporate?.code || '', + name: currentCorporate?.name || '', + reason: currentCorporate?.reason || '', + payor_id: currentCorporate?.payor_id || '', + welcome_message: currentCorporate?.welcome_message || '', + help_text: currentCorporate?.help_text || '', + active: currentCorporate?.id ? currentCorporate?.active === 1 : true, + automatic_linking: currentCorporate?.id ? currentCorporate?.automatic_linking === 1 : true, + policy_id: currentCorporate?.current_policy?.id || '', + policy_code: currentCorporate?.current_policy?.code || '', + policy_total_premi: currentCorporate?.current_policy?.total_premi || 0, + policy_minimal_deposit_percentage: + currentCorporate?.current_policy?.minimal_deposit_percentage || 50, + policy_minimal_deposit_net: currentCorporate?.current_policy?.minimal_deposit_net || 0, + policy_minimal_alert_percentage: + currentCorporate?.current_policy?.minimal_alert_percentage || 25, + policy_minimal_alert_net: currentCorporate?.current_policy?.minimal_alert_net || 0, + policy_stop_service_percentage: + currentCorporate?.current_policy?.minimal_stop_service_percentage || 25, + policy_stop_service_net: currentCorporate?.current_policy?.minimal_stop_service_net || 0, + policy_start: currentCorporate?.current_policy?.start || '', + policy_end: currentCorporate?.current_policy?.end || '', + linking_rules: currentCorporate?.linking_rules || ['nric', 'nik', 'member_id'], + type: currentCorporate?.type || 'corporate', + logo: currentCorporate?.logo || '', + }), + // eslint-disable-next-line react-hooks/exhaustive-deps + [currentCorporate] + ); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const values = watch(); + + useEffect(() => { + axios + .get(`/${corporateValue}/corporate`) + .then((res) => { + // console.log(res.data.data[0], 'tussr') + const data = res.data.data[0]; + setCorporateGroups(res.data.data[0]); + reset({ + code: data?.code || '', + name: data?.name || '', + reason: data?.reason || '', + payor_id: data?.payor_id || '', + welcome_message: data?.welcome_message || '', + help_text: data?.help_text || '', + active: data?.id ? data?.active === 1 : true, + automatic_linking: data?.id ? data?.automatic_linking === 1 : true, + policy_id: data?.current_policy?.id || '', + policy_code: data?.current_policy?.code || '', + policy_total_premi: data?.current_policy?.total_premi || 0, + policy_minimal_deposit_percentage: + data?.current_policy?.minimal_deposit_percentage || 50, + policy_minimal_deposit_net: data?.current_policy?.minimal_deposit_net || 0, + policy_minimal_alert_percentage: + data?.current_policy?.minimal_alert_percentage || 25, + policy_minimal_alert_net: data?.current_policy?.minimal_alert_net || 0, + policy_stop_service_percentage: + data?.current_policy?.minimal_stop_service_percentage || 25, + policy_stop_service_net: data?.current_policy?.minimal_stop_service_net || 0, + policy_start: data?.current_policy?.start || '', + policy_end: data?.current_policy?.end || '', + linking_rules: data?.linking_rules || ['nric', 'nik', 'member_id'], + type: data?.type || 'corporate', + logo: data?.logo || '', + }); + }) + .catch((err) => { + enqueueSnackbar('Opps, failed to get Corporate Group List', { variant: 'error' }); + }); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentCorporate]); + const currentImage = currentCorporate?.avatar_url; + const [file, setFile] = useState(null); + const [save, setSave] = useState(null); + + // console.log('save', save); + + const onSubmit = async (data: FormValuesProps) => { + try { + const formData = new FormData(); + formData.append('logo', file); + formData.append('name', data.name); + formData.append('automatic_linking', data.automatic_linking ? 1 : 0); + formData.append('welcome_message', data.welcome_message); + formData.append('reason', data.reason); + formData.append('help_text', data.help_text); + formData.append('linking_rules', data.linking_rules); + + // console.log('MOTHERFUCKER', data.linking_rules) + formData.append('_method', 'PUT'); + const response = await axios.post(`/${corporateValue}/corporate-update`, formData); + + reset(); + enqueueSnackbar( + 'Corporate Updated Successfully!', + { variant: 'success' } + ); + navigate('/corporate'); + } catch (error: any) { + if (error && error.response.status === 422) { + // for (const [key, value] of Object.entries(error.response.data.errors)) { + // setError(key, { message: value[0] }); + // enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); + // } + for (const [key, value] of Object.entries(error.response.data.errors)) { + // setError(key, { message: value[0] }); + enqueueSnackbar(value ?? 'Failed Processing Request', { variant: 'error' }); + } + } else { + enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); + } + } + }; + + const handleDrop = useCallback( + (acceptedFiles) => { + setValue( + 'logo', + acceptedFiles.map((file: Blob | MediaSource) => + Object.assign(file, { + preview: URL.createObjectURL(file), + }) + ) + ); + }, + [setValue] + ); + + const handleRemove = (file: File | string) => { + setValue('logo', null); + }; + + // Only Handle Change on Policy Total Premi + useEffect(() => { + let calc_policy_minimal_deposit_net = + (values.policy_total_premi * values.policy_minimal_deposit_percentage) / 100; + setValue('policy_minimal_deposit_net', calc_policy_minimal_deposit_net); + + let calc_policy_minimal_alert_net = + (values.policy_total_premi * values.policy_minimal_alert_percentage) / 100; + setValue('policy_minimal_alert_net', calc_policy_minimal_alert_net); + + let calc_policy_stop_service_net = + (values.policy_total_premi * values.policy_stop_service_percentage) / 100; + setValue('policy_stop_service_net', calc_policy_stop_service_net); + }, [values.policy_total_premi]); + + // Only Handle on Change Policy Minimal Deposit + const handleMinimalDepositNetChange = (e) => { + setValue('policy_minimal_deposit_net', e.target.value); + setValue( + 'policy_minimal_deposit_percentage', + (e.target.value / values.policy_total_premi) * 100 + ); + }; + const handleMinimalDepositPercentageChange = (e) => { + setValue('policy_minimal_deposit_percentage', e.target.value); + setValue('policy_minimal_deposit_net', (values.policy_total_premi * e.target.value) / 100); + }; + // Only Handle on Change Minimal Alert + const handleMinimalAlertNetChange = (e) => { + setValue('policy_minimal_alert_net', e.target.value); + setValue('policy_minimal_alert_percentage', (e.target.value / values.policy_total_premi) * 100); + }; + const handleMinimalAlertPercentageChange = (e) => { + setValue('policy_minimal_alert_percentage', e.target.value); + setValue('policy_minimal_alert_net', (values.policy_total_premi * e.target.value) / 100); + }; + // Only Handle on Change Minimum Stop Service + const handleStopServiceNetChange = (e) => { + setValue('policy_stop_service_net', e.target.value); + setValue('policy_stop_service_percentage', (e.target.value / values.policy_total_premi) * 100); + }; + const handleStopServicePercentageChange = (e) => { + setValue('policy_stop_service_percentage', e.target.value); + setValue('policy_stop_service_net', (values.policy_total_premi * e.target.value) / 100); + }; + + const linking_rules_checkbox_name = 'linking_rules'; + const linking_tools = [ + { + value: 'nric', + label: 'No. KTP', + }, + { + value: 'nik', + label: 'Nomor Induk Karyawan (NIK)', + }, + { + value: 'member_id', + label: 'Member ID', + }, + { + value: 'policy_code', + label: 'Policy Number', + }, + { + value: 'phone', + label: 'Nomor Telepon', + }, + { + value: 'email', + label: 'E-Mail', + }, + { + value: 'name', + label: 'Nama Lengkap', + }, + { + value: 'dob', + label: 'Tanggal Lahir', + }, + ]; + + const types = [ + { + value: 'corporate', + label: 'Corporate', + }, + { + value: 'subcorporate', + label: 'Sub Corporate', + }, + ]; + + const options = [ + { + label: 'Something', + id: 'Something', + }, + { + label: 'Syalalalal', + id: 'Syalalalal', + }, + { + label: 'Lilili', + id: 'Lilili', + }, + ]; + const [isDisabled, setIsDisabled] = useState(true); + const handleTypeChange = (event: SelectChangeEvent) => { + setValue('type', event.target.value); + }; + + return ( + + {/* Corporate Detail */} + + + + + + Corporate Profile + + + Corporate Profile* + + + ))} + + + {/* // TODO Use Autocomplete */} + {/* {values.type == 'subcorporate' && ( + + + ))} + + )} */} + Corporate Code* + + + Corporate Name* + + + Payor ID* + + + {/* + + + + + + */} + + + + Welcome Message * + + + + + + + Help Text + + + + + {/*
+ Images + +
*/} +
+
+
+ + + + + + + Company Logo + + + {/* + + Company Active + + + + Company Automatic Linking + + + */} + + + {/* + + + Linking Rules + + + + + + */} + + + + + + + + + + + {'Save'} + + + + +
+
+ ); +} diff --git a/frontend/client-portal/src/pages/Corporate/Index.tsx b/frontend/client-portal/src/pages/Corporate/Index.tsx new file mode 100644 index 00000000..c5cdf266 --- /dev/null +++ b/frontend/client-portal/src/pages/Corporate/Index.tsx @@ -0,0 +1,142 @@ +/* ---------------------------------- react --------------------------------- */ +import { useState, SyntheticEvent } from 'react'; +/* ---------------------------------- @mui ---------------------------------- */ +import { Box, Tabs, Tab, Container, Grid, Card } from '@mui/material'; +import { styled } from '@mui/material/styles'; +/* ------------------------------- components ------------------------------- */ +import Page from '../../components/Page'; +/* ---------------------------------- hooks --------------------------------- */ +import useSettings from '../../hooks/useSettings'; +import List from './List'; +import ServiceMonitoring from './ServiceMonitoring'; +import UserProfile from './UserProfile'; +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; + +/* ------------------------------ tabs setting ------------------------------ */ + +/* ---------------------------------- types --------------------------------- */ + +interface TabPanelProps { + children?: React.ReactNode; + index: number; + value: number; +} + +interface StyledTabsProps { + children?: React.ReactNode; + value: number; + onChange: (event: React.SyntheticEvent, newValue: number) => void; +} + +interface StyledTabProps { + label: string; + icon?: string | React.ReactElement; +} + +/* -------------------------------- tab style ------------------------------- */ + +function TabPanel(props: TabPanelProps) { + const { children, value, index, ...other } = props; + + return ( + + ); +} + +function a11yProps(index: number) { + return { + id: `simple-tab-${index}`, + 'aria-controls': `simple-tabpanel-${index}`, + }; +} + +const StyledTabs = styled((props: StyledTabsProps) => )({ + backgroundColor: '#F4F6F8', + padding: '0 24px', + '& .MuiTabs-indicator': { + display: 'flex', + justifyContent: 'space-between', + backgroundColor: 'transparent', + }, + '& .MuiTabs-indicatorSpan': { + maxWidth: 40, + backgroundColor: '#635ee7', + }, +}); + +const StyledTab = styled((props: StyledTabProps) => )( + ({ theme }) => ({ + textTransform: 'none', + fontWeight: 600, + color: theme.palette.grey[600], + marginRight: '5rem', + '&.Mui-selected': { + color: '#212B36', + borderBottom: '2px solid ' + theme.palette.primary.main, + }, + '&:hover': { + color: '#212B36', + opacity: 1, + borderBottom: '2px solid ' + theme.palette.primary.main, + }, + }) +); + +/* -------------------------------------------------------------------------- */ + +export default function Drugs() { + const { themeStretch } = useSettings(); + + const [value, setValue] = useState(0); + const handleChange = (event: SyntheticEvent, newValue: number) => { + setValue(newValue); + }; + + return ( + + + + + + {/* */} + {/* + + + + + + */} + {/* */} + + {/* */} + {/* + + + + + */} + {/* */} + + + + + ); +} diff --git a/frontend/client-portal/src/pages/Corporate/List.tsx b/frontend/client-portal/src/pages/Corporate/List.tsx new file mode 100644 index 00000000..c6fb0a18 --- /dev/null +++ b/frontend/client-portal/src/pages/Corporate/List.tsx @@ -0,0 +1,354 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Stack, + Button, + TableSortLabel, + Typography, + Box, + MenuItem, +} from '@mui/material'; +import { visuallyHidden } from '@mui/utils'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import BaseTablePagination from '../../components/BaseTablePagination'; +import TableComponent from '../../components/Table'; + +/* ---------------------------------- hooks --------------------------------- */ +import useMap from '../../hooks/useMap'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate, Link } from 'react-router-dom'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; + + +/* ---------------------------------- types --------------------------------- */ + +// type PaginationTableProps = { +// current_page: number; +// from: number; +// last_page: number; +// links: []; +// path: string; +// per_page: number; +// to: number; +// total: number; +// }; + +// type DataTableProps = { +// fullName: string; +// memberId: string; +// service: string; +// start_date: string; +// end_date: string; +// status: boolean | number; +// }; + +// /* -------------------------------------------------------------------------- */ + +// /* -------------------------- enchanced table head -------------------------- */ + +// type Order = 'asc' | 'desc'; + +// interface HeadCell { +// id: string; +// label: string; +// } + +// const headCells: readonly HeadCell[] = [ +// { +// id: 'name', +// label: 'Name', +// }, +// { +// id: 'member_id', +// label: 'Member ID', +// }, +// { +// id: 'service', +// label: 'Service', +// }, +// { +// id: 'start_date', +// label: 'Start Date', +// }, +// { +// id: 'end_date', +// label: 'End Date', +// }, +// { +// id: 'status', +// label: 'Status', +// }, +// ]; + +// interface EnhancedTableProps { +// onRequestSort: (event: React.MouseEvent, property: string) => void; +// order: Order; +// orderBy: string; +// } + +// function EnhancedTableHead(props: EnhancedTableProps) { +// const { order, orderBy, onRequestSort } = props; +// const createSortHandler = (property: string) => (event: React.MouseEvent) => { +// onRequestSort(event, property); +// }; + +// return ( +// +// +// No +// {headCells.map((headCell) => ( +// +// +// {headCell.label} +// {orderBy === headCell.id ? ( +// +// {order === 'desc' ? 'sorted descending' : 'sorted ascending'} +// +// ) : null} +// +// +// ))} +// +// +// ); +// } + +/* -------------------------------------------------------------------------- */ + +export default function List() { + const navigate = useNavigate(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const [data, setData] = useState([]); + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('asc'); + const [orderBy, setOrderBy] = useState('fullName'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: false, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* -------------------------------- headCell -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'code', + align: 'left', + label: 'Code', + isSort: true, + }, + { + id: 'name', + align: 'left', + label: 'Name', + isSort: true, + }, + { + id: 'active', + align: 'center', + label: 'Status', + isSort: true, + }, + { + id: 'action', + align: 'center', + label: '', + isSort: true, + }, + + ]; + /* -------------------------------------------------------------------------- */ + + useEffect(() => { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`${corporateValue}/corporate`, { + params: { ...parameters }, + }); + + setData( + response.data.data.map((obj: any) => { + return { + ...obj, + active: + obj.active === 1 ? ( + + Active + + ) : ( + + ), + action: + + navigate(`/corporate/edit`)}> + + Edit + + navigate(`/corporate/view`)}> + + View + + + } /> + , + }; + }) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + setIsLoading(false); + })(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + + return ( + + + + ); +} diff --git a/frontend/client-portal/src/pages/Corporate/ServiceMonitoring.tsx b/frontend/client-portal/src/pages/Corporate/ServiceMonitoring.tsx new file mode 100644 index 00000000..5fd6e12c --- /dev/null +++ b/frontend/client-portal/src/pages/Corporate/ServiceMonitoring.tsx @@ -0,0 +1,348 @@ +// mui +import { + Box, + Tabs, + Tab, + IconButton, + Container, + Grid, + Card, + Stack, + Typography, +} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import { Favorite } from '@mui/icons-material'; +// components +import Page from '../../components/Page'; +import Iconify from '../../components/Iconify'; +// utils +import useSettings from '../../hooks/useSettings'; +import { useState, SyntheticEvent, useContext, useEffect } from 'react'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { useNavigate, useParams } from 'react-router-dom'; +import axios from '../../utils/axios'; +import { fDate } from '../../utils/formatTime'; + +// sections +// import ListTable from '../../sections/claimreports/ListTable'; +// import ClaimStatusCard from '../../sections/claimreports/ClaimStatusCard'; + +interface TabPanelProps { + children?: React.ReactNode; + index: number; + value: number; +} + +function TabPanel(props: TabPanelProps) { + const { children, value, index, ...other } = props; + + return ( + + ); +} + +function a11yProps(index: number) { + return { + id: `simple-tab-${index}`, + 'aria-controls': `simple-tabpanel-${index}`, + }; +} + +interface StyledTabsProps { + children?: React.ReactNode; + value: number; + onChange: (event: React.SyntheticEvent, newValue: number) => void; +} + +const StyledTabs = styled((props: StyledTabsProps) => )({ + '& .MuiTabs-indicator': { + display: 'flex', + justifyContent: 'center', + backgroundColor: 'transparent', + }, + '& .MuiTabs-indicatorSpan': { + maxWidth: 40, + width: '100%', + backgroundColor: '#635ee7', + }, +}); + +interface StyledTabProps { + label: string; + icon?: string | React.ReactElement; +} + +const StyledTab = styled((props: StyledTabProps) => )( + ({ theme }) => ({ + textTransform: 'none', + fontWeight: 500, + fontSize: theme.typography.pxToRem(20), + color: theme.palette.primary.main, + maxWidth: '100%', + flex: 1, + margin: '0 !important', + '&.Mui-selected': { + color: '#FFF', + backgroundColor: theme.palette.primary.main, + }, + '&:hover': { + backgroundColor: theme.palette.primary.dark, + color: '#FFF', + opacity: 1, + }, + }) +); + +export default function ServiceMonitoring() { + const { themeStretch } = useSettings(); + const navigate = useNavigate(); + + const [value, setValue] = useState(0); + const handleChange = (event: SyntheticEvent, newValue: number) => { + setValue(newValue); + }; + + const [data, setData] = useState({}); + const [corporate, setCorporate] = useState(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + const { id } = useParams(); + const claimId = '2'; +// console.log('id', id); + + useEffect(() => { + console.log('fetching data...'); + axios + .get('/data/' + id) + .then((response) => { +// console.log('data fetched...', response.data); + setData(response.data); + }) + .catch((error) => { + console.error('error fetching data...', error); + }); + + axios + .get('/corporate-manage/' + corporateValue) + .then((response) => { +// console.log('corporate fetched...', response.data); + setCorporate(response.data); + }) + .catch((error) => { + console.error('error fetching corporate...', error); + }); + }, []); + +// console.log('Data:', data); + const [encounterData, setEncounterData] = useState({}); + + useEffect(() => { +// console.log('fetching encounter data...'); + axios + .get('/claims/${claim_id}/encounters') + .then((response) => { +// console.log('encounter data fetched...', response.data); + setEncounterData(response.data); + }) + .catch((error) => { + console.error('error fetching encounter data...', error); + }); + }, []); + + return ( + + + + navigate('/alarm-center')} + sx={{ marginRight: '10px', color: '#424242' }} + > + + + Service Monitoring + + + Done + + + + {/* Item 1 */} + + + + + + Employee Profiles + + + + + Nama perusahaan + {corporate?.name} + + + Nama Lengkap + {data?.name || 'Loading...'} + + + Tanggal lahir + + {data?.birth_date ? fDate(data?.birth_date) : ''} + + + + Email + {data?.email} + + + No telepon + {data?.phone} + + + + ID Karyawan + 12345678 + + + + + + {/* Item 2 */} + + + + + + Diagnose Summary + + + + Gejala + Nyeri dada + + + Tanda + Sesak Napas + + + Main Diagnose + + J46 Status asthmaticus, Acute severe asthma + + + + Diagnosis pembanding + K21 Gastro-oesophageal reflux disease + + + + + + {/* Item 3 */} + + + + + + Services + + + + + Evakuasi medis + Land Transportation + + + Rumah sakit + Primaya Hospital + + + + Tanggal mulai + 17 Aug 2022 + + + Selesai + 18 Aug 2022 + + + + Daftar layanan + + Inpatient, Medivac (Medical Evacuation) + + + + + + + + + + + } label="Daily Monitoring" {...a11yProps(0)} /> + } + label="Laboratorium Result" + {...a11yProps(1)} + /> + + + + Item One + + + Item Two + + + + + + ); +} diff --git a/frontend/client-portal/src/pages/Corporate/Show.tsx b/frontend/client-portal/src/pages/Corporate/Show.tsx new file mode 100644 index 00000000..aa582369 --- /dev/null +++ b/frontend/client-portal/src/pages/Corporate/Show.tsx @@ -0,0 +1,473 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Stack, + Button, + TableSortLabel, + Typography, + Grid, + Box, + Card, + MenuItem, +} from '@mui/material'; +import { visuallyHidden } from '@mui/utils'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import BaseTablePagination from '../../components/BaseTablePagination'; +import TableComponent from '../../components/Table'; +import Page from '../../components/Page'; + +/* ---------------------------------- hooks --------------------------------- */ +import useMap from '../../hooks/useMap'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate, Link } from 'react-router-dom'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; + +/*------------------------------------ icon ----------------------------------- */ +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import UploadImage from '../../components/UploadImage'; +import { Corporate } from '../../@types/corporates'; +import { fDateSuffix } from '../../utils/formatTime'; +import { fSplit } from '../../utils/formatNumber'; + + +/* ---------------------------------- types --------------------------------- */ + +// type PaginationTableProps = { +// current_page: number; +// from: number; +// last_page: number; +// links: []; +// path: string; +// per_page: number; +// to: number; +// total: number; +// }; + +// type DataTableProps = { +// fullName: string; +// memberId: string; +// service: string; +// start_date: string; +// end_date: string; +// status: boolean | number; +// }; + + + +// /* -------------------------------------------------------------------------- */ + +// /* -------------------------- enchanced table head -------------------------- */ + +// type Order = 'asc' | 'desc'; + +// interface HeadCell { +// id: string; +// label: string; +// } + +// const headCells: readonly HeadCell[] = [ +// { +// id: 'name', +// label: 'Name', +// }, +// { +// id: 'member_id', +// label: 'Member ID', +// }, +// { +// id: 'service', +// label: 'Service', +// }, +// { +// id: 'start_date', +// label: 'Start Date', +// }, +// { +// id: 'end_date', +// label: 'End Date', +// }, +// { +// id: 'status', +// label: 'Status', +// }, +// ]; + +// interface EnhancedTableProps { +// onRequestSort: (event: React.MouseEvent, property: string) => void; +// order: Order; +// orderBy: string; +// } + +// function EnhancedTableHead(props: EnhancedTableProps) { +// const { order, orderBy, onRequestSort } = props; +// const createSortHandler = (property: string) => (event: React.MouseEvent) => { +// onRequestSort(event, property); +// }; + +// return ( +// +// +// No +// {headCells.map((headCell) => ( +// +// +// {headCell.label} +// {orderBy === headCell.id ? ( +// +// {order === 'desc' ? 'sorted descending' : 'sorted ascending'} +// +// ) : null} +// +// +// ))} +// +// +// ); +// } + +/* -------------------------------------------------------------------------- */ + +export default function List() { + const navigate = useNavigate(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + const [currentCorporate, setCurrentCorporate] = useState(null); + + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + // useEffect(() => { + // (async () => { + // setIsLoading(true); + + // await new Promise((resolve) => setTimeout(resolve, 250)); + + // const parameters = + // Object.keys(appliedParams).length !== 0 + // ? appliedParams + // : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + // const response = await axios.get(`${corporateValue}/corporate`, { + // params: { ...parameters }, + // }); + // setCurrentCorporate(response.data[0]); + // setPaginationTable(response.data); + // setRowsPerPage(response.data.per_page); + + + + // if (searchParams.get('page')) { + // //@ts-ignore + // const currentPage = parseInt(searchParams.get('page')) - 1; + + // paginationTable.current_page = currentPage; + // setPage(currentPage); + // } + + // setIsLoading(false); + // })(); + // }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + useEffect(() => { + axios.get(`${corporateValue}/corporate`) + .then((response) => { + const data = response.data.data[0]; + setCurrentCorporate(data); + }) + .catch((error) => { + console.error('Error fetching corporate data:', error); + // Handle error here + }); + }, [corporateValue]); + + return ( + + + {/* Field 1 */} + + + navigate(`/corporate`)} sx={{ cursor: "pointer" }} /> + Profile Corporate + + + + + + {/* Field 1 */} + + + Corporate Profile + + + + +
+ user-profile +
+
+ + + + Corporate Type + + + {currentCorporate?.type} + + + Corporate Name + + + {currentCorporate?.name} + + + Corporate Code + + + {currentCorporate?.code} + + + Payor ID + + + {currentCorporate?.payor_id} + + + Welcome Messages + + + {currentCorporate?.welcome_message ? currentCorporate?.welcome_message.replace(/<[^>]*>/g, '') : '-'} + + + Help Text + + + {currentCorporate?.help_text ? currentCorporate?.help_text.replace(/<[^>]*>/g, '') : '-'} + + + Linking Rules + + + +
    + {currentCorporate?.linking_rules ? ( + currentCorporate.linking_rules + .filter(rule => rule) + .map((rule, index) => ( +
  • {rule}
  • + )) + ) : ( +
  • -
  • + )} +
+
+
+
+
+
+
+
+
+
+ + {/* + + + + Policy Detail + + + + + + Corporate Type + + + {currentCorporate?.type} + + + Corporate Name + + + {currentCorporate?.name} + + + Corporate Code + + + {currentCorporate?.code} + + + Payor ID + + + {currentCorporate?.payor_id} + + + Welcome Messages + + + {currentCorporate?.welcome_message.replace(/<[^>]*>/g, '')} + + + Help Text + + + {currentCorporate?.help_text.replace(/<[^>]*>/g, '')} + + + Linking Rules + + + +
    + {currentCorporate?.linking_rules + .filter(rule => rule) // Menghapus elemen yang kosong atau null + .map((rule, index) => ( +
  • {rule}
  • + ))} +
+
+
+
+
+
+
+
+
*/} + + + + + + Policy Detail + + + + + + Policy Number + + + {currentCorporate?.current_policy?.code} + + + Cooperation Start Date + + + {currentCorporate?.current_policy?.start && fDateSuffix(currentCorporate?.current_policy?.start)} + + + Cooperation End Date + + + {currentCorporate?.current_policy?.end && fDateSuffix(currentCorporate?.current_policy?.end)} + + + Deposit Initial Fund + + + + + + + + + + + + Minimal Depost Policy Level + + + Percentage (%) + + + {currentCorporate?.current_policy?.minimal_deposit_percentage} + + + Net + + + (Rp. {currentCorporate?.current_policy?.minimal_deposit_net && fSplit(currentCorporate?.current_policy?.minimal_deposit_net)}) + + + + Minimal Alert Level + + + Percentage (%) + + + {currentCorporate?.current_policy?.minimal_alert_percentage} + + + Net + + + (Rp. {currentCorporate?.current_policy?.minimal_alert_net && fSplit(currentCorporate?.current_policy?.minimal_alert_net)}) + + + + Minimal Stop Service Level + + + Percentage (%) + + + {currentCorporate?.current_policy?.minimal_stop_service_percentage} + + + Net + + + (Rp. {currentCorporate?.current_policy?.minimal_stop_service_net && fSplit(currentCorporate?.current_policy?.minimal_stop_service_net)}) + + + + + + + + +
+ ); +} diff --git a/frontend/client-portal/src/pages/Corporate/UserProfile.tsx b/frontend/client-portal/src/pages/Corporate/UserProfile.tsx new file mode 100644 index 00000000..0c7a740b --- /dev/null +++ b/frontend/client-portal/src/pages/Corporate/UserProfile.tsx @@ -0,0 +1,85 @@ +// mui +import { IconButton, Container, Grid, Stack, Typography } from '@mui/material'; +// components +import Page from '../../components/Page'; +import Iconify from '../../components/Iconify'; +// utils +import useSettings from '../../hooks/useSettings'; +// section +import CardPersonalInformation from '../../sections/alarm-center/user-profile/CardPersonalInformation'; +import CardFamilyInformation from '../../sections/alarm-center/user-profile/CardFamilyInformation'; +import CardPolicyNumber from '../../sections/alarm-center/user-profile/CardPolicyNumber'; +import CardBenefitSummary from '../../sections/alarm-center/user-profile/CardBenefitSummary'; +import CardClaimHistory from '../../sections/alarm-center/user-profile/CardClaimHistory'; +// react +import { useNavigate, useParams } from 'react-router-dom'; +import ButtonBack from '../../components/ButtonBack'; +import { useEffect, useState, useContext } from 'react'; +import axios from '../../utils/axios'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; + +// ---------------------------------------------------------------------- + +export default function UserProfile() { + const { themeStretch } = useSettings(); + // const navigate = useNavigate(); + const [data, setData] = useState(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + const { id } = useParams(); + + useEffect(() => { + axios + .get(corporateValue + '/members/' + id) + .then((response) => { + setData(response.data); + }) + .catch((error) => { + console.error(error); + }); + }, []); + +// console.log('data', data); + + return ( + + + + {/* navigate()}> + + */} + + Profil Peserta + + + {/* Row 1 */} + + + {/* Item 1 */} + + + + {/* Item 2 */} + + + + + + {/* Row 2 */} + + + {/* Item 1 */} + + + + {/* Item 2 */} + + + + + + + + + ); +} diff --git a/frontend/client-portal/src/pages/Dashboard/Index.tsx b/frontend/client-portal/src/pages/Dashboard/Index.tsx index 913931a0..355d4c97 100644 --- a/frontend/client-portal/src/pages/Dashboard/Index.tsx +++ b/frontend/client-portal/src/pages/Dashboard/Index.tsx @@ -177,6 +177,7 @@ export default function Index() { }; const searchs = { + // useSearchs: true, searchText: searchText, setSearchText: setSearchText, handleSearchSubmit: handleSearchSubmit, @@ -278,7 +279,7 @@ export default function Index() { params: { ...parameters }, }); - console.log('member', corporateMembers); +// console.log('member', corporateMembers); const corporateTopUpLimit = await axios.get(`${corporateValue}/topup`); setSearchParams(parameters); @@ -356,7 +357,7 @@ export default function Index() { })(); }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); - console.log(policyData); +// console.log(policyData); return ( diff --git a/frontend/client-portal/src/pages/EmployeeData/Index.tsx b/frontend/client-portal/src/pages/EmployeeData/Index.tsx new file mode 100644 index 00000000..8f182c77 --- /dev/null +++ b/frontend/client-portal/src/pages/EmployeeData/Index.tsx @@ -0,0 +1,124 @@ +/* ---------------------------------- react --------------------------------- */ +import { useState, SyntheticEvent } from 'react'; +/* ---------------------------------- @mui ---------------------------------- */ +import { Box, Tabs, Tab, Container, Grid, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; +/* ------------------------------- components ------------------------------- */ +import Page from '../../components/Page'; +/* ---------------------------------- hooks --------------------------------- */ +import useSettings from '../../hooks/useSettings'; +import List from './List'; +import ServiceMonitoring from './ServiceMonitoring'; +import UserProfile from './UserProfile'; + +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; + +/* ------------------------------ tabs setting ------------------------------ */ + +/* ---------------------------------- types --------------------------------- */ + +interface TabPanelProps { + children?: React.ReactNode; + index: number; + value: number; +} + +interface StyledTabsProps { + children?: React.ReactNode; + value: number; + onChange: (event: React.SyntheticEvent, newValue: number) => void; +} + +interface StyledTabProps { + label: string; + icon?: string | React.ReactElement; +} + +/* -------------------------------- tab style ------------------------------- */ + +function TabPanel(props: TabPanelProps) { + const { children, value, index, ...other } = props; + + return ( + + ); +} + +function a11yProps(index: number) { + return { + id: `simple-tab-${index}`, + 'aria-controls': `simple-tabpanel-${index}`, + }; +} + +const StyledTabs = styled((props: StyledTabsProps) => )({ + backgroundColor: '#F4F6F8', + padding: '0 24px', + '& .MuiTabs-indicator': { + display: 'flex', + justifyContent: 'space-between', + backgroundColor: 'transparent', + }, + '& .MuiTabs-indicatorSpan': { + maxWidth: 40, + backgroundColor: '#635ee7', + }, +}); + +const StyledTab = styled((props: StyledTabProps) => )( + ({ theme }) => ({ + textTransform: 'none', + fontWeight: 600, + color: theme.palette.grey[600], + marginRight: '5rem', + '&.Mui-selected': { + color: '#212B36', + borderBottom: '2px solid ' + theme.palette.primary.main, + }, + '&:hover': { + color: '#212B36', + opacity: 1, + borderBottom: '2px solid ' + theme.palette.primary.main, + }, + }) +); + +/* -------------------------------------------------------------------------- */ + +export default function Drugs() { + const { themeStretch } = useSettings(); + + const [value, setValue] = useState(0); + const handleChange = (event: SyntheticEvent, newValue: number) => { + setValue(newValue); + }; + + return ( + + + + + + + + + + + + + ); +} diff --git a/frontend/client-portal/src/pages/EmployeeData/List.tsx b/frontend/client-portal/src/pages/EmployeeData/List.tsx new file mode 100644 index 00000000..5ecd717c --- /dev/null +++ b/frontend/client-portal/src/pages/EmployeeData/List.tsx @@ -0,0 +1,381 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Stack, + Button, + TableSortLabel, + Box, + MenuItem +} from '@mui/material'; +import { visuallyHidden } from '@mui/utils'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import BaseTablePagination from '../../components/BaseTablePagination'; +import TableComponent from '../../components/Table'; + +/* ---------------------------------- hooks --------------------------------- */ +import useMap from '../../hooks/useMap'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate, Link } from 'react-router-dom'; +import { fDate, fDateSuffix } from '../../utils/formatTime'; +import { format } from 'date-fns'; +import Typography from '@mui/material/Typography'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import Label from '../../components/Label'; + + +/* ---------------------------------- types --------------------------------- */ + +// type PaginationTableProps = { +// current_page: number; +// from: number; +// last_page: number; +// links: []; +// path: string; +// per_page: number; +// to: number; +// total: number; +// }; + +// type DataTableProps = { +// fullName: string; +// memberId: string; +// service: string; +// start_date: string; +// end_date: string; +// status: boolean | number; +// }; + +// /* -------------------------------------------------------------------------- */ + +// /* -------------------------- enchanced table head -------------------------- */ + +// type Order = 'asc' | 'desc'; + +// interface HeadCell { +// id: string; +// label: string; +// } + +// const headCells: readonly HeadCell[] = [ +// { +// id: 'name', +// label: 'Name', +// }, +// { +// id: 'member_id', +// label: 'Member ID', +// }, +// { +// id: 'service', +// label: 'Service', +// }, +// { +// id: 'start_date', +// label: 'Start Date', +// }, +// { +// id: 'end_date', +// label: 'End Date', +// }, +// { +// id: 'status', +// label: 'Status', +// }, +// ]; + +// interface EnhancedTableProps { +// onRequestSort: (event: React.MouseEvent, property: string) => void; +// order: Order; +// orderBy: string; +// } + +// function EnhancedTableHead(props: EnhancedTableProps) { +// const { order, orderBy, onRequestSort } = props; +// const createSortHandler = (property: string) => (event: React.MouseEvent) => { +// onRequestSort(event, property); +// }; + +// return ( +// +// +// No +// {headCells.map((headCell) => ( +// +// +// {headCell.label} +// {orderBy === headCell.id ? ( +// +// {order === 'desc' ? 'sorted descending' : 'sorted ascending'} +// +// ) : null} +// +// +// ))} +// +// +// ); +// } + +/* -------------------------------------------------------------------------- */ + +export default function List() { + const navigate = useNavigate(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const [data, setData] = useState([]); + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('asc'); + const [orderBy, setOrderBy] = useState('fullName'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* -------------------------------- headCell -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'memberId', + align: 'left', + label: 'Member ID', + isSort: true, + }, + { + id: 'fullName', + align: 'left', + label: 'Name', + isSort: true, + }, + + { + id: 'start_date', + align: 'center', + label: 'Start Date', + isSort: true, + }, + { + id: 'end_date', + align: 'center', + label: 'End Date', + isSort: true, + }, + { + id: 'status', + align: 'center', + label: 'Status', + isSort: true, + }, + { + id: 'action', + align: 'center', + label: '', + isSort: true, + }, + ]; + /* -------------------------------------------------------------------------- */ + + useEffect(() => { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`${corporateValue}/members?type=employee-data`, { + params: { ...parameters }, + }); + + setData( + response.data.data.map((obj: any) => { + return { + ...obj, + // memberId: + // + // , + status: + obj.status === 1 ? ( + + ) : ( + + ), + start_date: + + , + end_date: + + , + fullName: + + {obj.fullName} + + , + memberId: + + {obj.memberId} + + , + action: + + navigate ('/employee-data/user-profile/'+obj.personId)}> + + View + + + } /> + }; + }) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + setIsLoading(false); + })(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + + return ( + + + + ); +} diff --git a/frontend/client-portal/src/pages/EmployeeData/UserProfile.tsx b/frontend/client-portal/src/pages/EmployeeData/UserProfile.tsx new file mode 100644 index 00000000..1bd40e40 --- /dev/null +++ b/frontend/client-portal/src/pages/EmployeeData/UserProfile.tsx @@ -0,0 +1,69 @@ +// mui +import { IconButton, Container, Grid, Stack, Typography } from '@mui/material'; +// components +import Page from '../../components/Page'; +import Iconify from '../../components/Iconify'; +// utils +import useSettings from '../../hooks/useSettings'; +// section +import CardPersonalInformation from '../../sections/alarm-center/user-profile/CardPersonalInformation'; +import CardFamilyInformation from '../../sections/alarm-center/user-profile/CardFamilyInformation'; +import CardPolicyNumber from '../../sections/alarm-center/user-profile/CardPolicyNumber'; +import CardBenefitSummary from '../../sections/alarm-center/user-profile/CardBenefitSummary'; +import CardClaimHistory from '../../sections/alarm-center/user-profile/CardClaimHistory'; +// react +import { useNavigate, useParams } from 'react-router-dom'; +import ButtonBack from '../../components/ButtonBack'; +import { useEffect, useState, useContext } from 'react'; +import axios from '../../utils/axios'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; + +// ---------------------------------------------------------------------- + +export default function UserProfile() { + const { themeStretch } = useSettings(); + const navigate = useNavigate(); + const [data, setData] = useState(); + + const { corporateValue } = useContext(UserCurrentCorporateContext); + const { id } = useParams(); + + useEffect(() => { + axios + .get(corporateValue + '/members/' + id) + .then((response) => { + setData(response.data); + }) + .catch((error) => { + console.error(error); + }); + }, []); + +// console.log('data', data); + + return ( + + + + {/* navigate()}> + + */} + navigate(-1)}/> + Profile + + {data ? ( + + {/* Row 1 */} + + + + + + + + ) : ''} + + + ); +} diff --git a/frontend/client-portal/src/routes/index.tsx b/frontend/client-portal/src/routes/index.tsx index 15325387..4eac0cdd 100644 --- a/frontend/client-portal/src/routes/index.tsx +++ b/frontend/client-portal/src/routes/index.tsx @@ -73,6 +73,26 @@ export default function Router() { }, ], }, + { + path: '/employee-data', + element: ( + + + + + + ), + children: [ + { + element: , + index: true, + }, + { + path: '/employee-data/user-profile/:id', + element: , + } + ], + }, { path: '/alarm-center', element: ( @@ -88,11 +108,57 @@ export default function Router() { index: true, }, { - path: 'service-monitoring/:id', + path: 'member/:id', + element: , + }, + { + path: 'member/:id/service-monitoring/:id', element: , }, ], }, + + + { + path: '/claim-submit', + element: ( + + + + + + ), + children: [ + { + element: , + index: true, + }, + { + path: 'dialog-detail', + element: + }, + ], + }, + { + path: '/claim-request/:id', + element: ( + + + + + + ), + children: [ + { + element: , + index: true, + }, + { + path: 'dialog-detail', + element: + }, + ], + }, { path: '/claim-report', element: ( @@ -108,9 +174,13 @@ export default function Router() { index: true, }, { - path: 'dialog-detail', - element: + path: '/claim-report/detail/:id', + element: , }, + { + path: '/claim-report/detail-history/:id', + element: , + } ], }, { @@ -133,6 +203,30 @@ export default function Router() { }, ], }, + { + path: '/corporate', + element: ( + + + + + + ), + children: [ + { + element: , + index: true, + }, + { + path: 'edit', + element: , + }, + { + path: 'view', + element: , + }, + ], + }, { path: '*', element: , @@ -152,8 +246,13 @@ const Login = Loadable(lazy(() => import('../pages/auth/Login'))); const Dashboard = Loadable(lazy(() => import('../pages/Dashboard/Index'))); const NotFound = Loadable(lazy(() => import('../pages/Page404'))); +// Employee Data +const EmployeeData = Loadable(lazy(() => import('../pages/EmployeeData/Index'))); +const EmployeeDataUserProfile = Loadable(lazy(() => import('../pages/EmployeeData/UserProfile'))); + // Alarm Center const AlarmCenter = Loadable(lazy(() => import('../pages/AlarmCenter/Index'))); +const AlarmCenterMemberPerList = Loadable(lazy(() => import('../pages/AlarmCenter/ListMember'))); const AlarmCenterServiceMonitoring = Loadable( lazy(() => import('../pages/AlarmCenter/ServiceMonitoring')) ); @@ -163,4 +262,17 @@ const AlarmCenterUserProfile = Loadable(lazy(() => import('../pages/AlarmCenter/ const ClaimReport = Loadable(lazy(() => import('../pages/ClaimReport/Index'))); const Claims = Loadable(lazy(() => import('../pages/Claims/Index'))); const ClaimShow = Loadable(lazy(() => import('../pages/Claims/Show'))); -const DialogDetailClaim = Loadable(lazy(()=> import('../pages/ClaimReport/DialogDetailClaim'))); \ No newline at end of file +const DialogDetailClaim = Loadable(lazy(()=> import('../pages/ClaimReport/DialogDetailClaim'))); +const DetailClaimReport = Loadable(lazy(()=> import('../pages/ClaimReport/Detail'))); +const DetailHitoryClaimReport = Loadable(lazy(()=> import('../pages/ClaimReport/DetailHistory'))); + +// Claim submit +const ClaimSubmit = Loadable(lazy(() => import('../pages/ClaimSubmit/Index'))); + +// Claim Request +const ClaimRequest = Loadable(lazy(() => import('../pages/ClaimSubmit/DialogDetailClaim'))); + +// Corporate +const Corporate = Loadable(lazy(() => import('../pages/Corporate/Index'))); +const CorporateEdit = Loadable(lazy(() => import('../pages/Corporate/Form'))); +const CorporateShow = Loadable(lazy(() => import('../pages/Corporate/Show'))); diff --git a/frontend/client-portal/src/sections/alarm-center/user-profile/CardBenefitSummary.tsx b/frontend/client-portal/src/sections/alarm-center/user-profile/CardBenefitSummary.tsx index 31545408..51d1781d 100644 --- a/frontend/client-portal/src/sections/alarm-center/user-profile/CardBenefitSummary.tsx +++ b/frontend/client-portal/src/sections/alarm-center/user-profile/CardBenefitSummary.tsx @@ -29,7 +29,7 @@ const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ export default function CardBenefitSummary({ data }) { const [benefits, setBenefits] = useState([]); - console.log('data', data); +// console.log('data', data); useEffect(() => { setBenefits(data); }, [data]); @@ -58,7 +58,7 @@ export default function CardBenefitSummary({ data }) { Yearly Limits - + 0 / diff --git a/frontend/client-portal/src/sections/alarm-center/user-profile/CardClaimHistory.tsx b/frontend/client-portal/src/sections/alarm-center/user-profile/CardClaimHistory.tsx index 372fe314..2e4ba592 100644 --- a/frontend/client-portal/src/sections/alarm-center/user-profile/CardClaimHistory.tsx +++ b/frontend/client-portal/src/sections/alarm-center/user-profile/CardClaimHistory.tsx @@ -13,6 +13,7 @@ import { } from '@mui/material'; // react import { useState } from 'react'; +import { fDate } from '../../../utils/formatTime'; // ---------------------------------------------------------------------- @@ -20,27 +21,22 @@ function createData(benefitType: string, submissionDate: string, status: string) return { benefitType, submissionDate, status }; } -const rows = [ - createData('Rawat Jalan', '15-10-2022', 'Request'), - createData('Rawat Inap', '15-10-2022', 'Request'), - createData('Manfaat Special', '15-10-2022', 'Request'), - createData('Perobatan Mata', '15-10-2022', 'Request'), - createData('Perawatan Gigi', '15-10-2022', 'Request'), - createData('Kehamilan', '15-10-2022', 'Request'), - createData('Laboratorium', '15-10-2022', 'Request'), - createData('Manfaat Farmasi', '15-10-2022', 'Request'), -]; - // ---------------------------------------------------------------------- -export default function CardClaimHistory(benefitMember) { +export default function CardClaimHistory({ data }) { const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(5); - console.log('benefitMember', benefitMember); const handleChangePage = (event: React.MouseEvent | null, newPage: number) => { setPage(newPage); }; + // Data claim history + const claimHistory = data?.claim_history; + const rows = claimHistory ? claimHistory.map(history => { + return createData(history.description, fDate(history.submission_date), history.status); + }) : []; + + return ( diff --git a/frontend/client-portal/src/sections/alarm-center/user-profile/CardFamilyInformation.tsx b/frontend/client-portal/src/sections/alarm-center/user-profile/CardFamilyInformation.tsx index 9a0422fe..57b85db2 100644 --- a/frontend/client-portal/src/sections/alarm-center/user-profile/CardFamilyInformation.tsx +++ b/frontend/client-portal/src/sections/alarm-center/user-profile/CardFamilyInformation.tsx @@ -1,9 +1,106 @@ // mui -import { Button, Card, Stack, Typography, Grid, Switch } from '@mui/material'; +import { FormHelperText, FormControl, Button, Card, Stack, Typography, Grid, Switch, TextField, IconButton, Select, MenuItem, InputLabel } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import { DatePicker, LocalizationProvider, MobileDatePicker } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; // components import Iconify from '../../../components/Iconify'; +import { fDate, fPostFormat } from '../../../utils/formatTime'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import { useContext, useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; +import axios from '../../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; -export default function CardFamilyInformation() { +export default function CardFamilyInformation({ data }) { + + const [openDialog, setOpenDialog] = useState(false); + const [editIndex, setEditIndex] = useState(null); + const [editedFamilyData, setEditedFamilyData] = useState({}); + const { id } = useParams(); + + //Check Required + //State Field + const [nameField, setNameField] = useState(''); + const [relationshipField, setRelationshipField] = useState(''); + const [birthDateField, setBirthDateField] = useState(''); + const [birthDateFieldCheck, setBirthDateFieldCheck] = useState(1); + const [emailField, setEmailField] = useState(''); + const [emailFieldCheck, setEmailFieldCheck] = useState(false); + const [phoneField, setPhoneField] = useState(''); + //State Field Error + const [nameFieldError, setNameFieldError] = useState(''); + const [relationshipFieldError, setRelationshipFieldError] = useState(''); + const [birthDateFieldError, setBirthDateFieldError] = useState(''); + const [emailFieldError, setEmailFieldError] = useState(''); + const [phoneFieldError, setPhoneFieldError] = useState(''); + + const handleEditData = (index) => { + setEditIndex(index); + setEditedFamilyData(data?.family[index] || {}); + setOpenDialog(true); + + setNameField(data?.family[index].name); + setRelationshipField(data?.family[index].relation_with_principal); + setBirthDateField(data?.family[index].birth_date); + setEmailField(data?.family[index].email); + setEmailFieldCheck(isValidEmail(data?.family[index].email)); + setPhoneField(data?.family[index].phone); + + setNameFieldError(''); + setRelationshipFieldError(''); + setBirthDateFieldError(''); + setEmailFieldError(''); + setPhoneFieldError(''); + }; + + const handleCloseDialog = () => { + setOpenDialog(false); + }; + + const handleSaveData = () => { + if (editIndex !== null) { + try { + + // Salin data keluarga saat ini + const updatedFamily = [...data?.family]; + + // Perbarui data keluarga dengan data yang diedit + updatedFamily[editIndex] = editedFamilyData; + + // Perbarui data utama dengan data keluarga yang telah diperbarui + const updatedData = { ...data, family: updatedFamily[editIndex]}; + + updatedData.family.birth_date = fPostFormat(updatedData.family.birth_date, 'yyyy-MM-dd') ; + + const familyArray = [updatedData.family]; + + axios + .post('/update-family', familyArray) + .then((response) => { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + setOpenDialog(false); + window.location.reload(); + }) + .catch((error) => { + enqueueSnackbar('Failed to update data', { variant: 'error' }); + }); + + } catch (error) { + console.error('Terjadi kesalahan saat menyimpan data:', error); + } + } + }; + + const isValidEmail = (email) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); + }; + + const isRequiredFieldsFilled = () => { + return nameField.trim() !== '' && relationshipField.trim() !== '' && birthDateField !== '' && birthDateFieldCheck !== 0 && emailField.trim() !== '' && emailFieldCheck && phoneField.trim() !== ''; + }; + return ( {/* Stack 1 */} @@ -14,17 +111,17 @@ export default function CardFamilyInformation() { sx={{ paddingY: 1, paddingX: 3 }} > Beneficiary / Family - + {/**/} {/* Stack 2 */} - - {/* Card 1 */} - - + + {data?.family.map((familyMember, index) => ( + + {/* Stack 1 */} user-profile + - Husband + {familyMember?.name} + + {familyMember.relation_with_principal === 'H' + ? 'Husband' + : familyMember.relation_with_principal === 'W' + ? 'Wife' + : familyMember.relation_with_principal === 'S' + ? 'Son' + : familyMember.relation_with_principal === 'D' + ? 'Daughter' + : ''} + + {/* Row 2 */} - + Suspend - + - - Octa Xavier - - - 14 Jan 1986 - - - 082113256754 - - {/* Stack 2 */} - - - - - - {/* Card 2 */} - - - {/* Stack 1 */} - - {/* Row 1 */} - -
- - Kid - - - {/* Row 2 */} - - Suspend - - + + Date of Birth + + + {familyMember?.birth_date != '0000-00-00' ? fDate(familyMember?.birth_date) : '-'} + - - Celine Claudia - - - 15 Oct 2000 - - - 082113256754 - - {/* Stack 2 */} - - - - - - {/* Card 3 */} - - - {/* Stack 1 */} - - {/* Row 1 */} - -
- - Kid - - - {/* Row 2 */} - - Suspend - - + + Email + + + {familyMember?.email} + - - Celine Claudia - - - 15 Oct 2000 - - - 082113256754 - - {/* Stack 2 */} - - - - - - {/* Card 4 */} - - - {/* Stack 1 */} - - {/* Row 1 */} - -
- - Kid - - - {/* Row 2 */} - - Suspend - - + + Phone Number + + + {familyMember?.phone} + - - Celine Claudia - - - 15 Oct 2000 - - - 082113256754 - - {/* Stack 2 */} - - - - - - {/* Card 5 */} - - - {/* Stack 1 */} - - {/* Row 1 */} - -
- - Kid - - - {/* Row 2 */} - - Suspend - - + + Status + + + { + familyMember?.phone === '1' + ? 'Active' + : 'Inactive' + } + - - Celine Claudia - - - 15 Oct 2000 - - - 082113256754 - {/* Stack 2 */} - - - - - - - {/* Card 6 */} - - - {/* Stack 1 */} - - {/* Row 1 */} - -
- - Kid - - - {/* Row 2 */} - - Suspend - - - - - Celine Claudia - - - 15 Oct 2000 - - - 082113256754 - - {/* Stack 2 */} - - - + ))} + {/* Dialog */} + + + + + + Edit Data + + + + + + + + + { + setEditedFamilyData({ ...editedFamilyData, name: e.target.value }) + setNameField(e.target.value); + setNameFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} + fullWidth + sx={{ marginTop: '16px' }} + error={!!nameFieldError} + helperText={nameFieldError} + /> + + + Relationship + + + {relationshipFieldError} + + + + { + setEditedFamilyData({ ...editedFamilyData, birth_date: newValue }); + setBirthDateField(newValue); + setBirthDateFieldError(newValue === '' || newValue === null ? 'This field is required' : ''); + if(newValue !== null) + { + newValue = newValue.toString(); + setBirthDateFieldCheck(newValue === 'Invalid Date' ? 0 : 1); + } + }} + inputFormat="dd-MM-yyyy" + renderInput={(params) => } + /> + + {birthDateFieldError} + + { + setEditedFamilyData({ ...editedFamilyData, email: e.target.value }) + setEmailField(e.target.value); + setEmailFieldError( + e.target.value.trim() === '' ? 'This field is required' : !isValidEmail(e.target.value) ? 'Invalid email address' : '' + ); + setEmailFieldCheck(isValidEmail(e.target.value)); + }} + fullWidth + sx={{ marginTop: '16px' }} + error={!!emailFieldError} + helperText={emailFieldError} + /> + { + let input = e.target.value; + // Hanya izinkan angka dan karakter '+' + input = input.replace(/[^0-9+]/g, ''); + // Batasi panjang input menjadi 15 digit + const maxLength = 15; + const sanitizedInput = input.slice(0, maxLength); + setEditedFamilyData({ ...editedFamilyData, phone: sanitizedInput }); + setPhoneField(sanitizedInput); + setPhoneFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} + fullWidth + sx={{ marginTop: '16px' }} + inputProps={{ + inputMode: 'tel', + pattern: '^\\+?[0-9]*$', // Memungkinkan karakter '+' di awal, diikuti oleh angka + }} + error={!!phoneFieldError} + helperText={phoneFieldError} + /> + + + + + + + + + ); } diff --git a/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx b/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx index 45d19e1b..56fc89ad 100644 --- a/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx +++ b/frontend/client-portal/src/sections/alarm-center/user-profile/CardPersonalInformation.tsx @@ -1,5 +1,6 @@ // mui -import { Button, IconButton, Card, Stack, Typography, TextField } from '@mui/material'; +import { Button, IconButton, Card, Stack, Typography, TextField, InputLabel } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; import { CardMembership, Visibility as VisibilityIcon } from '@mui/icons-material'; // components import Iconify from '../../../components/Iconify'; @@ -22,7 +23,42 @@ export default function CardPersonalInformation({ data }) { const [phone, setPhone] = useState(data?.phone || ''); const [address, setAddress] = useState(data?.main_address_id || ''); - /* const [updatedData, setUpdatedData] = useState(data); */ + //Check Required + const [nameField, setNameField] = useState(''); + const [weightField, setWeightField] = useState(''); + const [heightField, setHeightField] = useState(''); + const [emailField, setEmailField] = useState(''); + const [emailFieldCheck, setEmailFieldCheck] = useState(false); + const [phoneField, setPhoneField] = useState(''); + + const [nameFieldError, setNameFieldError] = useState(''); + const [weightFieldError, setWeightFieldError] = useState(''); + const [heightFieldError, setHeightFieldError] = useState(''); + const [emailFieldError, setEmailFieldError] = useState(''); + const [phoneFieldError, setPhoneFieldError] = useState(''); + + useEffect(() => { + // Periksa apakah data sudah terdefinisi + if (data) { + // Atur state sesuai dengan data yang diterima + setNameField(data?.name || ''); + setWeightField((data?.last_weight_kg || '').toString()); + setHeightField((data?.last_height_cm || '').toString()); + setEmailField(data?.email || ''); + setEmailFieldCheck(isValidEmail(data?.email)); + setPhoneField(data?.phone || ''); + } + }, [data]); + + const isValidEmail = (email) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); + }; + + const isRequiredFieldsFilled = () => { + return nameField.trim() !== '' && weightField.trim() !== '' && heightField.trim() !== '' && emailField.trim() !== '' && emailFieldCheck && phoneField.trim() !== ''; + }; + const handleEditData = () => { setWeight(data?.last_weight_kg || ''); @@ -32,6 +68,20 @@ export default function CardPersonalInformation({ data }) { setAddress(data?.main_address_id || ''); setEditedData(data); setOpenDialog(true); + if (data) { + // Atur state sesuai dengan data yang diterima + setNameField(data?.name || ''); + setWeightField((data?.last_weight_kg || '').toString()); + setHeightField((data?.last_height_cm || '').toString()); + setEmailField(data?.email || ''); + setPhoneField(data?.phone || ''); + + setNameFieldError(''); + setWeightFieldError(''); + setHeightFieldError(''); + setEmailFieldError(''); + setPhoneFieldError(''); + } }; const handleCloseDialog = () => { @@ -59,6 +109,7 @@ export default function CardPersonalInformation({ data }) { // Handle the successful update enqueueSnackbar('Data updated successfully', { variant: 'success' }); setOpenDialog(false); + window.location.reload(); }) .catch((error) => { // Handle the error @@ -75,131 +126,121 @@ export default function CardPersonalInformation({ data }) { justifyContent="space-between" sx={{ paddingY: 1, paddingX: 3 }} > - Informasi Pribadi - + */} {/* Stack 2 */} - -
- user-profile - - - -
- - - Nama Lengkap - {data?.name} - - - Berat Badan - {data?.last_weight_kg} kg - - - Tinggi Badan - {data?.last_height_cm} cm - + + {/* Stack 2.1 */} + + {/*Informasi Dasar*/} + + + user-profile + + Full Name + {data?.name} + + + + Weight + {data?.last_weight_kg} kg + + + Height + {data?.last_height_cm} cm + + {/* Stack 3 */} - + {/* Stack 3.1 */} - Informasi Dasar + {/*Informasi Dasar*/} - - Tempat Lahir + + Place of Birth {data?.birth_place} - - Tanggal Lahir + + Date of Birth {' '} {data?.birth_date ? fDate(data?.birth_date) : ''} - - Jenis Kelamin - {data?.gender} + + Gender + {data?.gender ? data.gender.charAt(0).toUpperCase() + data.gender.slice(1) : ''} {/* Stack 3.2 */} - Informasi Kontak + {/*Informasi Kontak*/} - - Nomor Telpon + + Phone Number {data?.phone} - + Email {data?.email} + + - Alamat + Address {data?.main_address_id} {/* Stack 3.3 */} - Identitas Diri + {/*Identitas Diri*/} - - Nomor NIK + + ID Member {data?.nik} - - + */} {/* Stack 3.4 */} - Informasi Lainnya + {/*Informasi Lainnya*/} - - Agama - {data?.religion} - - - Status + + Marital Status {data?.marital_status} - - Pendidikan + + Education {data?.last_education} - - Pekerjaan + + Occupation {data?.current_employment} @@ -207,44 +248,124 @@ export default function CardPersonalInformation({ data }) { {/* Dialog */} - - Edit Data + + + + + + Edit Data + + + + + + setEditedData({ ...editedData, name: e.target.value })} + onChange={(e) =>{ + setEditedData({ ...editedData, name: e.target.value }); + setNameField(e.target.value); + setNameFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} fullWidth sx={{ marginTop: '16px' }} + inputProps={{ maxLength: 50 }} + error={!!nameFieldError} + helperText={nameFieldError} /> setWeight(e.target.value)} + onChange={(e) => { + let input = e.target.value; + // Hanya izinkan angka + input = input.replace(/[^0-9]/g, ''); + // Batasi panjang input menjadi 3 digit + const maxLength = 3; + const sanitizedInput = input.slice(0, maxLength); + setWeight(sanitizedInput); + setWeightField(sanitizedInput); + setWeightFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} fullWidth sx={{ marginTop: '16px' }} + inputProps={{ + inputMode: 'numeric', + pattern: '[0-9]*', // Memungkinkan hanya karakter angka + }} + error={!!weightFieldError} + helperText={weightFieldError} /> setHeight(e.target.value)} + onChange={(e) => { + let input = e.target.value; + // Hanya izinkan angka + input = input.replace(/[^0-9]/g, ''); + // Batasi panjang input menjadi 3 digit + const maxLength = 3; + const sanitizedInput = input.slice(0, maxLength); + setHeight(sanitizedInput); + setHeightField(sanitizedInput); + setHeightFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} fullWidth sx={{ marginTop: '16px' }} + inputProps={{ + inputMode: 'numeric', + pattern: '[0-9]*', // Memungkinkan hanya karakter angka + }} + error={!!heightFieldError} + helperText={heightFieldError} + /> setEmail(e.target.value)} + onChange={(e) => { + setEmail(e.target.value) + setEmailField(e.target.value); + setEmailFieldError( + e.target.value.trim() === '' ? 'This field is required' : !isValidEmail(e.target.value) ? 'Invalid email address' : '' + ); + setEmailFieldCheck(isValidEmail(e.target.value)); + }} fullWidth sx={{ marginTop: '16px' }} + error={!!emailFieldError} + helperText={emailFieldError} /> setPhone(e.target.value)} + onChange={(e) => { + let input = e.target.value; + // Hanya izinkan angka dan karakter '+' + input = input.replace(/[^0-9+]/g, ''); + // Batasi panjang input menjadi 13 digit + const maxLength = 15; + const sanitizedInput = input.slice(0, maxLength); + setPhone(sanitizedInput); + setPhoneField(sanitizedInput); + setPhoneFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} fullWidth sx={{ marginTop: '16px' }} + inputProps={{ + inputMode: 'tel', + pattern: '^\\+?[0-9]*$', // Memungkinkan karakter '+' di awal, diikuti oleh angka + }} + error={!!phoneFieldError} + helperText={phoneFieldError} /> {/* - diff --git a/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx b/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx index fdfd94b5..879495fa 100644 --- a/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx +++ b/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx @@ -30,7 +30,7 @@ const RootStyle = styled(Card)(({ theme }) => ({ const defaultData = [ { name: 'Requested', value: 5, color: palette.dark.primary.dark }, { name: 'Approval', value: 1, color: palette.dark.warning.dark }, - { name: 'Disbrusment', value: 0, color: palette.dark.success.dark }, + //{ name: 'Disbrusment', value: 0, color: palette.dark.success.dark }, { name: 'Rejected', value: 3, color: palette.dark.error.dark }, ]; @@ -39,13 +39,13 @@ const defaultData = [ export default function CardClaimStatus({ data }: PropsCardClaimStatus) { return ( - + {/* Claim Status - + */} {data ? data.map(({ name, value, color }: ClaimStatusType, key) => ( - + )) : defaultData.map(({ name, value, color }: ClaimStatusType, key) => ( - + ({ + boxShadow: 'none', + padding: theme.spacing(2), + color: 'black', + backgroundColor: theme.palette.grey[200], +})); + +// ---------------------------------------------------------------------- + +const defaultData = [ + { name: 'Requested', value: 5, color: palette.dark.primary.dark }, + { name: 'Approval', value: 1, color: palette.dark.warning.dark }, + { name: 'Disbrusment', value: 0, color: palette.dark.success.dark }, + { name: 'Rejected', value: 3, color: palette.dark.error.dark }, +]; + +// ---------------------------------------------------------------------- + +export default function CardClaimStatus({ data }: PropsCardClaimStatus) { + return ( + + + Claim Status + + + {data + ? data.map(({ name, value, color }: ClaimStatusType, key) => ( + + + + {name} + + + {value} + + + Cases + + + + )) + : defaultData.map(({ name, value, color }: ClaimStatusType, key) => ( + + + + {name} + + + {value} + + + Cases + + + + ))} + + + ); +} diff --git a/frontend/client-portal/src/sections/claim-submit/CardNotification.tsx b/frontend/client-portal/src/sections/claim-submit/CardNotification.tsx new file mode 100644 index 00000000..7727e61d --- /dev/null +++ b/frontend/client-portal/src/sections/claim-submit/CardNotification.tsx @@ -0,0 +1,148 @@ +// @mui +import { styled } from '@mui/material/styles'; +import { Button, Card, Typography, Link, Divider, Stack } from '@mui/material'; +import { ChevronRight } from '@mui/icons-material'; +// components +import Iconify from '../../components/Iconify'; +// Section +import DialogNotification from './DialogNotification'; +import DialogDetailClaim from './DialogDetailClaim'; +// React +import { useState } from 'react'; + +// ---------------------------------------------------------------------- + +type DataContent = { + info: string; + date: string; + time: string; +}; + +type NotificationProps = { + data?: DataContent[]; +}; + +// ---------------------------------------------------------------------- + +const RootNotificationStyle = styled(Card)(({ theme }) => ({ + boxShadow: 'none', + padding: '1.5rem', + color: 'black', + backgroundColor: theme.palette.grey[200], + height: '100%', + maxHeight: '240px', +})); + +const ItemNotificationStyle = styled(Card)(({ theme }) => ({ + boxShadow: 'none', + padding: theme.spacing(1), + borderRadius: 0.5, + color: 'black', + marginTop: 2, + overflowY: 'auto', + maxHeight: '154px', + gap: '0.5rem', +})); + +// ---------------------------------------------------------------------- + +export default function CardNotification({ data }: NotificationProps) { + const [openDialog, setOpenDialog] = useState(false); + const [dialogTitle, setDialogTitle] = useState(''); + const [isDialog, setIsDialog] = useState(''); + + const clickHandler = (isDialog: string) => { + switch (isDialog) { + case 'allNotification': + setDialogTitle('Notification'); + setIsDialog(isDialog); + setOpenDialog(true); + break; + case 'infoDetail': + setDialogTitle('Claim Details'); + setIsDialog(isDialog); + setOpenDialog(true); + break; + + default: + break; + } + }; + + return ( + + + + + + Notification + + + + + + + + {data + ? data.map(({ info, date, time }, index) => ( +
+ {index >= 1 ? : ''} + + + {info} + clickHandler('infoDetail')} + > + Info Detail + + + + {date} + {time} + + +
+ )) + : ''} +
+ + {isDialog === 'allNotification' && ( + + )} + + {isDialog === 'infoDetail' && ( + + )} +
+ ); +} diff --git a/frontend/client-portal/src/sections/claim-submit/CardPolicy.tsx b/frontend/client-portal/src/sections/claim-submit/CardPolicy.tsx new file mode 100644 index 00000000..74a7ea1b --- /dev/null +++ b/frontend/client-portal/src/sections/claim-submit/CardPolicy.tsx @@ -0,0 +1,210 @@ +// @mui +import { styled } from '@mui/material/styles'; +import { + Button, + Card, + Typography, + LinearProgress, + linearProgressClasses, + Stack, +} from '@mui/material'; +// components +import Iconify from '../../components/Iconify'; +// React +import { useState } from 'react'; +// utils +import { fCurrency, fSplit } from '../../utils/formatNumber'; +/* -------------------------------- sections -------------------------------- */ +import DialogTopUpLimit from './DialogTopUpLimit'; +import DialogClaimSubmitMember from './DialogClaimSubmitMember'; + +/* ---------------------------------- types --------------------------------- */ + +type DataMember = { + id: number; + fullName: string; + memberId: string; + limit: { + current: number; + total: number; + percentage: number; + }; + avatar?: { + url?: string; + title?: string; + }; +}; + +type CardPolicyProps = { + data: { + limit: { + myLimit: { + balance: number; + total: number; + percentage: number; + }; + lockLimit: { + balance: number; + percentage: number; + }; + }; + topUpLimit: { + companyName: string; + policyNumber: number; + totalMembers: number; + totalCases: number; + totalPersen: number; + myLimit: { + balance: number; + total: number; + percentage: number; + }; + maxTopUp: number; + }; + members: { + memberId: string; + memberFullName: string; + }; + }; +}; + +/* -------------------------------------------------------------------------- */ + +/* --------------------------------- styled --------------------------------- */ + +const RootBalanceStyle = styled(Card)(({ theme }) => ({ + boxShadow: 'none', + padding: theme.spacing(3), + color: 'black', + backgroundColor: theme.palette.grey[200], + maxHeight: '240px', +})); + +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 300 : 800], + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + backgroundColor: theme.palette.primary.main, + }, +})); + +/* -------------------------------------------------------------------------- */ + +export default function CardPolicy(props: CardPolicyProps) { + const [openDialog, setOpenDialog] = useState(false); + const [dialogTitle, setDialogTitle] = useState(''); + const [isDialog, setIsDialog] = useState(''); + + const { limit, topUpLimit, members } = props.data || {}; + if (!limit || !topUpLimit) { + return null; + } + + const clickHandler = (isDialog: string) => { + switch (isDialog) { + case 'submitClaim': + setDialogTitle('Add Claim'); + setIsDialog(isDialog); + setOpenDialog(true); + break; + case 'topUpLimit': + setDialogTitle('Top Up Limit'); + setIsDialog(isDialog); + setOpenDialog(true); + break; + + default: + break; + } + }; + + return ( + + <> + +
+ + Total Limit + + + {fCurrency(limit.myLimit ? limit.myLimit.balance : 0)} + + + / {fSplit(limit.myLimit ? limit.myLimit.total : 0)} + +
+ + + + {limit.myLimit ? limit.myLimit.percentage : 0}% + + +
+ + + + + + + + Lock Fund ( {limit.lockLimit ? limit.lockLimit.percentage : 0}% ) + + + + {fSplit(limit.lockLimit ? limit.lockLimit.balance : 0)} /{' '} + {fSplit(limit.myLimit ? limit.myLimit.total : 0)} + + + + + + + + + + {isDialog === 'submitClaim' && ( + + )} + + {isDialog === 'topUpLimit' && ( + + )} +
+ ); +} diff --git a/frontend/client-portal/src/sections/claim-submit/DialogClaimSubmitMember.tsx b/frontend/client-portal/src/sections/claim-submit/DialogClaimSubmitMember.tsx new file mode 100644 index 00000000..97b8c279 --- /dev/null +++ b/frontend/client-portal/src/sections/claim-submit/DialogClaimSubmitMember.tsx @@ -0,0 +1,281 @@ +// @mui +import { styled } from '@mui/material/styles'; +import { + Typography, + LinearProgress, + linearProgressClasses, + Stack, + TextField, + InputAdornment, + Card, + Grid, + IconButton, + FormControlLabel, + Checkbox, +} from '@mui/material'; +import { Search as SearchIcon } from '@mui/icons-material'; +// components +import MuiDialog from '../../components/MuiDialog'; +import Iconify from '../../components/Iconify'; +import HistoryRoundedIcon from '@mui/icons-material/HistoryRounded'; +// React +import { ReactElement, useContext, useEffect, useState } from 'react'; +import DialogRequestLog from './DialogRequestLog'; +import axios from '../../utils/axios'; +import { useSearchParams, useNavigate, Link } from 'react-router-dom'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { fSplit } from '../../utils/formatNumber'; +import { LoadingButton } from '@mui/lab'; +import { useDispatch, useSelector } from 'react-redux'; +import { RootState } from '../../store'; +import { claimSubmitAction, claimSubmitType } from '../../store/claimSubmit'; + +// ---------------------------------------------------------------------- + +type DataContentType = { + id: number; + fullName: string; + memberId: string; + limit: { + current: number; + total: number; + percentage: number; + }; + avatar?: { + url?: string; + title?: string; + }; +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + // data?: DataContent[]; +}; + +// ---------------------------------------------------------------------- + +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: '#D1F1F1', + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + backgroundColor: '#54D62C', + }, +})); + +// ---------------------------------------------------------------------- + +export default function DialogClaimSubmitMember({ + title, + openDialog, + setOpenDialog, +}: MuiDialogProps) { + const { corporateValue } = useContext(UserCurrentCorporateContext); + + /* ---------------------------------- data ---------------------------------- */ + const [data, setData] = useState([]); + + const dispatch = useDispatch(); + const selectedData = useSelector((state: RootState) => state.claims.data); + + const [dataMemberClaim, setDataMemberClaim] = useState({ + id: 0, + fullName: '', + memberId: '', + limit: { + current: 0, + total: 0, + percentage: 0, + }, + }); + const navigate = useNavigate(); + /* -------------------------------------------------------------------------- */ + + /* --------------------------------- Search --------------------------------- */ + const [searchText, setSearchText] = useState(''); + const [appliedParams, setAppliedParams] = useState({}); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + if (searchText === '') { + setAppliedParams({}); + } else { + setAppliedParams({ search: searchText }); + } + await new Promise((resolve) => setTimeout(resolve, 500)); + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ Icon On Click ----------------------------- */ + const handleCheck = (data: DataContentType, isChecked: boolean) => { + if (isChecked) { + dispatch(claimSubmitAction.patch([...selectedData, data])); + } else { + let temp = selectedData.filter((row) => row.memberId !== data.memberId); + dispatch(claimSubmitAction.patch(temp)); + } + }; + /* -------------------------------------------------------------------------- */ + + useEffect(() => { + (async () => { + if (openDialog === true) { + const response = await axios.get(`${corporateValue}/members`, { + params: { ...appliedParams, type: 'claim-submit' }, + }); + + setData(response.data.data); + } + })(); + }, [corporateValue, openDialog, appliedParams]); + + useEffect(() => { + dispatch(claimSubmitAction.dispatch()); + }, [dispatch]); + + const getContent = () => ( + + + {data.map((row: DataContentType, key) => ( + { + return selectedData.some((item) => item.memberId === row.memberId) ? theme.palette.primary.lighter : theme.palette.background.default + } + }} + > + + +
+ handleCheck(row, e.target.checked)} />} + label="" + labelPlacement="end" + sx={{ marginLeft: '20px' }} + /> + +
+
+ user-profile +
+ + {row.fullName} + + {row.memberId} + + + {/* */} + {/* */} + {/* + + + LIMIT + + + + + + {fSplit(row.limit && row.limit.current)} + + + / {fSplit(row.limit && row.limit.total)} + + + + */} + {/* */} + + {/* + + */} + 0} + sx={{ marginLeft: '10px' }} + onClick={() => { + dispatch(claimSubmitAction.patch([row])); + navigate(`/claim-request/${row.id}`); + }} + > + + + +
+
+ ))} +
+
+ ); + + return ( + + +
+ setSearchText(event?.target.value)} + value={searchText} + InputProps={{ + startAdornment: ( + + + + ), + }} + placeholder="Search Name or Member ID... " + sx={{ marginTop: 2 }} + /> + + {getContent()} +
+ + navigate('/claim-request/bulk')} + > + Claim Submit Selected + + +
+ ); +} diff --git a/frontend/client-portal/src/sections/claim-submit/DialogDetailClaim.tsx b/frontend/client-portal/src/sections/claim-submit/DialogDetailClaim.tsx new file mode 100644 index 00000000..3aba83d1 --- /dev/null +++ b/frontend/client-portal/src/sections/claim-submit/DialogDetailClaim.tsx @@ -0,0 +1,175 @@ +// @mui +import { + Button, + Box, + Stepper, + Step, + StepLabel, + Card, + Typography, + Divider, + Stack, +} from '@mui/material'; +import { Add } from '@mui/icons-material'; +// components +import MuiDialog from '../../components/MuiDialog'; +// theme +import palette from '../../theme/palette'; +// React +import { ReactElement } from 'react'; + +type DataContent = { + info: string; + date: string; + time: string; +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + data?: DataContent[]; +}; + +const steps = ['Review', 'Approval', 'Disbursement']; + +const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => { + const getContent = () => ( + <> + + + Claim Request + + + Submission date + 15 / 05 / 2022 + + + + + {steps.map((label) => ( + + {label} + + ))} + + + + + 17 Mei 2022 + + + + + + {/* Item 1 */} + + + 09:10 WIB + + Approval + + + + + + Details : mohon melengkapi kekurangan dokumen + + + Lab pemeriksaan darah + + + + + {/* Item 2 */} + + + 09:00 WIB + + Approval + + + + + + Details : Penilaian Dokter + + + + {/* Item 3 */} + + + 08:00 WIB + + Review + + + + + + Details : Klaim Diajukan + + + + + + + ); + + return ( + + ); +}; + +export default DialogDetailClaim; diff --git a/frontend/client-portal/src/sections/claim-submit/DialogNotification.tsx b/frontend/client-portal/src/sections/claim-submit/DialogNotification.tsx new file mode 100644 index 00000000..c93a27b2 --- /dev/null +++ b/frontend/client-portal/src/sections/claim-submit/DialogNotification.tsx @@ -0,0 +1,93 @@ +// react +import { ReactElement, useState } from 'react'; +// mui +import { Card, Divider, Link, Stack, Typography } from '@mui/material'; +import { styled } from '@mui/material/styles'; +// Component +import MuiDialog from '../../components/MuiDialog'; +// Sections +import DialogDetailClaim from './DialogDetailClaim'; + +type DataContent = { + info: string; + date: string; + time: string; +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + data?: DataContent[]; +}; + +const ItemNotificationStyle = styled(Card)(({ theme }) => ({ + boxShadow: 'none', + padding: theme.spacing(1), + borderRadius: 0.5, + color: 'black', +})); + +const DialogNotification = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => { + const [openDialogClaim, setOpenDialogClaim] = useState(false); + const [dialogTitleClaim, setDialogTitleClaim] = useState(''); + + const clickHandler = () => { + setDialogTitleClaim('Claim Details'); + setOpenDialogClaim(true); + }; + + const getContent = () => ( + + + {data + ? data.map(({ info, date, time }: DataContent, key) => ( +
+ {key >= 1 ? : ''} + + + {info} + + Info Detail + + + + {date} + {time} + + +
+ )) + : ''} +
+
+ ); + + return ( + <> + + + + + ); +}; + +export default DialogNotification; diff --git a/frontend/client-portal/src/sections/claim-submit/DialogRequestLog.tsx b/frontend/client-portal/src/sections/claim-submit/DialogRequestLog.tsx new file mode 100644 index 00000000..adfac5cb --- /dev/null +++ b/frontend/client-portal/src/sections/claim-submit/DialogRequestLog.tsx @@ -0,0 +1,355 @@ +// @mui +import { styled } from '@mui/material/styles'; +import { + Typography, + LinearProgress, + linearProgressClasses, + Stack, + Card, + Button, + Divider, + Avatar, +} from '@mui/material'; +// components +import MuiDialog from '../../components/MuiDialog'; +import Iconify from '../../components/Iconify'; +// React +import { ReactElement, useRef, useState } from 'react'; +// form +import { LoadingButton } from '@mui/lab'; +import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { fPostFormat } from '../../utils/formatTime'; +import { fCurrency } from '../../utils/formatNumber'; +import { makeFormData } from '../../utils/jsonToFormData'; + +/* ---------------------------------- types --------------------------------- */ +type DataContentType = { + id: number; + fullName: string; + memberId: string; + limit: { + current: number; + total: number; + percentage: number; + }; + avatar?: { + url?: string; + title?: string; + }; +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + data: DataContentType; +}; +/* -------------------------------------------------------------------------- */ + +/* --------------------------------- styles --------------------------------- */ +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 300 : 800], + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + background: 'linear-gradient(270deg, #19BBBB 38.42%, #FF9565 76.21%, #FE7253 104.02%)', + }, +})); +/* -------------------------------------------------------------------------- */ + +const DialogRequestLog = ({ openDialog, setOpenDialog, data }: MuiDialogProps) => { + const [serviceCode, setServiceCode] = useState('IP'); + + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + + const handleDiagnosaInputChange = (event) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState, index) => { + setFileDiagnosas(filesState.filter((file, fileIndex) => fileIndex != index)); + }; + + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState, index) => { + setFileKondisis(filesState.filter((file, fileIndex) => fileIndex != index)); + }; + + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + + const handleResultInputChange = (event) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState, index) => { + setFileHasilPenunjangs(filesState.filter((file, fileIndex) => fileIndex != index)); + }; + + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequest() { + setSubmitLoading(true); + const formData = makeFormData({ + member_id: data.id, + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis, + service_code: serviceCode, + }); + + axios + .post('/claim-requests', formData) + .then((response) => { + enqueueSnackbar(response.data.message ?? 'Berhasil membuat data', { variant: 'success' }); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }) + .then(() => { + setSubmitLoading(false); + }); + } + + const getContent = () => ( + + + + Submission Date :
{fPostFormat(new Date(), 'dd/MM/yyyy')} +
+
+ + + + + + + + + + + + + {data.fullName} + {data.memberId} + + + + + + + Total Limit + + + + {fCurrency(data.limit.current)} / {fCurrency(data.limit.total)} + + + + } + spacing={4} + sx={{ marginY: 2 }} + > + + + Dokumen Kondisi + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisis && + fileKondisis.map((file, index) => ( + + {file.name} + { + removeKondisiFiles(fileKondisis, index); + }} + /> + + ))} + + + { + fileKondisiInput?.current?.click(); + }} + > + + Add Result + + + + + + Dokumen Diagnosa + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosas && + fileDiagnosas.map((file, index) => ( + + {file.name} + { + removeDiagnosaFiles(fileDiagnosas, index); + }} + /> + + ))} + + + { + fileDiagnosaInput?.current?.click(); + }} + > + + Add Result + + + + + + Dokumen Hasil Penunjang + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file, index) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + /> + + ))} + + + { + fileHasilPenunjangInput?.current?.click(); + }} + > + + Add File + + + + + { + submitRequest(); + }} + loading={submitLoading} + > + LOG Request + +
+ ); + + return ( + // <> + // + // + getContent() + ); +}; + +export default DialogRequestLog; diff --git a/frontend/client-portal/src/sections/claim-submit/DialogTopUpLimit.tsx b/frontend/client-portal/src/sections/claim-submit/DialogTopUpLimit.tsx new file mode 100644 index 00000000..4e22a137 --- /dev/null +++ b/frontend/client-portal/src/sections/claim-submit/DialogTopUpLimit.tsx @@ -0,0 +1,265 @@ +// @mui +import { styled } from '@mui/material/styles'; +import { + Typography, + LinearProgress, + linearProgressClasses, + Stack, + FormControlLabel, +} from '@mui/material'; +import { LoadingButton } from '@mui/lab'; +import Checkbox from '@mui/material/Checkbox'; +// components +import MuiDialog from '../../components/MuiDialog'; +import { FormProvider, RHFTextField } from '../../components/hook-form'; +// React +import { useContext, ReactElement, useEffect, useState } from 'react'; +import { fCurrency } from '../../utils/formatNumber'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; + +// yup +import * as Yup from 'yup'; +// form +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; + +/* ---------------------------------- types --------------------------------- */ +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + data?: DataProps; +}; + +type DataProps = { + companyName: string; + policyNumber: number; + totalMembers: number; + totalCases: number; + totalPersen: number; + myLimit: { + balance: number; + total: number; + percentage: number; + }; + maxTopUp: number; +}; + +type FormValuesProps = { + topup: string; +}; +/* -------------------------------------------------------------------------- */ + +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 300 : 800], + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + background: 'linear-gradient(270deg, #19BBBB 38.42%, #FF9565 76.21%, #FE7253 104.02%)', + }, +})); + +// ---------------------------------------------------------------------- + +export default function DialogTopUpLimit({ + title, + openDialog, + setOpenDialog, + data, +}: MuiDialogProps) { + const [isDisabledInput, setIsDisabledInput] = useState(false); + const [isDisabledButton, setIsDisabledButton] = useState(true); + const [isCheckboxChecked, setIsCheckboxChecked] = useState(false); + const [ message, setMessage ] = useState (''); + const { corporateValue } = useContext(UserCurrentCorporateContext); + + const TopUpSchema = Yup.object().shape({ + topup: Yup.number().max( + data?.maxTopUp, + `Maximum top-up amount is ${fCurrency(data?.maxTopUp)}` + ), + }); + + const defaultValues = { + topup: 0, + }; + + const methods = useForm({ + resolver: yupResolver(TopUpSchema), + // @ts-ignore + defaultValues, + }); + + const { + setValue, + reset, + handleSubmit, + formState: { errors, isSubmitting }, + } = methods; + + useEffect(() => { + if (openDialog === false) { + setIsDisabledInput(false); + setIsDisabledButton(true); + setIsCheckboxChecked(false); + + reset(); + } + }, [openDialog, reset]); + + const onSubmit = async (data: FormValuesProps) => { + + + await new Promise((resolve) => setTimeout(resolve, 500)); + + setIsDisabledInput(false); + setIsDisabledButton(true); + setIsCheckboxChecked(false); + + try { + // Send the HTTP POST request to the backend + await axios.post(corporateValue + '/topup', { + topup: data.topup, + }); + + // Show a success notification + enqueueSnackbar('The request has been sent', { variant: 'success' }); + setOpenDialog(false); + + reset(); + } catch (error) { + // Show an error notification + enqueueSnackbar('An error occurred', { variant: 'error' }); + setOpenDialog(false); + } + + + }; + + const onCheckHandler = (value: string) => { + setIsDisabledInput(!isDisabledInput); + value === '0' || value === '' ? setIsDisabledButton(true) : setIsDisabledButton(false); + setIsCheckboxChecked(!isCheckboxChecked); + // @ts-ignore + setValue('topup', data.maxTopUp.toString()); + }; + + const onTopupHandler = (value: string) => { + //console.log(!!errors); + + let newValue; + + if (value.startsWith('0')) { + newValue = '0'; + } else { + newValue = value; + } + + newValue === '0' || newValue === '' ? setIsDisabledButton(true) : setIsDisabledButton(false); + setValue('topup', newValue); + }; + + const getContent = () => ( + + + + Company Name + + {data ? data.companyName : ''} + + + + Policy Number + + {data ? data.policyNumber : 0} + + + + + Total Member + + {data ? data.totalMembers : 0} Person + + + + Total Cases + + {data ? data.totalCases : 0} Cases + + + + + + Company Pooled Fund + {fCurrency(data ? data.myLimit.balance : 0)} + + / {data ? data.myLimit.total : 0} + + + + {data ? data.myLimit.percentage : 0}% + + + + + + + Top Up Limit + + + onTopupHandler(e.target.value)} + error={!!errors.topup} + helperText={errors.topup?.message} + /> + onCheckHandler(e.target.value)} + /> + } + label={'Max ' + fCurrency(data ? data.maxTopUp : 0)} + /> + + + Ajukan Permintaan + + + + + ); + + return ( + + ); +} diff --git a/frontend/client-portal/src/sections/dashboard/CardPolicy.tsx b/frontend/client-portal/src/sections/dashboard/CardPolicy.tsx index 41ba3808..74a7ea1b 100644 --- a/frontend/client-portal/src/sections/dashboard/CardPolicy.tsx +++ b/frontend/client-portal/src/sections/dashboard/CardPolicy.tsx @@ -61,6 +61,10 @@ type CardPolicyProps = { }; maxTopUp: number; }; + members: { + memberId: string; + memberFullName: string; + }; }; }; @@ -95,7 +99,7 @@ export default function CardPolicy(props: CardPolicyProps) { const [dialogTitle, setDialogTitle] = useState(''); const [isDialog, setIsDialog] = useState(''); - const { limit, topUpLimit } = props.data || {}; + const { limit, topUpLimit, members } = props.data || {}; if (!limit || !topUpLimit) { return null; } @@ -185,14 +189,13 @@ export default function CardPolicy(props: CardPolicyProps) {
- {/* {isDialog === 'submitClaim' && ( + {isDialog === 'submitClaim' && ( - )} */} + )} {isDialog === 'topUpLimit' && ( ({ id: 0, fullName: '', @@ -83,10 +87,15 @@ export default function DialogClaimSubmitMember({ /* --------------------------------- Search --------------------------------- */ const [searchText, setSearchText] = useState(''); + const [appliedParams, setAppliedParams] = useState({}); const handleSearchSubmit = async (event: React.FormEvent) => { event.preventDefault(); - + if (searchText === '') { + setAppliedParams({}); + } else { + setAppliedParams({ search: searchText }); + } await new Promise((resolve) => setTimeout(resolve, 500)); }; /* -------------------------------------------------------------------------- */ @@ -97,7 +106,7 @@ export default function DialogClaimSubmitMember({ /* -------------------------------------------------------------------------- */ /* ------------------------------ Icon On Click ----------------------------- */ - const [openDialogClaimMember, setOpenDialogMemberClaim] = useState(false); + const [openDialogRequestLog, setOpenDialogRequestLog] = useState(false); const clickHandler = ({ id, fullName, memberId, limit, avatar }: DataContentType) => { setDataMemberClaim({ @@ -114,10 +123,22 @@ export default function DialogClaimSubmitMember({ title: avatar && avatar.title, }, }); - setOpenDialogMemberClaim(true); + setOpenDialogRequestLog(true); }; /* -------------------------------------------------------------------------- */ + useEffect(() => { + (async () => { + if (openDialog === true) { + const response = await axios.get(`${corporateValue}/members`, { + params: { ...appliedParams, type: 'claim-submit' }, + }); + //console.log(response.data.data); + setData(response.data.data); + } + })(); + }, [corporateValue, openDialog, appliedParams]); + const getContent = () => ( @@ -146,57 +167,58 @@ export default function DialogClaimSubmitMember({ /> - {data && - data.map((row: DataContentType, key) => ( - - - {row.avatar - - {row.fullName} - - Member ID : {row.memberId} - - - - - Total Limit - - - - {row.limit && row.limit.current} /{' '} - - {row.limit && row.limit.total} - - - - - clickHandler({ - id: row.id, - fullName: row.fullName, - memberId: row.memberId, - limit: { - current: row.limit.current, - total: row.limit.total, - percentage: row.limit.percentage, - }, - }) - } - > - - + {data.map((row: DataContentType, key) => ( + + clickHandler({ + id: row.id, + fullName: row.fullName, + memberId: row.memberId, + limit: { + current: row.limit.current, + total: row.limit.total, + percentage: row.limit.percentage, + }, + }) + } + > + + {row.avatar + + {row.fullName} + + Member ID : {row.memberId} + - - ))} + + + Total Limit + + + + {row.limit && row.limit.current} /{' '} + + {row.limit && row.limit.total} + + + + + + + + + ))} ); @@ -211,10 +233,9 @@ export default function DialogClaimSubmitMember({ maxWidth="sm" /> - diff --git a/frontend/client-portal/src/sections/dashboard/DialogClaimSubmitMemberSubmission.tsx b/frontend/client-portal/src/sections/dashboard/DialogClaimSubmitMemberSubmission.tsx deleted file mode 100644 index 3c5782b2..00000000 --- a/frontend/client-portal/src/sections/dashboard/DialogClaimSubmitMemberSubmission.tsx +++ /dev/null @@ -1,371 +0,0 @@ -// @mui -import { styled } from '@mui/material/styles'; -import { - Typography, - LinearProgress, - linearProgressClasses, - Stack, - Card, - Button, - Link, - Switch, - SwitchProps, - ButtonGroup, -} from '@mui/material'; -import { Add as AddIcon, Cancel as CancelIcon } from '@mui/icons-material'; -// components -import MuiDialog from '../../components/MuiDialog'; -import Iconify from '../../components/Iconify'; -import { FormProvider } from '../../components/hook-form'; -// React -import { ReactElement, useEffect, useState } from 'react'; -// yup -import * as Yup from 'yup'; -// form -import { useForm } from 'react-hook-form'; -import { yupResolver } from '@hookform/resolvers/yup'; -import { LoadingButton } from '@mui/lab'; -import { fSplit } from '../../utils/formatNumber'; - -/* ---------------------------------- types --------------------------------- */ -type DataContentType = { - id: number; - fullName: string; - memberId: string; - limit: { - current: number; - total: number; - percentage: number; - }; - avatar?: { - url?: string; - title?: string; - }; -}; - -type MuiDialogProps = { - title?: { - name?: string; - icon?: string; - }; - openDialog: boolean; - setOpenDialog: Function; - content?: ReactElement; - data: DataContentType; -}; - -type BorderLinearProgressProps = { - percentage: number; -}; - -type FormValuesProps = { - invoice: ''; -}; -/* -------------------------------------------------------------------------- */ - -/* --------------------------------- styles --------------------------------- */ -const BorderLinearProgress = styled(LinearProgress)( - ({ theme, percentage }) => ({ - height: 10, - borderRadius: 6, - [`&.${linearProgressClasses.colorPrimary}`]: { - backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 300 : 800], - }, - [`& .${linearProgressClasses.bar}`]: { - borderRadius: 6, - background: 'linear-gradient(270deg, #19BBBB 38.42%, #FF9565 76.21%, #FE7253 104.02%)', - '&::before': { - content: '""', - position: 'absolute', - right: 0, - top: 0, - width: `${100 - percentage}%`, - zIndex: 1, - bottom: 0, - background: '#DFE3E8', - }, - }, - }) -); -/* -------------------------------------------------------------------------- */ - -const DialogClaimSubmitMemberSubmission = ({ - title, - openDialog, - setOpenDialog, - data, -}: MuiDialogProps) => { - /* ---------------------------- Get Current Date ---------------------------- */ - const current = new Date(); - const date = `${current.getDate()} / ${current.getMonth() + 1} / ${current.getFullYear()}`; - /* -------------------------------------------------------------------------- */ - - /* ------------------------------- file input ------------------------------- */ - // const [multipleImages, setMultipleImages] = useState([]); - - // Functions to preview multiple images - // const changeMultipleFiles = (e) => { - // if (e.target.files) { - // const imageArray = Array.from(e.target.files).map((file) => URL.createObjectURL(file)); - // setMultipleImages((prevImages) => prevImages.concat(imageArray)); - // } - // }; - - // const render = (data) => { - // data.map((image) => { - // {image}; - // }); - // }; - - // const FileForm = (props: any) => ( - // - // ); - /* -------------------------------------------------------------------------- */ - - /* ------------------------------- Form Submit ------------------------------ */ - const ClaimSubmitSchema = Yup.object().shape({ - invoice: Yup.mixed() - .required('You need to provide a file') - // @ts-ignore - .test('fileSize', 'The file is too large', (value) => { - for (let index = 0; index < value.length; index++) { - return value ? value[index].size <= 2000000 : false; - } - }), - }); - - const methods = useForm({ - resolver: yupResolver(ClaimSubmitSchema), - }); - - const { - register, - reset, - handleSubmit, - formState: { isSubmitting, errors }, - } = methods; - - // const { - // register, - // reset, - // handleSubmit, - // formState: { isSubmitting }, - // } = useForm({ resolver: yupResolver(ClaimSubmitSchema) }); - - const onSubmit = ({ invoice }: FormValuesProps) => { - // console.log(invoice); - }; - /* -------------------------------------------------------------------------- */ - - /* ---------------------------- Ios Switch Style ---------------------------- */ - const IosSwitch = styled((props: SwitchProps) => ( - - ))(({ theme }) => ({ - width: 28, - height: 16, - padding: 0, - marginRight: '10px', - '& .MuiSwitch-switchBase': { - padding: 0, - margin: 2, - transitionDuration: '300ms', - '&.Mui-checked': { - transform: 'translateX(12px)', - color: '#fff', - '& + .MuiSwitch-track': { - opacity: 1, - border: 0, - }, - '&.Mui-disabled + .MuiSwitch-track': { - opacity: 0.5, - }, - }, - '&.Mui-focusVisible .MuiSwitch-thumb': { - color: '#33cf4d', - border: '6px solid #fff', - }, - '&.Mui-disabled .MuiSwitch-thumb': { - color: theme.palette.mode === 'light' ? theme.palette.grey[100] : theme.palette.grey[600], - }, - '&.Mui-disabled + .MuiSwitch-track': { - opacity: theme.palette.mode === 'light' ? 0.7 : 0.3, - }, - }, - '& .MuiSwitch-thumb': { - boxSizing: 'border-box', - width: 12, - height: 12, - }, - '& .MuiSwitch-track': { - borderRadius: 26 / 2, - opacity: 1, - transition: theme.transitions.create(['background-color'], { - duration: 500, - }), - }, - })); - /* -------------------------------------------------------------------------- */ - - useEffect(() => { - if (openDialog === false) { - reset(); - } - }, [openDialog, reset]); - - const getContent = () => ( - - - Claim Submission - - Submission date - {date} - - - - - user-profile - - {data && data.fullName} - - Member ID : {data && data.memberId} - - - - - - - - - Total Limit - - - Details Benefits - - - - - {fSplit(data && data.limit ? data.limit.current : 0)} /{' '} - - {fSplit(data && data.limit ? data.limit.total : 0)} - - - - - - {/* Invoice */} - - - Real Invoice - - Real invoice required - - - - {errors.invoice && errors.invoice.message ?

{errors.invoice.message}

: ''} -
- {/* Prescription */} - {/* - - - - Doctor's Prescription and Another Documents - - - Doctor's Prescription required - - - - - - Yes - - - - - */} - {/* Laboratory */} - {/* - - - - Doctor's Prescription and Another Documents - - - Doctor's Prescription required - - - - - - Yes - - - - - */} - {/* Submit */} - - - Ajukan Permintaan - - -
-
- ); - - return ( - <> - - - ); -}; - -export default DialogClaimSubmitMemberSubmission; diff --git a/frontend/client-portal/src/sections/dashboard/DialogRequestLog.tsx b/frontend/client-portal/src/sections/dashboard/DialogRequestLog.tsx new file mode 100644 index 00000000..d9267492 --- /dev/null +++ b/frontend/client-portal/src/sections/dashboard/DialogRequestLog.tsx @@ -0,0 +1,355 @@ +// @mui +import { styled } from '@mui/material/styles'; +import { + Typography, + LinearProgress, + linearProgressClasses, + Stack, + Card, + Button, + Divider, + Avatar, +} from '@mui/material'; +// components +import MuiDialog from '../../components/MuiDialog'; +import Iconify from '../../components/Iconify'; +// React +import { ReactElement, useRef, useState } from 'react'; +// form +import { LoadingButton } from '@mui/lab'; +import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { fPostFormat } from '../../utils/formatTime'; +import { fCurrency } from '../../utils/formatNumber'; +import { makeFormData } from '../../utils/jsonToFormData'; + +/* ---------------------------------- types --------------------------------- */ +type DataContentType = { + id: number; + fullName: string; + memberId: string; + limit: { + current: number; + total: number; + percentage: number; + }; + avatar?: { + url?: string; + title?: string; + }; +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + data: DataContentType; +}; +/* -------------------------------------------------------------------------- */ + +/* --------------------------------- styles --------------------------------- */ +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 300 : 800], + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + background: 'linear-gradient(270deg, #19BBBB 38.42%, #FF9565 76.21%, #FE7253 104.02%)', + }, +})); +/* -------------------------------------------------------------------------- */ + +const DialogRequestLog = ({ openDialog, setOpenDialog, data }: MuiDialogProps) => { + const [serviceCode, setServiceCode] = useState('IP'); + + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + + const handleDiagnosaInputChange = (event) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState, index) => { + setFileDiagnosas(filesState.filter((file, fileIndex) => fileIndex != index)); + }; + + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState, index) => { + setFileKondisis(filesState.filter((file, fileIndex) => fileIndex != index)); + }; + + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + + const handleResultInputChange = (event) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState, index) => { + setFileHasilPenunjangs(filesState.filter((file, fileIndex) => fileIndex != index)); + }; + + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequest() { + setSubmitLoading(true); + console.log(data.id); + const formData = makeFormData({ + member_id: data.id, + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis, + service_code: serviceCode, + }); + + axios + .post('/claim-requests', formData) + .then((response) => { + enqueueSnackbar(response.data.message ?? 'Berhasil membuat data', { variant: 'success' }); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }) + .then(() => { + setSubmitLoading(false); + }); + } + + const getContent = () => ( + + + + Submission Date :
{fPostFormat(new Date(), 'dd/MM/yyyy')} +
+
+ + + + + + + + + + + + + {data.fullName} + {data.memberId} + + + + + + + Total Limit + + + + {fCurrency(data.limit.current)} / {fCurrency(data.limit.total)} + + + + } + spacing={4} + sx={{ marginY: 2 }} + > + + + Dokumen Kondisi + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisis && + fileKondisis.map((file, index) => ( + + {file.name} + { + removeKondisiFiles(fileKondisis, index); + }} + /> + + ))} + + + { + fileKondisiInput?.current?.click(); + }} + > + + Add Result + + + + + + Dokumen Diagnosa + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosas && + fileDiagnosas.map((file, index) => ( + + {file.name} + { + removeDiagnosaFiles(fileDiagnosas, index); + }} + /> + + ))} + + + { + fileDiagnosaInput?.current?.click(); + }} + > + + Add Result + + + + + + Dokumen Hasil Penunjang + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file, index) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + /> + + ))} + + + { + fileHasilPenunjangInput?.current?.click(); + }} + > + + Add File + + + + + { + submitRequest(); + }} + loading={submitLoading} + > + LOG Request + +
+ ); + + return ( + <> + + + ); +}; + +export default DialogRequestLog; diff --git a/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx b/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx index bb156185..4e22a137 100644 --- a/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx +++ b/frontend/client-portal/src/sections/dashboard/DialogTopUpLimit.tsx @@ -154,7 +154,7 @@ export default function DialogTopUpLimit({ }; const onTopupHandler = (value: string) => { - console.log(!!errors); + //console.log(!!errors); let newValue; diff --git a/frontend/client-portal/src/store/claimSubmit.ts b/frontend/client-portal/src/store/claimSubmit.ts new file mode 100644 index 00000000..8b0c522d --- /dev/null +++ b/frontend/client-portal/src/store/claimSubmit.ts @@ -0,0 +1,37 @@ +import { createSlice } from '@reduxjs/toolkit'; + +export type claimSubmitType = { + id: number; + fullName: string; + memberId: string; + limit: { + current: number; + total: number; + percentage: number; + }; +}; + +type initState = { + data: claimSubmitType[]; +}; + +let initState: initState = { + data: [], +}; + +const claimSubmitSlice = createSlice({ + name: 'claimsubmit', + initialState: initState, + reducers: { + patch(state, action) { + state.data = action.payload; + }, + dispatch(state) { + state.data = []; + }, + }, +}); + +export const claimSubmitAction = claimSubmitSlice.actions; + +export default claimSubmitSlice.reducer; diff --git a/frontend/client-portal/src/store/index.ts b/frontend/client-portal/src/store/index.ts new file mode 100644 index 00000000..4b863f89 --- /dev/null +++ b/frontend/client-portal/src/store/index.ts @@ -0,0 +1,12 @@ +import { configureStore } from '@reduxjs/toolkit'; +import claimSubmit from './claimSubmit'; + +const store = configureStore({ + reducer: { + claims: claimSubmit, + }, +}); + +export type RootState = ReturnType; + +export default store; diff --git a/frontend/client-portal/src/utils/formatNumber.ts b/frontend/client-portal/src/utils/formatNumber.ts index 834dd5f4..045b1a38 100644 --- a/frontend/client-portal/src/utils/formatNumber.ts +++ b/frontend/client-portal/src/utils/formatNumber.ts @@ -4,21 +4,21 @@ import numeral from 'numeral'; // load a locale numeral.register('locale', 'id', { delimiters: { - thousands: '.', - decimal: ',' + thousands: '.', + decimal: ',', }, abbreviations: { - thousand: 'k', - million: 'm', - billion: 'b', - trillion: 't' + thousand: 'k', + million: 'm', + billion: 'b', + trillion: 't', }, - ordinal : function (number: number) { - return number === 1 ? 'er' : 'ème'; + ordinal: function (number: number) { + return number === 1 ? 'er' : 'ème'; }, currency: { - symbol: 'Rp ' - } + symbol: 'Rp ', + }, }); // switch between locales diff --git a/frontend/client-portal/src/utils/formatTime.ts b/frontend/client-portal/src/utils/formatTime.ts index 12791ede..ed88dcae 100644 --- a/frontend/client-portal/src/utils/formatTime.ts +++ b/frontend/client-portal/src/utils/formatTime.ts @@ -1,14 +1,14 @@ -import { format,parseISO, getTime, setHours, setMinutes , formatDistanceToNow } from 'date-fns'; +import { format, parseISO, getTime, setHours, setMinutes, formatDistanceToNow } from 'date-fns'; // ---------------------------------------------------------------------- export function fDate(date: Date | string | number) { - console.log(date); + //console.log(date); return format(new Date(date), 'dd MMMM yyyy'); } export function fDateTime(date: Date | string | number) { - return format(new Date(date), 'dd MMM yyyy p'); + return format(new Date(date), 'dd MMM yyyy hh:mm'); } export function fTimestamp(date: Date | string | number) { @@ -19,12 +19,21 @@ export function fDateTimeSuffix(date: Date | string | number) { return format(new Date(date), 'dd/MM/yyyy hh:mm p'); } + +export function fDateSuffix(date: Date | string | number) { + return format(new Date(date), 'dd MMM yyyy'); +} + export function fToNow(date: Date | string | number) { return formatDistanceToNow(new Date(date), { - addSuffix: true + addSuffix: true, }); } +export function fPostFormat(date: Date | string | number, dateFormat = 'yyyy-MM-dd HH:mm:ss') { + return format(new Date(date), dateFormat); +} + // export function fDateString(date) { // const dateObj = parseISO(date); // const formattedDate = format(dateObj, 'dd MMMM yyyy'); @@ -36,4 +45,4 @@ export function fToNow(date: Date | string | number) { // const datePart = date.split(' ')[0]; // Memisahkan bagian tanggal // const formattedDate = fDateString(datePart); // Menggunakan fungsi sebelumnya untuk memformat tanggal // return formattedDate; -// } \ No newline at end of file +// } diff --git a/frontend/client-portal/src/utils/jsonToFormData.ts b/frontend/client-portal/src/utils/jsonToFormData.ts new file mode 100644 index 00000000..1616ee05 --- /dev/null +++ b/frontend/client-portal/src/utils/jsonToFormData.ts @@ -0,0 +1,6 @@ +import jsonToFormData from '@ajoelp/json-to-formdata'; + +export function makeFormData(object: any) { + return jsonToFormData(object) +} + \ No newline at end of file diff --git a/frontend/client-portal/yarn.lock b/frontend/client-portal/yarn.lock index 4edd260a..2d880f9e 100644 --- a/frontend/client-portal/yarn.lock +++ b/frontend/client-portal/yarn.lock @@ -3,43 +3,50 @@ "@aashutoshrathi/word-wrap@^1.2.3": - "integrity" "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" - "resolved" "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" - "version" "1.2.6" + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ajoelp/json-to-formdata@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@ajoelp/json-to-formdata/-/json-to-formdata-1.5.0.tgz" + integrity sha512-nrlfeTSL0X0dtx5r2KpzPiqLSIQquiiJjUKsQAKzWaCmO2QoYZCyb5ENZwF3YoffKronOCJr25mxaD8JRJmK8w== + dependencies: + lodash "4.17.21" "@ampproject/remapping@^2.2.0": - "integrity" "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==" - "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - "version" "2.2.1" + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@apideck/better-ajv-errors@^0.3.1": - "integrity" "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==" - "resolved" "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz" - "version" "0.3.3" + version "0.3.3" + resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz" + integrity sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg== dependencies: - "json-schema" "^0.4.0" - "jsonpointer" "^5.0.0" - "leven" "^3.1.0" + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.5": - "integrity" "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: "@babel/highlight" "^7.22.5" "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.22.9": - "integrity" "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==" - "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" - "version" "7.22.9" + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.17.10", "@babel/core@^7.19.6", "@babel/core@^7.21.3", "@babel/core@^7.4.0-0", "@babel/core@>=7.11.0": - "integrity" "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==" - "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz" - "version" "7.22.9" + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" @@ -51,61 +58,61 @@ "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" - "convert-source-map" "^1.7.0" - "debug" "^4.1.0" - "gensync" "^1.0.0-beta.2" - "json5" "^2.2.2" - "semver" "^6.3.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" "@babel/eslint-parser@^7.16.3", "@babel/eslint-parser@^7.21.3": - "integrity" "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==" - "resolved" "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz" - "version" "7.22.9" + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz" + integrity sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - "eslint-visitor-keys" "^2.1.0" - "semver" "^6.3.1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" "@babel/generator@^7.22.7", "@babel/generator@^7.22.9": - "integrity" "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==" - "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz" - "version" "7.22.9" + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" - "jsesc" "^2.5.1" + jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.16.7", "@babel/helper-annotate-as-pure@^7.22.5": - "integrity" "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==" - "resolved" "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - "integrity" "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==" - "resolved" "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.22.9": - "integrity" "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==" - "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz" - "version" "7.22.9" + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - "browserslist" "^4.21.9" - "lru-cache" "^5.1.1" - "semver" "^6.3.1" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1", "@babel/helper-create-class-features-plugin@^7.17.6": - "integrity" "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==" - "resolved" "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz" - "version" "7.17.6" + version "7.17.6" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz" + integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" @@ -116,72 +123,72 @@ "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-create-regexp-features-plugin@^7.16.7": - "integrity" "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==" - "resolved" "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz" - "version" "7.17.0" + version "7.17.0" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz" + integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" - "regexpu-core" "^5.0.1" + regexpu-core "^5.0.1" "@babel/helper-define-polyfill-provider@^0.3.1": - "integrity" "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==" - "resolved" "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz" - "version" "0.3.1" + version "0.3.1" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" "@babel/helper-plugin-utils" "^7.13.0" "@babel/traverse" "^7.13.0" - "debug" "^4.1.1" - "lodash.debounce" "^4.0.8" - "resolve" "^1.14.2" - "semver" "^6.1.2" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" "@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.22.5": - "integrity" "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" - "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== "@babel/helper-explode-assignable-expression@^7.16.7": - "integrity" "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: "@babel/types" "^7.16.7" "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.22.5": - "integrity" "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== dependencies: "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" "@babel/helper-hoist-variables@^7.16.7", "@babel/helper-hoist-variables@^7.22.5": - "integrity" "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==" - "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.16.7": - "integrity" "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==" - "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": - "integrity" "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== dependencies: "@babel/types" "^7.22.5" "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.22.9": - "integrity" "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" - "version" "7.22.9" + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" @@ -190,30 +197,30 @@ "@babel/helper-validator-identifier" "^7.22.5" "@babel/helper-optimise-call-expression@^7.16.7": - "integrity" "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==" - "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: "@babel/types" "^7.16.7" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - "integrity" "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" - "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-remap-async-to-generator@^7.16.8": - "integrity" "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==" - "resolved" "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" - "version" "7.16.8" + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-wrap-function" "^7.16.8" "@babel/types" "^7.16.8" "@babel/helper-replace-supers@^7.16.7": - "integrity" "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==" - "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== dependencies: "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-member-expression-to-functions" "^7.16.7" @@ -222,45 +229,45 @@ "@babel/types" "^7.16.7" "@babel/helper-simple-access@^7.16.7", "@babel/helper-simple-access@^7.22.5": - "integrity" "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==" - "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - "integrity" "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==" - "resolved" "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" - "version" "7.16.0" + version "7.16.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: "@babel/types" "^7.16.0" "@babel/helper-split-export-declaration@^7.16.7", "@babel/helper-split-export-declaration@^7.22.6": - "integrity" "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==" - "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" - "version" "7.22.6" + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.22.5": - "integrity" "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" - "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== "@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.5": - "integrity" "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== "@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.22.5": - "integrity" "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== "@babel/helper-wrap-function@^7.16.8": - "integrity" "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==" - "resolved" "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" - "version" "7.16.8" + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== dependencies: "@babel/helper-function-name" "^7.16.7" "@babel/template" "^7.16.7" @@ -268,133 +275,133 @@ "@babel/types" "^7.16.8" "@babel/helpers@^7.22.6": - "integrity" "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==" - "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz" - "version" "7.22.6" + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== dependencies: "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" "@babel/highlight@^7.22.5": - "integrity" "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==" - "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== dependencies: "@babel/helper-validator-identifier" "^7.22.5" - "chalk" "^2.0.0" - "js-tokens" "^4.0.0" + chalk "^2.0.0" + js-tokens "^4.0.0" "@babel/parser@^7.1.0", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": - "integrity" "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" - "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" - "version" "7.22.7" + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - "integrity" "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - "integrity" "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.16.7" "@babel/plugin-proposal-async-generator-functions@^7.16.8": - "integrity" "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" - "version" "7.16.8" + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": - "integrity" "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-class-static-block@^7.16.7": - "integrity" "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz" - "version" "7.17.6" + version "7.17.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz" + integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== dependencies: "@babel/helper-create-class-features-plugin" "^7.17.6" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - "integrity" "sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz" - "version" "7.17.2" + version "7.17.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz" + integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw== dependencies: "@babel/helper-create-class-features-plugin" "^7.17.1" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/plugin-syntax-decorators" "^7.17.0" - "charcodes" "^0.2.0" + charcodes "^0.2.0" "@babel/plugin-proposal-dynamic-import@^7.16.7": - "integrity" "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-namespace-from@^7.16.7": - "integrity" "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.16.7": - "integrity" "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - "integrity" "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - "integrity" "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": - "integrity" "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@^7.16.7": - "integrity" "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz" - "version" "7.17.3" + version "7.17.3" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz" + integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== dependencies: "@babel/compat-data" "^7.17.0" "@babel/helper-compilation-targets" "^7.16.7" @@ -403,34 +410,34 @@ "@babel/plugin-transform-parameters" "^7.16.7" "@babel/plugin-proposal-optional-catch-binding@^7.16.7": - "integrity" "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": - "integrity" "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.11": - "integrity" "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz" - "version" "7.16.11" + version "7.16.11" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.10" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-private-property-in-object@^7.16.7": - "integrity" "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-create-class-features-plugin" "^7.16.7" @@ -438,173 +445,173 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - "integrity" "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-async-generators@^7.8.4": - "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - "version" "7.8.4" + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": - "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - "version" "7.12.13" + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": - "integrity" "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - "version" "7.14.5" + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-decorators@^7.17.0": - "integrity" "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz" - "version" "7.17.0" + version "7.17.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz" + integrity sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import@^7.8.3": - "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": - "integrity" "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.16.7", "@babel/plugin-syntax-flow@^7.18.6": - "integrity" "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings@^7.8.3": - "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.22.5": - "integrity" "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": - "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": - "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": - "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": - "integrity" "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - "version" "7.14.5" + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": - "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - "version" "7.14.5" + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.16.7": - "integrity" "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-arrow-functions@^7.16.7": - "integrity" "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-async-to-generator@^7.16.8": - "integrity" "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" - "version" "7.16.8" + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-transform-block-scoped-functions@^7.16.7": - "integrity" "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-block-scoping@^7.16.7": - "integrity" "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-classes@^7.16.7": - "integrity" "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" @@ -613,189 +620,189 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" - "globals" "^11.1.0" + globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.16.7": - "integrity" "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-destructuring@^7.16.7": - "integrity" "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz" - "version" "7.17.3" + version "7.17.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz" + integrity sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - "integrity" "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-duplicate-keys@^7.16.7": - "integrity" "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-exponentiation-operator@^7.16.7": - "integrity" "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-flow-strip-types@^7.16.0": - "integrity" "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz" + integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-flow" "^7.16.7" "@babel/plugin-transform-for-of@^7.16.7": - "integrity" "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-function-name@^7.16.7": - "integrity" "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-function-name" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-literals@^7.16.7": - "integrity" "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-member-expression-literals@^7.16.7": - "integrity" "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-modules-amd@^7.16.7": - "integrity" "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" - "babel-plugin-dynamic-import-node" "^2.3.3" + babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@^7.16.8": - "integrity" "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz" - "version" "7.16.8" + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-simple-access" "^7.16.7" - "babel-plugin-dynamic-import-node" "^2.3.3" + babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.16.7": - "integrity" "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" - "babel-plugin-dynamic-import-node" "^2.3.3" + babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.16.7": - "integrity" "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - "integrity" "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz" - "version" "7.16.8" + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/plugin-transform-new-target@^7.16.7": - "integrity" "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-object-super@^7.16.7": - "integrity" "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/plugin-transform-parameters@^7.16.7": - "integrity" "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-property-literals@^7.16.7": - "integrity" "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": - "integrity" "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-jsx-development@^7.16.7": - "integrity" "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" "@babel/plugin-transform-react-jsx-self@^7.16.7": - "integrity" "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz" + integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-source@^7.16.7": - "integrity" "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz" - "version" "7.19.6" + version "7.19.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz" + integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.3", "@babel/plugin-transform-react-jsx@^7.21.0": - "integrity" "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" @@ -804,103 +811,103 @@ "@babel/types" "^7.22.5" "@babel/plugin-transform-react-pure-annotations@^7.16.7": - "integrity" "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-regenerator@^7.16.7": - "integrity" "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== dependencies: - "regenerator-transform" "^0.14.2" + regenerator-transform "^0.14.2" "@babel/plugin-transform-reserved-words@^7.16.7": - "integrity" "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.16.4": - "integrity" "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz" - "version" "7.17.0" + version "7.17.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz" + integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" - "babel-plugin-polyfill-corejs2" "^0.3.0" - "babel-plugin-polyfill-corejs3" "^0.5.0" - "babel-plugin-polyfill-regenerator" "^0.3.0" - "semver" "^6.3.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.16.7": - "integrity" "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-spread@^7.16.7": - "integrity" "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-transform-sticky-regex@^7.16.7": - "integrity" "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-template-literals@^7.16.7": - "integrity" "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typeof-symbol@^7.16.7": - "integrity" "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typescript@^7.16.7": - "integrity" "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz" - "version" "7.16.8" + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-typescript" "^7.16.7" "@babel/plugin-transform-unicode-escapes@^7.16.7": - "integrity" "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-unicode-regex@^7.16.7": - "integrity" "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.16.4": - "integrity" "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==" - "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz" - "version" "7.16.11" + version "7.16.11" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== dependencies: "@babel/compat-data" "^7.16.8" "@babel/helper-compilation-targets" "^7.16.7" @@ -971,27 +978,27 @@ "@babel/plugin-transform-unicode-regex" "^7.16.7" "@babel/preset-modules" "^0.1.5" "@babel/types" "^7.16.8" - "babel-plugin-polyfill-corejs2" "^0.3.0" - "babel-plugin-polyfill-corejs3" "^0.5.0" - "babel-plugin-polyfill-regenerator" "^0.3.0" - "core-js-compat" "^3.20.2" - "semver" "^6.3.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" + semver "^6.3.0" "@babel/preset-modules@^0.1.5": - "integrity" "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==" - "resolved" "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" - "version" "0.1.5" + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" - "esutils" "^2.0.2" + esutils "^2.0.2" "@babel/preset-react@^7.16.0": - "integrity" "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==" - "resolved" "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-option" "^7.16.7" @@ -1001,42 +1008,42 @@ "@babel/plugin-transform-react-pure-annotations" "^7.16.7" "@babel/preset-typescript@^7.16.0": - "integrity" "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==" - "resolved" "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz" - "version" "7.16.7" + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-transform-typescript" "^7.16.7" "@babel/runtime-corejs3@^7.10.2": - "integrity" "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==" - "resolved" "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz" - "version" "7.17.2" + version "7.17.2" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz" + integrity sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg== dependencies: - "core-js-pure" "^3.20.2" - "regenerator-runtime" "^0.13.4" + core-js-pure "^3.20.2" + regenerator-runtime "^0.13.4" "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - "integrity" "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==" - "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" - "version" "7.22.6" + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== dependencies: - "regenerator-runtime" "^0.13.11" + regenerator-runtime "^0.13.11" "@babel/template@^7.16.7", "@babel/template@^7.22.5": - "integrity" "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==" - "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== dependencies: "@babel/code-frame" "^7.22.5" "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": - "integrity" "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==" - "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz" - "version" "7.22.8" + version "7.22.8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== dependencies: "@babel/code-frame" "^7.22.5" "@babel/generator" "^7.22.7" @@ -1046,112 +1053,112 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/parser" "^7.22.7" "@babel/types" "^7.22.5" - "debug" "^4.1.0" - "globals" "^11.1.0" + debug "^4.1.0" + globals "^11.1.0" "@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.20.0", "@babel/types@^7.22.5", "@babel/types@^7.3.0", "@babel/types@^7.4.4": - "integrity" "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==" - "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" - "to-fast-properties" "^2.0.0" + to-fast-properties "^2.0.0" "@date-io/core@^2.14.0", "@date-io/core@^2.16.0": - "integrity" "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==" - "resolved" "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz" - "version" "2.16.0" + version "2.16.0" + resolved "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz" + integrity sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg== "@date-io/date-fns@^2.11.0", "@date-io/date-fns@^2.14.0", "@date-io/date-fns@^2.16.0": - "integrity" "sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==" - "resolved" "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz" - "version" "2.16.0" + version "2.16.0" + resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz" + integrity sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA== dependencies: "@date-io/core" "^2.16.0" "@date-io/dayjs@^2.11.0", "@date-io/dayjs@^2.14.0": - "integrity" "sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==" - "resolved" "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz" - "version" "2.16.0" + version "2.16.0" + resolved "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz" + integrity sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw== dependencies: "@date-io/core" "^2.16.0" "@date-io/luxon@^2.11.1", "@date-io/luxon@^2.14.0": - "integrity" "sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==" - "resolved" "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz" - "version" "2.16.1" + version "2.16.1" + resolved "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz" + integrity sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ== dependencies: "@date-io/core" "^2.16.0" "@date-io/moment@^2.11.0", "@date-io/moment@^2.14.0": - "integrity" "sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==" - "resolved" "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz" - "version" "2.16.1" + version "2.16.1" + resolved "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz" + integrity sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ== dependencies: "@date-io/core" "^2.16.0" "@emotion/babel-plugin@^11.11.0": - "integrity" "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==" - "resolved" "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" - "version" "11.11.0" + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/runtime" "^7.18.3" "@emotion/hash" "^0.9.1" "@emotion/memoize" "^0.8.1" "@emotion/serialize" "^1.1.2" - "babel-plugin-macros" "^3.1.0" - "convert-source-map" "^1.5.0" - "escape-string-regexp" "^4.0.0" - "find-root" "^1.1.0" - "source-map" "^0.5.7" - "stylis" "4.2.0" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" "@emotion/cache@^11.10.5", "@emotion/cache@^11.11.0": - "integrity" "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==" - "resolved" "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" - "version" "11.11.0" + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== dependencies: "@emotion/memoize" "^0.8.1" "@emotion/sheet" "^1.2.2" "@emotion/utils" "^1.2.1" "@emotion/weak-memoize" "^0.3.1" - "stylis" "4.2.0" + stylis "4.2.0" "@emotion/hash@^0.9.1": - "integrity" "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - "resolved" "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" - "version" "0.9.1" + version "0.9.1" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== "@emotion/is-prop-valid@^0.8.2": - "integrity" "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==" - "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" - "version" "0.8.8" + version "0.8.8" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== dependencies: "@emotion/memoize" "0.7.4" "@emotion/is-prop-valid@^1.1.2", "@emotion/is-prop-valid@^1.2.1": - "integrity" "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==" - "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz" - "version" "1.2.1" + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== dependencies: "@emotion/memoize" "^0.8.1" "@emotion/memoize@^0.8.1": - "integrity" "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" - "version" "0.8.1" + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/memoize@0.7.4": - "integrity" "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" - "version" "0.7.4" + version "0.7.4" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== "@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.10.6", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0": - "integrity" "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==" - "resolved" "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz" - "version" "11.11.1" + version "11.11.1" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.11.0" @@ -1160,28 +1167,28 @@ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" "@emotion/utils" "^1.2.1" "@emotion/weak-memoize" "^0.3.1" - "hoist-non-react-statics" "^3.3.1" + hoist-non-react-statics "^3.3.1" "@emotion/serialize@^1.1.2": - "integrity" "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==" - "resolved" "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== dependencies: "@emotion/hash" "^0.9.1" "@emotion/memoize" "^0.8.1" "@emotion/unitless" "^0.8.1" "@emotion/utils" "^1.2.1" - "csstype" "^3.0.2" + csstype "^3.0.2" "@emotion/sheet@^1.2.2": - "integrity" "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - "resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" - "version" "1.2.2" + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== "@emotion/styled@^11.10.6", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": - "integrity" "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==" - "resolved" "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" - "version" "11.11.0" + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.11.0" @@ -1191,236 +1198,236 @@ "@emotion/utils" "^1.2.1" "@emotion/unitless@^0.8.1": - "integrity" "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - "resolved" "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" - "version" "0.8.1" + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== "@emotion/use-insertion-effect-with-fallbacks@^1.0.1": - "integrity" "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==" - "resolved" "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" - "version" "1.0.1" + version "1.0.1" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== "@emotion/utils@^1.2.1": - "integrity" "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - "resolved" "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" - "version" "1.2.1" + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== "@emotion/weak-memoize@^0.3.1": - "integrity" "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - "resolved" "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" - "version" "0.3.1" + version "0.3.1" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== "@eslint-community/eslint-utils@^4.2.0": - "integrity" "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==" - "resolved" "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - "version" "4.4.0" + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: - "eslint-visitor-keys" "^3.3.0" + eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - "integrity" "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==" - "resolved" "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" - "version" "4.5.1" + version "4.5.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== "@eslint/eslintrc@^2.1.0": - "integrity" "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==" - "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz" - "version" "2.1.0" + version "2.1.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== dependencies: - "ajv" "^6.12.4" - "debug" "^4.3.2" - "espree" "^9.6.0" - "globals" "^13.19.0" - "ignore" "^5.2.0" - "import-fresh" "^3.2.1" - "js-yaml" "^4.1.0" - "minimatch" "^3.1.2" - "strip-json-comments" "^3.1.1" + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" "@eslint/js@8.44.0": - "integrity" "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==" - "resolved" "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz" - "version" "8.44.0" + version "8.44.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== "@hookform/resolvers@^2.9.11": - "integrity" "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==" - "resolved" "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz" - "version" "2.9.11" + version "2.9.11" + resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz" + integrity sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ== "@humanwhocodes/config-array@^0.11.10": - "integrity" "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" - "version" "0.11.10" + version "0.11.10" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" - "debug" "^4.1.1" - "minimatch" "^3.0.5" + debug "^4.1.1" + minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": - "integrity" "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - "version" "1.0.1" + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.1": - "integrity" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - "version" "1.2.1" + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@iconify/react@^3.2.2": - "integrity" "sha512-z3+Jno3VcJzgNHsN5mEvYMsgCkOZkydqdIwOxjXh45+i2Vs9RGH68Y52vt39izwFSfuYUXhaW+1u7m7+IhCn/g==" - "resolved" "https://registry.npmjs.org/@iconify/react/-/react-3.2.2.tgz" - "version" "3.2.2" + version "3.2.2" + resolved "https://registry.npmjs.org/@iconify/react/-/react-3.2.2.tgz" + integrity sha512-z3+Jno3VcJzgNHsN5mEvYMsgCkOZkydqdIwOxjXh45+i2Vs9RGH68Y52vt39izwFSfuYUXhaW+1u7m7+IhCn/g== "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - "integrity" "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==" - "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - "version" "0.3.2" + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@3.1.0": - "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - "version" "3.1.0" + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.1": - "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": - "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - "version" "1.4.14" + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - "integrity" "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==" - "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" - "version" "0.3.17" + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" "@juggle/resize-observer@^3.3.1": - "integrity" "sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==" - "resolved" "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.3.1.tgz" - "version" "3.3.1" + version "3.3.1" + resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.3.1.tgz" + integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw== "@motionone/animation@^10.12.0": - "integrity" "sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ==" - "resolved" "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz" + integrity sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ== dependencies: "@motionone/easing" "^10.14.0" "@motionone/types" "^10.14.0" "@motionone/utils" "^10.14.0" - "tslib" "^2.3.1" + tslib "^2.3.1" "@motionone/dom@10.12.0": - "integrity" "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==" - "resolved" "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz" - "version" "10.12.0" + version "10.12.0" + resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz" + integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw== dependencies: "@motionone/animation" "^10.12.0" "@motionone/generators" "^10.12.0" "@motionone/types" "^10.12.0" "@motionone/utils" "^10.12.0" - "hey-listen" "^1.0.8" - "tslib" "^2.3.1" + hey-listen "^1.0.8" + tslib "^2.3.1" "@motionone/easing@^10.14.0": - "integrity" "sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA==" - "resolved" "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz" + integrity sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA== dependencies: "@motionone/utils" "^10.14.0" - "tslib" "^2.3.1" + tslib "^2.3.1" "@motionone/generators@^10.12.0": - "integrity" "sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg==" - "resolved" "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz" + integrity sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg== dependencies: "@motionone/types" "^10.14.0" "@motionone/utils" "^10.14.0" - "tslib" "^2.3.1" + tslib "^2.3.1" "@motionone/types@^10.12.0", "@motionone/types@^10.14.0": - "integrity" "sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ==" - "resolved" "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz" + integrity sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ== "@motionone/utils@^10.12.0", "@motionone/utils@^10.14.0": - "integrity" "sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw==" - "resolved" "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz" + integrity sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw== dependencies: "@motionone/types" "^10.14.0" - "hey-listen" "^1.0.8" - "tslib" "^2.3.1" + hey-listen "^1.0.8" + tslib "^2.3.1" "@mui/base@5.0.0-alpha.79": - "integrity" "sha512-/lZLF027BkiEjM8MIYoeS/FEhTKf+41ePU9SOijMGrCin1Y0Igucw+IHa1fF8HXD7wDbFKqHuso3J1jMG8wyNw==" - "resolved" "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.79.tgz" - "version" "5.0.0-alpha.79" + version "5.0.0-alpha.79" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.79.tgz" + integrity sha512-/lZLF027BkiEjM8MIYoeS/FEhTKf+41ePU9SOijMGrCin1Y0Igucw+IHa1fF8HXD7wDbFKqHuso3J1jMG8wyNw== dependencies: "@babel/runtime" "^7.17.2" "@emotion/is-prop-valid" "^1.1.2" "@mui/types" "^7.1.3" "@mui/utils" "^5.6.1" "@popperjs/core" "^2.11.5" - "clsx" "^1.1.1" - "prop-types" "^15.7.2" - "react-is" "^17.0.2" + clsx "^1.1.1" + prop-types "^15.7.2" + react-is "^17.0.2" "@mui/base@5.0.0-beta.8": - "integrity" "sha512-b4vVjMZx5KzzEMf4arXKoeV5ZegAMOoPwoy1vfUBwhvXc2QtaaAyBp50U7OA2L06Leubc1A+lEp3eqwZoFn87g==" - "resolved" "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.8.tgz" - "version" "5.0.0-beta.8" + version "5.0.0-beta.8" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.8.tgz" + integrity sha512-b4vVjMZx5KzzEMf4arXKoeV5ZegAMOoPwoy1vfUBwhvXc2QtaaAyBp50U7OA2L06Leubc1A+lEp3eqwZoFn87g== dependencies: "@babel/runtime" "^7.22.6" "@emotion/is-prop-valid" "^1.2.1" "@mui/types" "^7.2.4" "@mui/utils" "^5.14.1" "@popperjs/core" "^2.11.8" - "clsx" "^1.2.1" - "prop-types" "^15.8.1" - "react-is" "^18.2.0" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" "@mui/core-downloads-tracker@^5.14.1": - "integrity" "sha512-mIa1WmDmNr1LoupV1Rbxt9bTFKMbIn10RHG1bnZ/FJCkAYpuU/D4n+R+ttiycgcZNngU++zyh/OQeJblzbQPzg==" - "resolved" "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.1.tgz" - "version" "5.14.1" + version "5.14.1" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.1.tgz" + integrity sha512-mIa1WmDmNr1LoupV1Rbxt9bTFKMbIn10RHG1bnZ/FJCkAYpuU/D4n+R+ttiycgcZNngU++zyh/OQeJblzbQPzg== "@mui/icons-material@^5.11.11": - "integrity" "sha512-xV/f26muQqtWzerzOIdGPrXoxp/OKaE2G2Wp9gnmG47mHua5Slup/tMc3fA4ZYUreGGrK6+tT81TEvt1Wsng8Q==" - "resolved" "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.1.tgz" - "version" "5.14.1" + version "5.14.1" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.1.tgz" + integrity sha512-xV/f26muQqtWzerzOIdGPrXoxp/OKaE2G2Wp9gnmG47mHua5Slup/tMc3fA4ZYUreGGrK6+tT81TEvt1Wsng8Q== dependencies: "@babel/runtime" "^7.22.6" "@mui/lab@5.0.0-alpha.80": - "integrity" "sha512-td5Ak0Hx+EzVN9MJqBlZJ6BKFGjTrHyNjXncjSHTvp8Z9p157AlOA/Sf7r+RyqyVzOzBfv4S37i9ShFTzSK61Q==" - "resolved" "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.80.tgz" - "version" "5.0.0-alpha.80" + version "5.0.0-alpha.80" + resolved "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.80.tgz" + integrity sha512-td5Ak0Hx+EzVN9MJqBlZJ6BKFGjTrHyNjXncjSHTvp8Z9p157AlOA/Sf7r+RyqyVzOzBfv4S37i9ShFTzSK61Q== dependencies: "@babel/runtime" "^7.17.2" "@mui/base" "5.0.0-alpha.79" "@mui/system" "^5.6.4" "@mui/utils" "^5.6.1" "@mui/x-date-pickers" "5.0.0-alpha.0" - "clsx" "^1.1.1" - "prop-types" "^15.7.2" - "react-is" "^17.0.2" - "react-transition-group" "^4.4.2" - "rifm" "^0.12.1" + clsx "^1.1.1" + prop-types "^15.7.2" + react-is "^17.0.2" + react-transition-group "^4.4.2" + rifm "^0.12.1" "@mui/material@^5.0.0", "@mui/material@^5.11.14", "@mui/material@^5.2.3", "@mui/material@^5.4.1": - "integrity" "sha512-WtsgYuageTunLfxH3Ri+o1RuQTFImtRHxMcVNyD0Hhd2/znjW6KODNz0XfjvLRnNCAynBxZNiflcoIBW40h9PQ==" - "resolved" "https://registry.npmjs.org/@mui/material/-/material-5.14.1.tgz" - "version" "5.14.1" + version "5.14.1" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.14.1.tgz" + integrity sha512-WtsgYuageTunLfxH3Ri+o1RuQTFImtRHxMcVNyD0Hhd2/znjW6KODNz0XfjvLRnNCAynBxZNiflcoIBW40h9PQ== dependencies: "@babel/runtime" "^7.22.6" "@mui/base" "5.0.0-beta.8" @@ -1429,91 +1436,91 @@ "@mui/types" "^7.2.4" "@mui/utils" "^5.14.1" "@types/react-transition-group" "^4.4.6" - "clsx" "^1.2.1" - "csstype" "^3.1.2" - "prop-types" "^15.8.1" - "react-is" "^18.2.0" - "react-transition-group" "^4.4.5" + clsx "^1.2.1" + csstype "^3.1.2" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" "@mui/private-theming@^5.13.7": - "integrity" "sha512-qbSr+udcij5F9dKhGX7fEdx2drXchq7htLNr2Qg2Ma+WJ6q0ERlEqGSBiPiVDJkptcjeVL4DGmcf1wl5+vD4EA==" - "resolved" "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.7.tgz" - "version" "5.13.7" + version "5.13.7" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.7.tgz" + integrity sha512-qbSr+udcij5F9dKhGX7fEdx2drXchq7htLNr2Qg2Ma+WJ6q0ERlEqGSBiPiVDJkptcjeVL4DGmcf1wl5+vD4EA== dependencies: "@babel/runtime" "^7.22.5" "@mui/utils" "^5.13.7" - "prop-types" "^15.8.1" + prop-types "^15.8.1" "@mui/styled-engine@^5.13.2": - "integrity" "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==" - "resolved" "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz" - "version" "5.13.2" + version "5.13.2" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz" + integrity sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw== dependencies: "@babel/runtime" "^7.21.0" "@emotion/cache" "^11.11.0" - "csstype" "^3.1.2" - "prop-types" "^15.8.1" + csstype "^3.1.2" + prop-types "^15.8.1" "@mui/system@^5.11.14", "@mui/system@^5.14.1", "@mui/system@^5.2.3", "@mui/system@^5.4.1", "@mui/system@^5.6.4": - "integrity" "sha512-u+xlsU34Jdkgx1CxmBnIC4Y08uPdVX5iEd3S/1dggDFtOGp+Lj8xmKRJAQ8PJOOJLOh8pDwaZx4AwXikL4l1QA==" - "resolved" "https://registry.npmjs.org/@mui/system/-/system-5.14.1.tgz" - "version" "5.14.1" + version "5.14.1" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.14.1.tgz" + integrity sha512-u+xlsU34Jdkgx1CxmBnIC4Y08uPdVX5iEd3S/1dggDFtOGp+Lj8xmKRJAQ8PJOOJLOh8pDwaZx4AwXikL4l1QA== dependencies: "@babel/runtime" "^7.22.6" "@mui/private-theming" "^5.13.7" "@mui/styled-engine" "^5.13.2" "@mui/types" "^7.2.4" "@mui/utils" "^5.14.1" - "clsx" "^1.2.1" - "csstype" "^3.1.2" - "prop-types" "^15.8.1" + clsx "^1.2.1" + csstype "^3.1.2" + prop-types "^15.8.1" "@mui/types@^7.1.3", "@mui/types@^7.2.4": - "integrity" "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==" - "resolved" "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz" - "version" "7.2.4" + version "7.2.4" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz" + integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== "@mui/utils@^5.10.3", "@mui/utils@^5.11.13", "@mui/utils@^5.13.7", "@mui/utils@^5.14.1", "@mui/utils@^5.2.3", "@mui/utils@^5.4.1", "@mui/utils@^5.6.1": - "integrity" "sha512-39KHKK2JeqRmuUcLDLwM+c2XfVC136C5/yUyQXmO2PVbOb2Bol4KxtkssEqCbTwg87PSCG3f1Tb0keRsK7cVGw==" - "resolved" "https://registry.npmjs.org/@mui/utils/-/utils-5.14.1.tgz" - "version" "5.14.1" + version "5.14.1" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.1.tgz" + integrity sha512-39KHKK2JeqRmuUcLDLwM+c2XfVC136C5/yUyQXmO2PVbOb2Bol4KxtkssEqCbTwg87PSCG3f1Tb0keRsK7cVGw== dependencies: "@babel/runtime" "^7.22.6" "@types/prop-types" "^15.7.5" "@types/react-is" "^18.2.1" - "prop-types" "^15.8.1" - "react-is" "^18.2.0" + prop-types "^15.8.1" + react-is "^18.2.0" "@mui/x-data-grid@^5.17.26": - "integrity" "sha512-eGJq9J0g9cDGLFfMmugOadZx0mJeOd/yQpHwEa5gUXyONS6qF0OhXSWyDOhDdA3l2TOoQzotMN5dY/T4Wl1KYA==" - "resolved" "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-5.17.26.tgz" - "version" "5.17.26" + version "5.17.26" + resolved "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-5.17.26.tgz" + integrity sha512-eGJq9J0g9cDGLFfMmugOadZx0mJeOd/yQpHwEa5gUXyONS6qF0OhXSWyDOhDdA3l2TOoQzotMN5dY/T4Wl1KYA== dependencies: "@babel/runtime" "^7.18.9" "@mui/utils" "^5.10.3" - "clsx" "^1.2.1" - "prop-types" "^15.8.1" - "reselect" "^4.1.6" + clsx "^1.2.1" + prop-types "^15.8.1" + reselect "^4.1.6" "@mui/x-date-pickers@5.0.0-alpha.0": - "integrity" "sha512-JTzTaNSWbxNi8KDUJjHCH6im0YlIEv88gPoKhGm7s6xCGT1q6FtMp/oQ40nhfwrJ73nkM5G1JXRIzI/yfsHXQQ==" - "resolved" "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.0-alpha.0.tgz" - "version" "5.0.0-alpha.0" + version "5.0.0-alpha.0" + resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.0-alpha.0.tgz" + integrity sha512-JTzTaNSWbxNi8KDUJjHCH6im0YlIEv88gPoKhGm7s6xCGT1q6FtMp/oQ40nhfwrJ73nkM5G1JXRIzI/yfsHXQQ== dependencies: "@date-io/date-fns" "^2.11.0" "@date-io/dayjs" "^2.11.0" "@date-io/luxon" "^2.11.1" "@date-io/moment" "^2.11.0" "@mui/utils" "^5.2.3" - "clsx" "^1.1.1" - "prop-types" "^15.7.2" - "react-transition-group" "^4.4.2" - "rifm" "^0.12.1" + clsx "^1.1.1" + prop-types "^15.7.2" + react-transition-group "^4.4.2" + rifm "^0.12.1" "@mui/x-date-pickers@5.0.0-beta.2": - "integrity" "sha512-UEXQ2tmhosklAQwOUtwQBI2WngSdp5Q8vYqsmvxNJxuXYuM/DawdQBwyfFyK7jx5wf/RTsniG1e12hqii3wPYg==" - "resolved" "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.0-beta.2.tgz" - "version" "5.0.0-beta.2" + version "5.0.0-beta.2" + resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.0-beta.2.tgz" + integrity sha512-UEXQ2tmhosklAQwOUtwQBI2WngSdp5Q8vYqsmvxNJxuXYuM/DawdQBwyfFyK7jx5wf/RTsniG1e12hqii3wPYg== dependencies: "@babel/runtime" "^7.18.6" "@date-io/core" "^2.14.0" @@ -1523,162 +1530,162 @@ "@date-io/moment" "^2.14.0" "@mui/utils" "^5.4.1" "@types/react-transition-group" "^4.4.5" - "clsx" "^1.2.1" - "prop-types" "^15.7.2" - "react-transition-group" "^4.4.2" - "rifm" "^0.12.1" + clsx "^1.2.1" + prop-types "^15.7.2" + react-transition-group "^4.4.2" + rifm "^0.12.1" "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - "integrity" "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==" - "resolved" "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" - "version" "5.1.1-v1" + version "5.1.1-v1" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== dependencies: - "eslint-scope" "5.1.1" + eslint-scope "5.1.1" "@nodelib/fs.scandir@2.1.5": - "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - "version" "2.1.5" + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" + run-parallel "^1.1.9" "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - "version" "2.0.5" + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - "version" "1.2.8" + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" + fastq "^1.6.0" "@popperjs/core@^2.11.5", "@popperjs/core@^2.11.8": - "integrity" "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" - "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" - "version" "2.11.8" + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@remix-run/router@1.7.2": - "integrity" "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==" - "resolved" "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz" - "version" "1.7.2" + version "1.7.2" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz" + integrity sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A== "@rollup/plugin-babel@^5.2.0": - "integrity" "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==" - "resolved" "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" - "version" "5.3.1" + version "5.3.1" + resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== dependencies: "@babel/helper-module-imports" "^7.10.4" "@rollup/pluginutils" "^3.1.0" "@rollup/plugin-node-resolve@^11.2.1": - "integrity" "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==" - "resolved" "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" - "version" "11.2.1" + version "11.2.1" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== dependencies: "@rollup/pluginutils" "^3.1.0" "@types/resolve" "1.17.1" - "builtin-modules" "^3.1.0" - "deepmerge" "^4.2.2" - "is-module" "^1.0.0" - "resolve" "^1.19.0" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" "@rollup/plugin-replace@^2.4.1": - "integrity" "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==" - "resolved" "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" - "version" "2.4.2" + version "2.4.2" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== dependencies: "@rollup/pluginutils" "^3.1.0" - "magic-string" "^0.25.7" + magic-string "^0.25.7" "@rollup/pluginutils@^3.1.0": - "integrity" "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==" - "resolved" "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" - "version" "3.1.0" + version "3.1.0" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: "@types/estree" "0.0.39" - "estree-walker" "^1.0.1" - "picomatch" "^2.2.2" + estree-walker "^1.0.1" + picomatch "^2.2.2" "@rollup/pluginutils@^4.2.1": - "integrity" "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==" - "resolved" "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" - "version" "4.2.1" + version "4.2.1" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== dependencies: - "estree-walker" "^2.0.1" - "picomatch" "^2.2.2" + estree-walker "^2.0.1" + picomatch "^2.2.2" "@rollup/pluginutils@^5.0.2": - "integrity" "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==" - "resolved" "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" - "version" "5.0.2" + version "5.0.2" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== dependencies: "@types/estree" "^1.0.0" - "estree-walker" "^2.0.2" - "picomatch" "^2.3.1" + estree-walker "^2.0.2" + picomatch "^2.3.1" "@rushstack/eslint-patch@^1.1.0": - "integrity" "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==" - "resolved" "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz" - "version" "1.1.0" + version "1.1.0" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz" + integrity sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A== "@surma/rollup-plugin-off-main-thread@^2.2.3": - "integrity" "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==" - "resolved" "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" - "version" "2.2.3" + version "2.2.3" + resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== dependencies: - "ejs" "^3.1.6" - "json5" "^2.2.0" - "magic-string" "^0.25.0" - "string.prototype.matchall" "^4.0.6" + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - "integrity" "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== "@svgr/babel-plugin-remove-jsx-attribute@*": - "integrity" "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz" - "version" "5.4.0" + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== "@svgr/babel-plugin-remove-jsx-empty-expression@*": - "integrity" "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz" - "version" "5.0.1" + version "5.0.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - "integrity" "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== "@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - "integrity" "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== "@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - "integrity" "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== "@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - "integrity" "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== "@svgr/babel-plugin-transform-svg-component@^6.5.1": - "integrity" "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==" - "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== "@svgr/babel-preset@^6.5.1": - "integrity" "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==" - "resolved" "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" "@svgr/babel-plugin-remove-jsx-attribute" "*" @@ -1690,38 +1697,38 @@ "@svgr/babel-plugin-transform-svg-component" "^6.5.1" "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": - "integrity" "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==" - "resolved" "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: "@babel/core" "^7.19.6" "@svgr/babel-preset" "^6.5.1" "@svgr/plugin-jsx" "^6.5.1" - "camelcase" "^6.2.0" - "cosmiconfig" "^7.0.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" "@svgr/hast-util-to-babel-ast@^6.5.1": - "integrity" "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==" - "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== dependencies: "@babel/types" "^7.20.0" - "entities" "^4.4.0" + entities "^4.4.0" "@svgr/plugin-jsx@^6.5.1": - "integrity" "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==" - "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" - "version" "6.5.1" + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== dependencies: "@babel/core" "^7.19.6" "@svgr/babel-preset" "^6.5.1" "@svgr/hast-util-to-babel-ast" "^6.5.1" - "svg-parser" "^2.0.4" + svg-parser "^2.0.4" "@types/babel__core@^7.1.9": - "integrity" "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==" - "resolved" "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz" - "version" "7.1.18" + version "7.1.18" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1730,255 +1737,255 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - "integrity" "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==" - "resolved" "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - "version" "7.6.4" + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - "integrity" "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==" - "resolved" "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - "version" "7.4.1" + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*": - "integrity" "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==" - "resolved" "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz" - "version" "7.14.2" + version "7.14.2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" "@types/estree@^1.0.0": - "integrity" "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - "resolved" "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" - "version" "1.0.0" + version "1.0.0" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/estree@0.0.39": - "integrity" "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" - "version" "0.0.39" + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/json-schema@^7.0.9": - "integrity" "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" - "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" - "version" "7.0.9" + version "7.0.9" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": - "integrity" "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - "version" "0.0.29" + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.175", "@types/lodash@^4.14.191": - "integrity" "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" - "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" - "version" "4.14.195" + version "4.14.195" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/node@*", "@types/node@>= 14": - "integrity" "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz" - "version" "17.0.21" + version "17.0.21" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz" + integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== "@types/nprogress@^0.2.0": - "integrity" "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==" - "resolved" "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz" - "version" "0.2.0" + version "0.2.0" + resolved "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz" + integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A== "@types/parse-json@^4.0.0": - "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - "version" "4.0.0" + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prop-types@*", "@types/prop-types@^15.7.5": - "integrity" "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - "version" "15.7.5" + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/quill@^1.3.10": - "integrity" "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==" - "resolved" "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz" - "version" "1.3.10" + version "1.3.10" + resolved "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz" + integrity sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw== dependencies: - "parchment" "^1.1.2" + parchment "^1.1.2" "@types/react-dom@^17.0.19": - "integrity" "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==" - "resolved" "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz" - "version" "17.0.20" + version "17.0.20" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz" + integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA== dependencies: "@types/react" "^17" "@types/react-is@^18.2.1": - "integrity" "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==" - "resolved" "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz" - "version" "18.2.1" + version "18.2.1" + resolved "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz" + integrity sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw== dependencies: "@types/react" "*" "@types/react-lazy-load-image-component@^1.5.2": - "integrity" "sha512-4NLJsMJVrMv18FuMIkUUBVj/PH9A+BvLKrZC75EWiEFn1IsMrZHgL1tVKw5QBfoa0Qjz6SkWIzEvwcyZ8PgnIg==" - "resolved" "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.2.tgz" - "version" "1.5.2" + version "1.5.2" + resolved "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.2.tgz" + integrity sha512-4NLJsMJVrMv18FuMIkUUBVj/PH9A+BvLKrZC75EWiEFn1IsMrZHgL1tVKw5QBfoa0Qjz6SkWIzEvwcyZ8PgnIg== dependencies: "@types/react" "*" - "csstype" "^3.0.2" + csstype "^3.0.2" "@types/react-transition-group@^4.4.5", "@types/react-transition-group@^4.4.6": - "integrity" "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==" - "resolved" "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz" - "version" "4.4.6" + version "4.4.6" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^17", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^17.0.53": - "integrity" "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==" - "resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz" - "version" "17.0.62" + version "17.0.62" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz" + integrity sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" - "csstype" "^3.0.2" + csstype "^3.0.2" "@types/resolve@1.17.1": - "integrity" "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==" - "resolved" "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" - "version" "1.17.1" + version "1.17.1" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== dependencies: "@types/node" "*" "@types/scheduler@*": - "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" - "version" "0.16.2" + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/semver@^7.3.12": - "integrity" "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" - "resolved" "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" - "version" "7.5.0" + version "7.5.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== "@types/stylis@^4.0.2": - "integrity" "sha512-wtckGuk1eXUlUz0Qb1eXHG37Z7HWT2GfMdqRf8F/ifddTwadSS9Jwsqi4qtXk7cP7MtoyGVIHPElFCLc6HItbg==" - "resolved" "https://registry.npmjs.org/@types/stylis/-/stylis-4.0.2.tgz" - "version" "4.0.2" + version "4.0.2" + resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.0.2.tgz" + integrity sha512-wtckGuk1eXUlUz0Qb1eXHG37Z7HWT2GfMdqRf8F/ifddTwadSS9Jwsqi4qtXk7cP7MtoyGVIHPElFCLc6HItbg== "@types/trusted-types@^2.0.2": - "integrity" "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - "resolved" "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz" - "version" "2.0.2" + version "2.0.2" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== "@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0", "@typescript-eslint/eslint-plugin@^5.56.0": - "integrity" "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" "@typescript-eslint/scope-manager" "5.62.0" "@typescript-eslint/type-utils" "5.62.0" "@typescript-eslint/utils" "5.62.0" - "debug" "^4.3.4" - "graphemer" "^1.4.0" - "ignore" "^5.2.0" - "natural-compare-lite" "^1.4.0" - "semver" "^7.3.7" - "tsutils" "^3.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - "integrity" "sha512-4bEa8WrS5DdzJq43smPH12ys4AOoCxVu2xjYGXQR4DnNyM8pqNzCr28zodf38Jc4bxWdniSEKKC1bQaccXGq5Q==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.12.1.tgz" - "version" "5.12.1" + version "5.12.1" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.12.1.tgz" + integrity sha512-4bEa8WrS5DdzJq43smPH12ys4AOoCxVu2xjYGXQR4DnNyM8pqNzCr28zodf38Jc4bxWdniSEKKC1bQaccXGq5Q== dependencies: "@typescript-eslint/utils" "5.12.1" "@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.56.0": - "integrity" "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: "@typescript-eslint/scope-manager" "5.62.0" "@typescript-eslint/types" "5.62.0" "@typescript-eslint/typescript-estree" "5.62.0" - "debug" "^4.3.4" + debug "^4.3.4" "@typescript-eslint/scope-manager@5.12.1": - "integrity" "sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz" - "version" "5.12.1" + version "5.12.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz" + integrity sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ== dependencies: "@typescript-eslint/types" "5.12.1" "@typescript-eslint/visitor-keys" "5.12.1" "@typescript-eslint/scope-manager@5.62.0": - "integrity" "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" "@typescript-eslint/type-utils@5.62.0": - "integrity" "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: "@typescript-eslint/typescript-estree" "5.62.0" "@typescript-eslint/utils" "5.62.0" - "debug" "^4.3.4" - "tsutils" "^3.21.0" + debug "^4.3.4" + tsutils "^3.21.0" "@typescript-eslint/types@5.12.1": - "integrity" "sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz" - "version" "5.12.1" + version "5.12.1" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.12.1.tgz" + integrity sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA== "@typescript-eslint/types@5.62.0": - "integrity" "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@5.12.1": - "integrity" "sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz" - "version" "5.12.1" + version "5.12.1" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz" + integrity sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw== dependencies: "@typescript-eslint/types" "5.12.1" "@typescript-eslint/visitor-keys" "5.12.1" - "debug" "^4.3.2" - "globby" "^11.0.4" - "is-glob" "^4.0.3" - "semver" "^7.3.5" - "tsutils" "^3.21.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" "@typescript-eslint/typescript-estree@5.62.0": - "integrity" "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" - "debug" "^4.3.4" - "globby" "^11.1.0" - "is-glob" "^4.0.3" - "semver" "^7.3.7" - "tsutils" "^3.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" "@typescript-eslint/utils@^5.10.2", "@typescript-eslint/utils@5.12.1": - "integrity" "sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz" - "version" "5.12.1" + version "5.12.1" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz" + integrity sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ== dependencies: "@types/json-schema" "^7.0.9" "@typescript-eslint/scope-manager" "5.12.1" "@typescript-eslint/types" "5.12.1" "@typescript-eslint/typescript-estree" "5.12.1" - "eslint-scope" "^5.1.1" - "eslint-utils" "^3.0.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" "@typescript-eslint/utils@5.62.0": - "integrity" "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" @@ -1986,29 +1993,29 @@ "@typescript-eslint/scope-manager" "5.62.0" "@typescript-eslint/types" "5.62.0" "@typescript-eslint/typescript-estree" "5.62.0" - "eslint-scope" "^5.1.1" - "semver" "^7.3.7" + eslint-scope "^5.1.1" + semver "^7.3.7" "@typescript-eslint/visitor-keys@5.12.1": - "integrity" "sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz" - "version" "5.12.1" + version "5.12.1" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz" + integrity sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A== dependencies: "@typescript-eslint/types" "5.12.1" - "eslint-visitor-keys" "^3.0.0" + eslint-visitor-keys "^3.0.0" "@typescript-eslint/visitor-keys@5.62.0": - "integrity" "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" - "version" "5.62.0" + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: "@typescript-eslint/types" "5.62.0" - "eslint-visitor-keys" "^3.3.0" + eslint-visitor-keys "^3.3.0" "@vitejs/plugin-react@^1.3.2": - "integrity" "sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==" - "resolved" "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz" - "version" "1.3.2" + version "1.3.2" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz" + integrity sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA== dependencies: "@babel/core" "^7.17.10" "@babel/plugin-transform-react-jsx" "^7.17.3" @@ -2016,232 +2023,232 @@ "@babel/plugin-transform-react-jsx-self" "^7.16.7" "@babel/plugin-transform-react-jsx-source" "^7.16.7" "@rollup/pluginutils" "^4.2.1" - "react-refresh" "^0.13.0" - "resolve" "^1.22.0" + react-refresh "^0.13.0" + resolve "^1.22.0" -"acorn-jsx@^5.3.2": - "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - "version" "5.3.2" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.5.0", "acorn@^8.9.0": - "integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - "version" "8.10.0" +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.5.0, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== -"ajv@^6.10.0": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" +ajv@^6.10.0: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - "fast-deep-equal" "^3.1.1" - "fast-json-stable-stringify" "^2.0.0" - "json-schema-traverse" "^0.4.1" - "uri-js" "^4.2.2" + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -"ajv@^6.12.4": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - "fast-deep-equal" "^3.1.1" - "fast-json-stable-stringify" "^2.0.0" - "json-schema-traverse" "^0.4.1" - "uri-js" "^4.2.2" + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -"ajv@^8.6.0", "ajv@>=8": - "integrity" "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" - "version" "8.11.0" +ajv@^8.6.0, ajv@>=8: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: - "fast-deep-equal" "^3.1.1" - "json-schema-traverse" "^1.0.0" - "require-from-string" "^2.0.2" - "uri-js" "^4.2.2" + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" -"ansi-regex@^5.0.1": - "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - "version" "5.0.1" +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - "color-convert" "^1.9.0" + color-convert "^1.9.0" -"ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "color-convert" "^2.0.1" + color-convert "^2.0.1" -"apexcharts@^3.18.0", "apexcharts@^3.37.2": - "integrity" "sha512-FJXA7NVjxs1q+ptR3b1I+pN8K/gWuXn+qLZjFz8EHvJOokdgcuwa/HSe5aC465HW/LWnrjWLSTsOQejQbQ42hQ==" - "resolved" "https://registry.npmjs.org/apexcharts/-/apexcharts-3.41.0.tgz" - "version" "3.41.0" +apexcharts@^3.18.0, apexcharts@^3.37.2: + version "3.41.0" + resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-3.41.0.tgz" + integrity sha512-FJXA7NVjxs1q+ptR3b1I+pN8K/gWuXn+qLZjFz8EHvJOokdgcuwa/HSe5aC465HW/LWnrjWLSTsOQejQbQ42hQ== dependencies: - "svg.draggable.js" "^2.2.2" - "svg.easing.js" "^2.0.0" - "svg.filter.js" "^2.0.2" - "svg.pathmorphing.js" "^0.1.3" - "svg.resize.js" "^1.4.3" - "svg.select.js" "^3.0.1" + svg.draggable.js "^2.2.2" + svg.easing.js "^2.0.0" + svg.filter.js "^2.0.2" + svg.pathmorphing.js "^0.1.3" + svg.resize.js "^1.4.3" + svg.select.js "^3.0.1" -"argparse@^2.0.1": - "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - "version" "2.0.1" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -"aria-query@^4.2.2": - "integrity" "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==" - "resolved" "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" - "version" "4.2.2" +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -"array-includes@^3.1.3", "array-includes@^3.1.4", "array-includes@^3.1.6": - "integrity" "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==" - "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" - "version" "3.1.6" +array-includes@^3.1.3, array-includes@^3.1.4, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - "get-intrinsic" "^1.1.3" - "is-string" "^1.0.7" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" -"array-union@^2.1.0": - "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - "version" "2.1.0" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -"array.prototype.flat@^1.3.1": - "integrity" "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==" - "resolved" "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" - "version" "1.3.1" +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - "es-shim-unscopables" "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -"array.prototype.flatmap@^1.3.1": - "integrity" "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==" - "resolved" "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" - "version" "1.3.1" +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - "es-shim-unscopables" "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -"array.prototype.tosorted@^1.1.1": - "integrity" "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==" - "resolved" "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" - "version" "1.1.1" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - "es-shim-unscopables" "^1.0.0" - "get-intrinsic" "^1.1.3" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" -"ast-types-flow@^0.0.7": - "integrity" "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - "resolved" "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" - "version" "0.0.7" +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -"async@0.9.x": - "integrity" "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - "resolved" "https://registry.npmjs.org/async/-/async-0.9.2.tgz" - "version" "0.9.2" +async@0.9.x: + version "0.9.2" + resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= -"asynckit@^0.4.0": - "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -"at-least-node@^1.0.0": - "integrity" "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - "resolved" "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - "version" "1.0.0" +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -"attr-accept@^2.2.2": - "integrity" "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" - "resolved" "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz" - "version" "2.2.2" +attr-accept@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz" + integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== -"axe-core@^4.3.5": - "integrity" "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==" - "resolved" "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz" - "version" "4.4.1" +axe-core@^4.3.5: + version "4.4.1" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz" + integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== -"axios@^0.27.2": - "integrity" "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==" - "resolved" "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" - "version" "0.27.2" +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== dependencies: - "follow-redirects" "^1.14.9" - "form-data" "^4.0.0" + follow-redirects "^1.14.9" + form-data "^4.0.0" -"axobject-query@^2.2.0": - "integrity" "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - "resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" - "version" "2.2.0" +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -"babel-plugin-dynamic-import-node@^2.3.3": - "integrity" "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==" - "resolved" "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - "version" "2.3.3" +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: - "object.assign" "^4.1.0" + object.assign "^4.1.0" -"babel-plugin-macros@^3.1.0": - "integrity" "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==" - "resolved" "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" - "version" "3.1.0" +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" - "cosmiconfig" "^7.0.0" - "resolve" "^1.19.0" + cosmiconfig "^7.0.0" + resolve "^1.19.0" -"babel-plugin-polyfill-corejs2@^0.3.0": - "integrity" "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz" - "version" "0.3.1" +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== dependencies: "@babel/compat-data" "^7.13.11" "@babel/helper-define-polyfill-provider" "^0.3.1" - "semver" "^6.1.1" + semver "^6.1.1" -"babel-plugin-polyfill-corejs3@^0.5.0": - "integrity" "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz" - "version" "0.5.2" +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" - "core-js-compat" "^3.21.0" + core-js-compat "^3.21.0" -"babel-plugin-polyfill-regenerator@^0.3.0": - "integrity" "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" - "version" "0.3.1" +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" -"babel-plugin-transform-react-remove-prop-types@^0.4.24": - "integrity" "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - "resolved" "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" - "version" "0.4.24" +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== -"babel-preset-react-app@^10.0.1": - "integrity" "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==" - "resolved" "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" - "version" "10.0.1" +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" + integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== dependencies: "@babel/core" "^7.16.0" "@babel/plugin-proposal-class-properties" "^7.16.0" @@ -2257,713 +2264,713 @@ "@babel/preset-react" "^7.16.0" "@babel/preset-typescript" "^7.16.0" "@babel/runtime" "^7.16.3" - "babel-plugin-macros" "^3.1.0" - "babel-plugin-transform-react-remove-prop-types" "^0.4.24" + babel-plugin-macros "^3.1.0" + babel-plugin-transform-react-remove-prop-types "^0.4.24" -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" + balanced-match "^1.0.0" + concat-map "0.0.1" -"braces@^3.0.1": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - "fill-range" "^7.0.1" + fill-range "^7.0.1" -"browserslist@^4.19.1", "browserslist@^4.21.9", "browserslist@>= 4.21.0": - "integrity" "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" - "version" "4.21.9" +browserslist@^4.19.1, browserslist@^4.21.9, "browserslist@>= 4.21.0": + version "4.21.9" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - "caniuse-lite" "^1.0.30001503" - "electron-to-chromium" "^1.4.431" - "node-releases" "^2.0.12" - "update-browserslist-db" "^1.0.11" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" -"buffer-from@^1.0.0": - "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - "version" "1.1.2" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -"builtin-modules@^3.1.0": - "integrity" "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" - "resolved" "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz" - "version" "3.2.0" +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== -"call-bind@^1.0.0", "call-bind@^1.0.2": - "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" - "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - "version" "1.0.2" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: - "function-bind" "^1.1.1" - "get-intrinsic" "^1.0.2" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -"camel-case@^4.1.2": - "integrity" "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==" - "resolved" "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - "version" "4.1.2" +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: - "pascal-case" "^3.1.2" - "tslib" "^2.0.3" + pascal-case "^3.1.2" + tslib "^2.0.3" -"camelcase@^6.2.0": - "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - "version" "6.3.0" +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -"can-use-dom@^0.1.0": - "integrity" "sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=" - "resolved" "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz" - "version" "0.1.0" +can-use-dom@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz" + integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= -"caniuse-lite@^1.0.30001503": - "integrity" "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz" - "version" "1.0.30001517" +caniuse-lite@^1.0.30001503: + version "1.0.30001517" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== -"capital-case@^1.0.4": - "integrity" "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==" - "resolved" "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" - "version" "1.0.4" +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== dependencies: - "no-case" "^3.0.4" - "tslib" "^2.0.3" - "upper-case-first" "^2.0.2" + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" -"chalk@^2.0.0", "chalk@^2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" +chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -"chalk@^4.0.0": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -"change-case@^4.1.2": - "integrity" "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==" - "resolved" "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz" - "version" "4.1.2" +change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== dependencies: - "camel-case" "^4.1.2" - "capital-case" "^1.0.4" - "constant-case" "^3.0.4" - "dot-case" "^3.0.4" - "header-case" "^2.0.4" - "no-case" "^3.0.4" - "param-case" "^3.0.4" - "pascal-case" "^3.1.2" - "path-case" "^3.0.4" - "sentence-case" "^3.0.4" - "snake-case" "^3.0.4" - "tslib" "^2.0.3" + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" -"charcodes@^0.2.0": - "integrity" "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==" - "resolved" "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz" - "version" "0.2.0" +charcodes@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz" + integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== -"clone@^2.1.1": - "integrity" "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - "resolved" "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" - "version" "2.1.2" +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -"clsx@^1.1.0", "clsx@^1.1.1", "clsx@^1.2.1": - "integrity" "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - "resolved" "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" - "version" "1.2.1" +clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - "color-name" "1.1.3" + color-name "1.1.3" -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: - "color-name" "~1.1.4" + color-name "~1.1.4" -"color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -"color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -"combined-stream@^1.0.8": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: - "delayed-stream" "~1.0.0" + delayed-stream "~1.0.0" -"commander@^2.20.0": - "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - "version" "2.20.3" +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -"common-tags@^1.8.0": - "integrity" "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" - "resolved" "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" - "version" "1.8.2" +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== -"concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -"confusing-browser-globals@^1.0.10", "confusing-browser-globals@^1.0.11": - "integrity" "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - "resolved" "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" - "version" "1.0.11" +confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -"constant-case@^3.0.4": - "integrity" "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==" - "resolved" "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz" - "version" "3.0.4" +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== dependencies: - "no-case" "^3.0.4" - "tslib" "^2.0.3" - "upper-case" "^2.0.2" + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" -"convert-source-map@^1.5.0", "convert-source-map@^1.7.0": - "integrity" "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==" - "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - "version" "1.8.0" +convert-source-map@^1.5.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: - "safe-buffer" "~5.1.1" + safe-buffer "~5.1.1" -"core-js-compat@^3.20.2", "core-js-compat@^3.21.0": - "integrity" "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==" - "resolved" "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz" - "version" "3.21.1" +core-js-compat@^3.20.2, core-js-compat@^3.21.0: + version "3.21.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz" + integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== dependencies: - "browserslist" "^4.19.1" - "semver" "7.0.0" + browserslist "^4.19.1" + semver "7.0.0" -"core-js-pure@^3.20.2": - "integrity" "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==" - "resolved" "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz" - "version" "3.21.1" +core-js-pure@^3.20.2: + version "3.21.1" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz" + integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== -"core-js@^3.0.1": - "integrity" "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" - "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz" - "version" "3.21.1" +core-js@^3.0.1: + version "3.21.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz" + integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== -"cosmiconfig@^7.0.0": - "integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==" - "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - "version" "7.0.1" +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" - "import-fresh" "^3.2.1" - "parse-json" "^5.0.0" - "path-type" "^4.0.0" - "yaml" "^1.10.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" -"cosmiconfig@^7.0.1": - "integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==" - "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - "version" "7.0.1" +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" - "import-fresh" "^3.2.1" - "parse-json" "^5.0.0" - "path-type" "^4.0.0" - "yaml" "^1.10.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" -"cross-spawn@^7.0.2": - "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" - "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - "version" "7.0.3" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - "path-key" "^3.1.0" - "shebang-command" "^2.0.0" - "which" "^2.0.1" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -"crypto-random-string@^2.0.0": - "integrity" "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - "version" "2.0.0" +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -"cssjanus@^2.0.1": - "integrity" "sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g==" - "resolved" "https://registry.npmjs.org/cssjanus/-/cssjanus-2.1.0.tgz" - "version" "2.1.0" +cssjanus@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/cssjanus/-/cssjanus-2.1.0.tgz" + integrity sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g== -"csstype@^3.0.10", "csstype@^3.0.2", "csstype@^3.1.1", "csstype@^3.1.2": - "integrity" "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" - "version" "3.1.2" +csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.1, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -"damerau-levenshtein@^1.0.7": - "integrity" "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - "resolved" "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" - "version" "1.0.8" +damerau-levenshtein@^1.0.7: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -"date-fns@^2.0.0", "date-fns@^2.25.0", "date-fns@^2.29.3": - "integrity" "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" - "resolved" "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" - "version" "2.29.3" +date-fns@^2.0.0, date-fns@^2.25.0, date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== -"debug@^3.2.7": - "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - "version" "3.2.7" +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: - "ms" "^2.1.1" + ms "^2.1.1" -"debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4": - "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - "version" "4.3.4" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - "ms" "2.1.2" + ms "2.1.2" -"deep-equal@^1.0.1": - "integrity" "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==" - "resolved" "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" - "version" "1.1.1" +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: - "is-arguments" "^1.0.4" - "is-date-object" "^1.0.1" - "is-regex" "^1.0.4" - "object-is" "^1.0.1" - "object-keys" "^1.1.1" - "regexp.prototype.flags" "^1.2.0" + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" -"deep-is@^0.1.3": - "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - "version" "0.1.4" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -"deepmerge@^4.2.2": - "integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - "version" "4.2.2" +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -"define-properties@^1.1.3", "define-properties@^1.1.4": - "integrity" "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==" - "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" - "version" "1.1.4" +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - "has-property-descriptors" "^1.0.0" - "object-keys" "^1.1.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" -"delayed-stream@~1.0.0": - "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -"dir-glob@^3.0.1": - "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - "version" "3.0.1" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - "path-type" "^4.0.0" + path-type "^4.0.0" -"doctrine@^2.1.0": - "integrity" "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - "version" "2.1.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: - "esutils" "^2.0.2" + esutils "^2.0.2" -"doctrine@^3.0.0": - "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - "version" "3.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - "esutils" "^2.0.2" + esutils "^2.0.2" -"dom-helpers@^5.0.1": - "integrity" "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==" - "resolved" "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" - "version" "5.2.1" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" - "csstype" "^3.0.2" + csstype "^3.0.2" -"dot-case@^3.0.4": - "integrity" "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==" - "resolved" "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - "version" "3.0.4" +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: - "no-case" "^3.0.4" - "tslib" "^2.0.3" + no-case "^3.0.4" + tslib "^2.0.3" -"ejs@^3.1.6": - "integrity" "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==" - "resolved" "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz" - "version" "3.1.6" +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== dependencies: - "jake" "^10.6.1" + jake "^10.6.1" -"electron-to-chromium@^1.4.431": - "integrity" "sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA==" - "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.466.tgz" - "version" "1.4.466" +electron-to-chromium@^1.4.431: + version "1.4.466" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.466.tgz" + integrity sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA== -"emoji-regex@^9.2.2": - "integrity" "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - "version" "9.2.2" +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -"entities@^4.4.0": - "integrity" "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" - "resolved" "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" - "version" "4.4.0" +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== -"error-ex@^1.3.1": - "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" - "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - "version" "1.3.2" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: - "is-arrayish" "^0.2.1" + is-arrayish "^0.2.1" -"es-abstract@^1.19.0", "es-abstract@^1.19.5", "es-abstract@^1.20.4": - "integrity" "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==" - "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz" - "version" "1.20.4" +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.4: + version "1.20.4" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== dependencies: - "call-bind" "^1.0.2" - "es-to-primitive" "^1.2.1" - "function-bind" "^1.1.1" - "function.prototype.name" "^1.1.5" - "get-intrinsic" "^1.1.3" - "get-symbol-description" "^1.0.0" - "has" "^1.0.3" - "has-property-descriptors" "^1.0.0" - "has-symbols" "^1.0.3" - "internal-slot" "^1.0.3" - "is-callable" "^1.2.7" - "is-negative-zero" "^2.0.2" - "is-regex" "^1.1.4" - "is-shared-array-buffer" "^1.0.2" - "is-string" "^1.0.7" - "is-weakref" "^1.0.2" - "object-inspect" "^1.12.2" - "object-keys" "^1.1.1" - "object.assign" "^4.1.4" - "regexp.prototype.flags" "^1.4.3" - "safe-regex-test" "^1.0.0" - "string.prototype.trimend" "^1.0.5" - "string.prototype.trimstart" "^1.0.5" - "unbox-primitive" "^1.0.2" + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" -"es-shim-unscopables@^1.0.0": - "integrity" "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==" - "resolved" "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" - "version" "1.0.0" +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== dependencies: - "has" "^1.0.3" + has "^1.0.3" -"es-to-primitive@^1.2.1": - "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" - "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - "version" "1.2.1" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: - "is-callable" "^1.1.4" - "is-date-object" "^1.0.1" - "is-symbol" "^1.0.2" + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" -"esbuild-linux-64@0.15.13": - "integrity" "sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==" - "resolved" "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz" - "version" "0.15.13" +esbuild-linux-64@0.15.13: + version "0.15.13" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz" + integrity sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A== -"esbuild@^0.15.9": - "integrity" "sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==" - "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz" - "version" "0.15.13" +esbuild@^0.15.9: + version "0.15.13" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz" + integrity sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ== optionalDependencies: "@esbuild/android-arm" "0.15.13" "@esbuild/linux-loong64" "0.15.13" - "esbuild-android-64" "0.15.13" - "esbuild-android-arm64" "0.15.13" - "esbuild-darwin-64" "0.15.13" - "esbuild-darwin-arm64" "0.15.13" - "esbuild-freebsd-64" "0.15.13" - "esbuild-freebsd-arm64" "0.15.13" - "esbuild-linux-32" "0.15.13" - "esbuild-linux-64" "0.15.13" - "esbuild-linux-arm" "0.15.13" - "esbuild-linux-arm64" "0.15.13" - "esbuild-linux-mips64le" "0.15.13" - "esbuild-linux-ppc64le" "0.15.13" - "esbuild-linux-riscv64" "0.15.13" - "esbuild-linux-s390x" "0.15.13" - "esbuild-netbsd-64" "0.15.13" - "esbuild-openbsd-64" "0.15.13" - "esbuild-sunos-64" "0.15.13" - "esbuild-windows-32" "0.15.13" - "esbuild-windows-64" "0.15.13" - "esbuild-windows-arm64" "0.15.13" + esbuild-android-64 "0.15.13" + esbuild-android-arm64 "0.15.13" + esbuild-darwin-64 "0.15.13" + esbuild-darwin-arm64 "0.15.13" + esbuild-freebsd-64 "0.15.13" + esbuild-freebsd-arm64 "0.15.13" + esbuild-linux-32 "0.15.13" + esbuild-linux-64 "0.15.13" + esbuild-linux-arm "0.15.13" + esbuild-linux-arm64 "0.15.13" + esbuild-linux-mips64le "0.15.13" + esbuild-linux-ppc64le "0.15.13" + esbuild-linux-riscv64 "0.15.13" + esbuild-linux-s390x "0.15.13" + esbuild-netbsd-64 "0.15.13" + esbuild-openbsd-64 "0.15.13" + esbuild-sunos-64 "0.15.13" + esbuild-windows-32 "0.15.13" + esbuild-windows-64 "0.15.13" + esbuild-windows-arm64 "0.15.13" -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -"escape-string-regexp@^1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -"escape-string-regexp@^4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -"eslint-config-airbnb-base@^15.0.0": - "integrity" "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==" - "resolved" "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz" - "version" "15.0.0" +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== dependencies: - "confusing-browser-globals" "^1.0.10" - "object.assign" "^4.1.2" - "object.entries" "^1.1.5" - "semver" "^6.3.0" + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" -"eslint-config-airbnb-typescript@^16.2.0": - "integrity" "sha512-OUaMPZpTOZGKd5tXOjJ9PRU4iYNW/Z5DoHIynjsVK/FpkWdiY5+nxQW6TiJAlLwVI1l53xUOrnlZWtVBVQzuWA==" - "resolved" "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.2.0.tgz" - "version" "16.2.0" +eslint-config-airbnb-typescript@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.2.0.tgz" + integrity sha512-OUaMPZpTOZGKd5tXOjJ9PRU4iYNW/Z5DoHIynjsVK/FpkWdiY5+nxQW6TiJAlLwVI1l53xUOrnlZWtVBVQzuWA== dependencies: - "eslint-config-airbnb-base" "^15.0.0" + eslint-config-airbnb-base "^15.0.0" -"eslint-config-airbnb@19.0.4": - "integrity" "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==" - "resolved" "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz" - "version" "19.0.4" +eslint-config-airbnb@19.0.4: + version "19.0.4" + resolved "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz" + integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== dependencies: - "eslint-config-airbnb-base" "^15.0.0" - "object.assign" "^4.1.2" - "object.entries" "^1.1.5" + eslint-config-airbnb-base "^15.0.0" + object.assign "^4.1.2" + object.entries "^1.1.5" -"eslint-config-prettier@^8.8.0": - "integrity" "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==" - "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" - "version" "8.8.0" +eslint-config-prettier@^8.8.0: + version "8.8.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== -"eslint-config-react-app@7.0.0": - "integrity" "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==" - "resolved" "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz" - "version" "7.0.0" +eslint-config-react-app@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz" + integrity sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g== dependencies: "@babel/core" "^7.16.0" "@babel/eslint-parser" "^7.16.3" "@rushstack/eslint-patch" "^1.1.0" "@typescript-eslint/eslint-plugin" "^5.5.0" "@typescript-eslint/parser" "^5.5.0" - "babel-preset-react-app" "^10.0.1" - "confusing-browser-globals" "^1.0.11" - "eslint-plugin-flowtype" "^8.0.3" - "eslint-plugin-import" "^2.25.3" - "eslint-plugin-jest" "^25.3.0" - "eslint-plugin-jsx-a11y" "^6.5.1" - "eslint-plugin-react" "^7.27.1" - "eslint-plugin-react-hooks" "^4.3.0" - "eslint-plugin-testing-library" "^5.0.1" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" -"eslint-import-resolver-node@^0.3.7": - "integrity" "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==" - "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" - "version" "0.3.7" +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: - "debug" "^3.2.7" - "is-core-module" "^2.11.0" - "resolve" "^1.22.1" + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" -"eslint-import-resolver-typescript@^2.7.1": - "integrity" "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==" - "resolved" "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz" - "version" "2.7.1" +eslint-import-resolver-typescript@^2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz" + integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== dependencies: - "debug" "^4.3.4" - "glob" "^7.2.0" - "is-glob" "^4.0.3" - "resolve" "^1.22.0" - "tsconfig-paths" "^3.14.1" + debug "^4.3.4" + glob "^7.2.0" + is-glob "^4.0.3" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" -"eslint-module-utils@^2.7.4": - "integrity" "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==" - "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" - "version" "2.8.0" +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: - "debug" "^3.2.7" + debug "^3.2.7" -"eslint-plugin-flowtype@^8.0.3": - "integrity" "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==" - "resolved" "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz" - "version" "8.0.3" +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== dependencies: - "lodash" "^4.17.21" - "string-natural-compare" "^3.0.1" + lodash "^4.17.21" + string-natural-compare "^3.0.1" -"eslint-plugin-import@*", "eslint-plugin-import@^2.25.2", "eslint-plugin-import@^2.25.3", "eslint-plugin-import@^2.27.5": - "integrity" "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==" - "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" - "version" "2.27.5" +eslint-plugin-import@*, eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - "array-includes" "^3.1.6" - "array.prototype.flat" "^1.3.1" - "array.prototype.flatmap" "^1.3.1" - "debug" "^3.2.7" - "doctrine" "^2.1.0" - "eslint-import-resolver-node" "^0.3.7" - "eslint-module-utils" "^2.7.4" - "has" "^1.0.3" - "is-core-module" "^2.11.0" - "is-glob" "^4.0.3" - "minimatch" "^3.1.2" - "object.values" "^1.1.6" - "resolve" "^1.22.1" - "semver" "^6.3.0" - "tsconfig-paths" "^3.14.1" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" -"eslint-plugin-jest@^25.3.0": - "integrity" "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==" - "resolved" "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz" - "version" "25.7.0" +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" -"eslint-plugin-jsx-a11y@^6.5.1", "eslint-plugin-jsx-a11y@6.5.1": - "integrity" "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==" - "resolved" "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz" - "version" "6.5.1" +eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz" + integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== dependencies: "@babel/runtime" "^7.16.3" - "aria-query" "^4.2.2" - "array-includes" "^3.1.4" - "ast-types-flow" "^0.0.7" - "axe-core" "^4.3.5" - "axobject-query" "^2.2.0" - "damerau-levenshtein" "^1.0.7" - "emoji-regex" "^9.2.2" - "has" "^1.0.3" - "jsx-ast-utils" "^3.2.1" - "language-tags" "^1.0.5" - "minimatch" "^3.0.4" + aria-query "^4.2.2" + array-includes "^3.1.4" + ast-types-flow "^0.0.7" + axe-core "^4.3.5" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.7" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.2.1" + language-tags "^1.0.5" + minimatch "^3.0.4" -"eslint-plugin-prettier@^4.2.1": - "integrity" "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==" - "resolved" "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" - "version" "4.2.1" +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: - "prettier-linter-helpers" "^1.0.0" + prettier-linter-helpers "^1.0.0" -"eslint-plugin-react-hooks@^4.3.0", "eslint-plugin-react-hooks@4.3.0": - "integrity" "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==" - "resolved" "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz" - "version" "4.3.0" +eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== -"eslint-plugin-react@^7.27.1", "eslint-plugin-react@^7.28.0", "eslint-plugin-react@^7.32.2": - "integrity" "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==" - "resolved" "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" - "version" "7.32.2" +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.32.2: + version "7.32.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: - "array-includes" "^3.1.6" - "array.prototype.flatmap" "^1.3.1" - "array.prototype.tosorted" "^1.1.1" - "doctrine" "^2.1.0" - "estraverse" "^5.3.0" - "jsx-ast-utils" "^2.4.1 || ^3.0.0" - "minimatch" "^3.1.2" - "object.entries" "^1.1.6" - "object.fromentries" "^2.0.6" - "object.hasown" "^1.1.2" - "object.values" "^1.1.6" - "prop-types" "^15.8.1" - "resolve" "^2.0.0-next.4" - "semver" "^6.3.0" - "string.prototype.matchall" "^4.0.8" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" -"eslint-plugin-testing-library@^5.0.1": - "integrity" "sha512-0j355vJpJCE/2g+aayIgJRUB6jBVqpD5ztMLGcadR1PgrgGPnPxN1HJuOAsAAwiMo27GwRnpJB8KOQzyNuNZrw==" - "resolved" "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.5.tgz" - "version" "5.0.5" +eslint-plugin-testing-library@^5.0.1: + version "5.0.5" + resolved "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.5.tgz" + integrity sha512-0j355vJpJCE/2g+aayIgJRUB6jBVqpD5ztMLGcadR1PgrgGPnPxN1HJuOAsAAwiMo27GwRnpJB8KOQzyNuNZrw== dependencies: "@typescript-eslint/utils" "^5.10.2" -"eslint-scope@^5.1.1", "eslint-scope@5.1.1": - "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - "version" "5.1.1" +eslint-scope@^5.1.1, eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^4.1.1" + esrecurse "^4.3.0" + estraverse "^4.1.1" -"eslint-scope@^7.2.0": - "integrity" "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz" - "version" "7.2.1" +eslint-scope@^7.2.0: + version "7.2.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz" + integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^5.2.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" -"eslint-utils@^3.0.0": - "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" - "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" - "version" "3.0.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - "eslint-visitor-keys" "^2.0.0" + eslint-visitor-keys "^2.0.0" -"eslint-visitor-keys@^2.0.0", "eslint-visitor-keys@^2.1.0": - "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - "version" "2.1.0" +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -"eslint-visitor-keys@^3.0.0": - "integrity" "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" - "version" "3.3.0" +eslint-visitor-keys@^3.0.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -"eslint-visitor-keys@^3.3.0": - "integrity" "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" - "version" "3.4.1" +eslint-visitor-keys@^3.3.0: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -"eslint-visitor-keys@^3.4.1": - "integrity" "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" - "version" "3.4.1" +eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -"eslint@*", "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.32.0 || ^8.2.0", "eslint@^7.5.0 || ^8.0.0", "eslint@^8.0.0", "eslint@^8.1.0", "eslint@^8.36.0", "eslint@>=5", "eslint@>=7.0.0", "eslint@>=7.28.0": - "integrity" "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz" - "version" "8.45.0" +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.32.0 || ^8.2.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.36.0, eslint@>=5, eslint@>=7.0.0, eslint@>=7.28.0: + version "8.45.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" @@ -2972,2109 +2979,2109 @@ "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - "ajv" "^6.10.0" - "chalk" "^4.0.0" - "cross-spawn" "^7.0.2" - "debug" "^4.3.2" - "doctrine" "^3.0.0" - "escape-string-regexp" "^4.0.0" - "eslint-scope" "^7.2.0" - "eslint-visitor-keys" "^3.4.1" - "espree" "^9.6.0" - "esquery" "^1.4.2" - "esutils" "^2.0.2" - "fast-deep-equal" "^3.1.3" - "file-entry-cache" "^6.0.1" - "find-up" "^5.0.0" - "glob-parent" "^6.0.2" - "globals" "^13.19.0" - "graphemer" "^1.4.0" - "ignore" "^5.2.0" - "imurmurhash" "^0.1.4" - "is-glob" "^4.0.0" - "is-path-inside" "^3.0.3" - "js-yaml" "^4.1.0" - "json-stable-stringify-without-jsonify" "^1.0.1" - "levn" "^0.4.1" - "lodash.merge" "^4.6.2" - "minimatch" "^3.1.2" - "natural-compare" "^1.4.0" - "optionator" "^0.9.3" - "strip-ansi" "^6.0.1" - "text-table" "^0.2.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" -"espree@^9.6.0": - "integrity" "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==" - "resolved" "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - "version" "9.6.1" +espree@^9.6.0: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - "acorn" "^8.9.0" - "acorn-jsx" "^5.3.2" - "eslint-visitor-keys" "^3.4.1" + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" -"esquery@^1.4.2": - "integrity" "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==" - "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - "version" "1.5.0" +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: - "estraverse" "^5.1.0" + estraverse "^5.1.0" -"esrecurse@^4.3.0": - "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - "version" "4.3.0" +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - "estraverse" "^5.2.0" + estraverse "^5.2.0" -"estraverse@^4.1.1": - "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - "version" "4.3.0" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -"estraverse@^5.1.0", "estraverse@^5.2.0", "estraverse@^5.3.0": - "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - "version" "5.3.0" +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -"estree-walker@^1.0.1": - "integrity" "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" - "version" "1.0.1" +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== -"estree-walker@^2.0.1": - "integrity" "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" - "version" "2.0.2" +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== -"estree-walker@^2.0.2": - "integrity" "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" - "version" "2.0.2" +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -"eventemitter3@^2.0.3": - "integrity" "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" - "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz" - "version" "2.0.3" +eventemitter3@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz" + integrity sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg== -"extend@^3.0.2": - "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - "version" "3.0.2" +extend@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -"fast-diff@^1.1.2": - "integrity" "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" - "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" - "version" "1.2.0" +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -"fast-diff@1.1.2": - "integrity" "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" - "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz" - "version" "1.1.2" +fast-diff@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz" + integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== -"fast-glob@^3.2.11", "fast-glob@^3.2.9": - "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" - "version" "3.2.11" +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - "glob-parent" "^5.1.2" - "merge2" "^1.3.0" - "micromatch" "^4.0.4" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" -"fast-json-stable-stringify@^2.0.0", "fast-json-stable-stringify@^2.1.0": - "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - "version" "2.1.0" +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -"fast-levenshtein@^2.0.6": - "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -"fastq@^1.6.0": - "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - "version" "1.13.0" +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: - "reusify" "^1.0.4" + reusify "^1.0.4" -"file-entry-cache@^6.0.1": - "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" - "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - "version" "6.0.1" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - "flat-cache" "^3.0.4" + flat-cache "^3.0.4" -"file-selector@^0.6.0": - "integrity" "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==" - "resolved" "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz" - "version" "0.6.0" +file-selector@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz" + integrity sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw== dependencies: - "tslib" "^2.4.0" + tslib "^2.4.0" -"filelist@^1.0.1": - "integrity" "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==" - "resolved" "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz" - "version" "1.0.2" +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== dependencies: - "minimatch" "^3.0.4" + minimatch "^3.0.4" -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - "to-regex-range" "^5.0.1" + to-regex-range "^5.0.1" -"find-root@^1.1.0": - "integrity" "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - "resolved" "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" - "version" "1.1.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -"find-up@^5.0.0": - "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - "version" "5.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - "locate-path" "^6.0.0" - "path-exists" "^4.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" -"flat-cache@^3.0.4": - "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" - "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - "version" "3.0.4" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - "flatted" "^3.1.0" - "rimraf" "^3.0.2" + flatted "^3.1.0" + rimraf "^3.0.2" -"flatted@^3.1.0": - "integrity" "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" - "version" "3.2.5" +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -"follow-redirects@^1.14.9": - "integrity" "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz" - "version" "1.14.9" +follow-redirects@^1.14.9: + version "1.14.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== -"form-data@^4.0.0": - "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - "version" "4.0.0" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.8" - "mime-types" "^2.1.12" + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" -"framer-motion@^6.5.1": - "integrity" "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==" - "resolved" "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" - "version" "6.5.1" +framer-motion@^6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" + integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== dependencies: "@motionone/dom" "10.12.0" - "framesync" "6.0.1" - "hey-listen" "^1.0.8" - "popmotion" "11.0.3" - "style-value-types" "5.0.0" - "tslib" "^2.1.0" + framesync "6.0.1" + hey-listen "^1.0.8" + popmotion "11.0.3" + style-value-types "5.0.0" + tslib "^2.1.0" optionalDependencies: "@emotion/is-prop-valid" "^0.8.2" -"framesync@6.0.1": - "integrity" "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==" - "resolved" "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz" - "version" "6.0.1" +framesync@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz" + integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA== dependencies: - "tslib" "^2.1.0" + tslib "^2.1.0" -"fs-extra@^9.0.1": - "integrity" "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - "version" "9.1.0" +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: - "at-least-node" "^1.0.0" - "graceful-fs" "^4.2.0" - "jsonfile" "^6.0.1" - "universalify" "^2.0.0" + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" -"fs.realpath@^1.0.0": - "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -"function.prototype.name@^1.1.5": - "integrity" "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==" - "resolved" "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" - "version" "1.1.5" +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - "es-abstract" "^1.19.0" - "functions-have-names" "^1.2.2" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" -"functions-have-names@^1.2.2": - "integrity" "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - "resolved" "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - "version" "1.2.3" +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -"gensync@^1.0.0-beta.2": - "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - "version" "1.0.0-beta.2" +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1", "get-intrinsic@^1.1.3": - "integrity" "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==" - "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" - "version" "1.1.3" +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: - "function-bind" "^1.1.1" - "has" "^1.0.3" - "has-symbols" "^1.0.3" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" -"get-own-enumerable-property-symbols@^3.0.0": - "integrity" "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - "resolved" "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" - "version" "3.0.2" +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -"get-symbol-description@^1.0.0": - "integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==" - "resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" - "version" "1.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: - "call-bind" "^1.0.2" - "get-intrinsic" "^1.1.1" + call-bind "^1.0.2" + get-intrinsic "^1.1.1" -"glob-parent@^5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - "is-glob" "^4.0.1" + is-glob "^4.0.1" -"glob-parent@^6.0.2": - "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - "version" "6.0.2" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - "is-glob" "^4.0.3" + is-glob "^4.0.3" -"glob@^7.1.3", "glob@^7.1.6", "glob@^7.2.0": - "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" +glob@^7.1.3, glob@^7.1.6, glob@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.0.4" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" -"globals@^11.1.0": - "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - "version" "11.12.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -"globals@^13.19.0": - "integrity" "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==" - "resolved" "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" - "version" "13.20.0" +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: - "type-fest" "^0.20.2" + type-fest "^0.20.2" -"globby@^11.0.4", "globby@^11.1.0": - "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" - "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - "version" "11.1.0" +globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: - "array-union" "^2.1.0" - "dir-glob" "^3.0.1" - "fast-glob" "^3.2.9" - "ignore" "^5.2.0" - "merge2" "^1.4.1" - "slash" "^3.0.0" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" -"goober@^2.0.33": - "integrity" "sha512-5SS2lmxbhqH0u9ABEWq7WPU69a4i2pYcHeCxqaNq6Cw3mnrF0ghWNM4tEGid4dKy8XNIAUbuThuozDHHKJVh3A==" - "resolved" "https://registry.npmjs.org/goober/-/goober-2.1.11.tgz" - "version" "2.1.11" +goober@^2.0.33: + version "2.1.11" + resolved "https://registry.npmjs.org/goober/-/goober-2.1.11.tgz" + integrity sha512-5SS2lmxbhqH0u9ABEWq7WPU69a4i2pYcHeCxqaNq6Cw3mnrF0ghWNM4tEGid4dKy8XNIAUbuThuozDHHKJVh3A== -"graceful-fs@^4.1.6", "graceful-fs@^4.2.0": - "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" - "version" "4.2.9" +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.9" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -"graphemer@^1.4.0": - "integrity" "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - "resolved" "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - "version" "1.4.0" +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -"has-bigints@^1.0.1", "has-bigints@^1.0.2": - "integrity" "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - "version" "1.0.2" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -"has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -"has-property-descriptors@^1.0.0": - "integrity" "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==" - "resolved" "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - "version" "1.0.0" +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: - "get-intrinsic" "^1.1.1" + get-intrinsic "^1.1.1" -"has-symbols@^1.0.2", "has-symbols@^1.0.3": - "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - "version" "1.0.3" +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -"has-tostringtag@^1.0.0": - "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" - "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - "version" "1.0.0" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - "has-symbols" "^1.0.2" + has-symbols "^1.0.2" -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - "function-bind" "^1.1.1" + function-bind "^1.1.1" -"header-case@^2.0.4": - "integrity" "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==" - "resolved" "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" - "version" "2.0.4" +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== dependencies: - "capital-case" "^1.0.4" - "tslib" "^2.0.3" + capital-case "^1.0.4" + tslib "^2.0.3" -"hey-listen@^1.0.8": - "integrity" "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" - "resolved" "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" - "version" "1.0.8" +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== -"highlight.js@^11.7.0": - "integrity" "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==" - "resolved" "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz" - "version" "11.8.0" +highlight.js@^11.7.0: + version "11.8.0" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz" + integrity sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg== -"history@^5.3.0": - "integrity" "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==" - "resolved" "https://registry.npmjs.org/history/-/history-5.3.0.tgz" - "version" "5.3.0" +history@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz" + integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== dependencies: "@babel/runtime" "^7.7.6" -"hoist-non-react-statics@^3.3.1": - "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==" - "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - "version" "3.3.2" +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: - "react-is" "^16.7.0" + react-is "^16.7.0" -"idb@^7.0.1": - "integrity" "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - "resolved" "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" - "version" "7.1.1" +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== -"ignore@^5.2.0": - "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - "version" "5.2.0" +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -"import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" + parent-module "^1.0.0" + resolve-from "^4.0.0" -"imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -"inflight@^1.0.4": - "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: - "once" "^1.3.0" - "wrappy" "1" + once "^1.3.0" + wrappy "1" -"inherits@2": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -"internal-slot@^1.0.3": - "integrity" "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==" - "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" - "version" "1.0.3" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - "get-intrinsic" "^1.1.0" - "has" "^1.0.3" - "side-channel" "^1.0.4" + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" -"invariant@^2.2.4": - "integrity" "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==" - "resolved" "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - "version" "2.2.4" +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: - "loose-envify" "^1.0.0" + loose-envify "^1.0.0" -"is-arguments@^1.0.4": - "integrity" "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==" - "resolved" "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - "version" "1.1.1" +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -"is-arrayish@^0.2.1": - "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -"is-bigint@^1.0.1": - "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==" - "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - "version" "1.0.4" +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: - "has-bigints" "^1.0.1" + has-bigints "^1.0.1" -"is-boolean-object@^1.1.0": - "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==" - "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - "version" "1.1.2" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -"is-callable@^1.1.4", "is-callable@^1.2.7": - "integrity" "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - "version" "1.2.7" +is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -"is-core-module@^2.11.0", "is-core-module@^2.9.0": - "integrity" "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" - "version" "2.11.0" +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: - "has" "^1.0.3" + has "^1.0.3" -"is-date-object@^1.0.1": - "integrity" "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==" - "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - "version" "1.0.5" +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: - "has-tostringtag" "^1.0.0" + has-tostringtag "^1.0.0" -"is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - "is-extglob" "^2.1.1" + is-extglob "^2.1.1" -"is-module@^1.0.0": - "integrity" "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" - "resolved" "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" - "version" "1.0.0" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -"is-negative-zero@^2.0.2": - "integrity" "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" - "version" "2.0.2" +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== -"is-number-object@^1.0.4": - "integrity" "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==" - "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - "version" "1.0.7" +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: - "has-tostringtag" "^1.0.0" + has-tostringtag "^1.0.0" -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -"is-obj@^1.0.1": - "integrity" "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - "version" "1.0.1" +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -"is-path-inside@^3.0.3": - "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - "version" "3.0.3" +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -"is-regex@^1.0.4", "is-regex@^1.1.4": - "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==" - "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - "version" "1.1.4" +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -"is-regexp@^1.0.0": - "integrity" "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - "resolved" "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" - "version" "1.0.0" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= -"is-shared-array-buffer@^1.0.2": - "integrity" "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==" - "resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" - "version" "1.0.2" +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: - "call-bind" "^1.0.2" + call-bind "^1.0.2" -"is-stream@^2.0.0": - "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - "version" "2.0.1" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -"is-string@^1.0.5", "is-string@^1.0.7": - "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==" - "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - "version" "1.0.7" +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - "has-tostringtag" "^1.0.0" + has-tostringtag "^1.0.0" -"is-symbol@^1.0.2", "is-symbol@^1.0.3": - "integrity" "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==" - "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - "version" "1.0.4" +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - "has-symbols" "^1.0.2" + has-symbols "^1.0.2" -"is-weakref@^1.0.2": - "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==" - "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - "version" "1.0.2" +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: - "call-bind" "^1.0.2" + call-bind "^1.0.2" -"isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -"jake@^10.6.1": - "integrity" "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==" - "resolved" "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" - "version" "10.8.2" +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== dependencies: - "async" "0.9.x" - "chalk" "^2.4.2" - "filelist" "^1.0.1" - "minimatch" "^3.0.4" + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" -"jest-worker@^26.2.1": - "integrity" "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==" - "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" - "version" "26.6.2" +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: "@types/node" "*" - "merge-stream" "^2.0.0" - "supports-color" "^7.0.0" + merge-stream "^2.0.0" + supports-color "^7.0.0" -"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -"js-yaml@^4.1.0": - "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - "version" "4.1.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - "argparse" "^2.0.1" + argparse "^2.0.1" -"jsesc@^2.5.1": - "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - "version" "2.5.2" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -"jsesc@~0.5.0": - "integrity" "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - "version" "0.5.0" +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -"json-parse-even-better-errors@^2.3.0": - "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - "version" "2.3.1" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -"json-schema-traverse@^0.4.1": - "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - "version" "0.4.1" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -"json-schema-traverse@^1.0.0": - "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - "version" "1.0.0" +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -"json-schema@^0.4.0": - "integrity" "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" - "version" "0.4.0" +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== -"json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - "version" "1.0.1" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -"json5@^1.0.1": - "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" - "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" - "version" "1.0.1" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: - "minimist" "^1.2.0" + minimist "^1.2.0" -"json5@^2.2.0", "json5@^2.2.2": - "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - "version" "2.2.3" +json5@^2.2.0, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -"jsonfile@^6.0.1": - "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - "version" "6.1.0" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - "universalify" "^2.0.0" + universalify "^2.0.0" optionalDependencies: - "graceful-fs" "^4.1.6" + graceful-fs "^4.1.6" -"jsonpointer@^5.0.0": - "integrity" "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" - "resolved" "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz" - "version" "5.0.0" +jsonpointer@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz" + integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== -"jsx-ast-utils@^2.4.1 || ^3.0.0", "jsx-ast-utils@^3.2.1": - "integrity" "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==" - "resolved" "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz" - "version" "3.2.1" +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: - "array-includes" "^3.1.3" - "object.assign" "^4.1.2" + array-includes "^3.1.3" + object.assign "^4.1.2" -"jsx-runtime@^1.2.0": - "integrity" "sha512-iCxmRTlUAWmXwHZxN0JSx/T7eRi0SkKAskE0lp+j4W1mzdNp49ja/9QI2ZmlggPM95RqnDw5ioYjw0EcvpIClw==" - "resolved" "https://registry.npmjs.org/jsx-runtime/-/jsx-runtime-1.2.0.tgz" - "version" "1.2.0" +jsx-runtime@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/jsx-runtime/-/jsx-runtime-1.2.0.tgz" + integrity sha512-iCxmRTlUAWmXwHZxN0JSx/T7eRi0SkKAskE0lp+j4W1mzdNp49ja/9QI2ZmlggPM95RqnDw5ioYjw0EcvpIClw== dependencies: - "object-assign" "^3.0.0" + object-assign "^3.0.0" -"language-subtag-registry@~0.3.2": - "integrity" "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" - "resolved" "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz" - "version" "0.3.21" +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== -"language-tags@^1.0.5": - "integrity" "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=" - "resolved" "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" - "version" "1.0.5" +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= dependencies: - "language-subtag-registry" "~0.3.2" + language-subtag-registry "~0.3.2" -"leven@^3.1.0": - "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - "version" "3.1.0" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -"levn@^0.4.1": - "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" - "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - "version" "0.4.1" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - "prelude-ls" "^1.2.1" - "type-check" "~0.4.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" -"lines-and-columns@^1.1.6": - "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - "version" "1.2.4" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -"locate-path@^6.0.0": - "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - "version" "6.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: - "p-locate" "^5.0.0" + p-locate "^5.0.0" -"lodash-es@^4.17.21": - "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - "resolved" "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" - "version" "4.17.21" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -"lodash.debounce@^4.0.8": - "integrity" "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - "resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - "version" "4.0.8" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -"lodash.memoize@^4.1.2": - "integrity" "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - "version" "4.1.2" +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -"lodash.merge@^4.6.2": - "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - "version" "4.6.2" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -"lodash.sortby@^4.7.0": - "integrity" "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - "resolved" "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" - "version" "4.7.0" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -"lodash.throttle@^4.1.1": - "integrity" "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - "resolved" "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz" - "version" "4.1.1" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -"lodash@^4.17.20", "lodash@^4.17.21", "lodash@^4.17.4": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" +lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.4.0": - "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" - "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - "version" "1.4.0" +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - "js-tokens" "^3.0.0 || ^4.0.0" + js-tokens "^3.0.0 || ^4.0.0" -"lower-case@^2.0.2": - "integrity" "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==" - "resolved" "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - "version" "2.0.2" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: - "tslib" "^2.0.3" + tslib "^2.0.3" -"lru-cache@^5.1.1": - "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - "version" "5.1.1" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - "yallist" "^3.0.2" + yallist "^3.0.2" -"lru-cache@^6.0.0": - "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - "version" "6.0.0" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - "yallist" "^4.0.0" + yallist "^4.0.0" -"magic-string@^0.25.0", "magic-string@^0.25.7": - "integrity" "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==" - "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" - "version" "0.25.7" +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== dependencies: - "sourcemap-codec" "^1.4.4" + sourcemap-codec "^1.4.4" -"merge-stream@^2.0.0": - "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - "version" "2.0.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -"merge2@^1.3.0", "merge2@^1.4.1": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -"micromatch@^4.0.4": - "integrity" "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" - "version" "4.0.4" +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: - "braces" "^3.0.1" - "picomatch" "^2.2.3" + braces "^3.0.1" + picomatch "^2.2.3" -"mime-db@1.51.0": - "integrity" "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" - "version" "1.51.0" +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== -"mime-types@^2.1.12": - "integrity" "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" - "version" "2.1.34" +mime-types@^2.1.12: + version "2.1.34" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - "mime-db" "1.51.0" + mime-db "1.51.0" -"minimatch@^3.0.4", "minimatch@^3.0.5", "minimatch@^3.1.2": - "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - "version" "3.1.2" +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - "brace-expansion" "^1.1.7" + brace-expansion "^1.1.7" -"minimist@^1.2.0", "minimist@^1.2.6": - "integrity" "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" - "version" "1.2.7" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -"ms@^2.1.1", "ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -"nanoclone@^0.2.1": - "integrity" "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" - "resolved" "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" - "version" "0.2.1" +nanoclone@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" + integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== -"nanoid@^3.3.4": - "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" - "version" "3.3.4" +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -"natural-compare-lite@^1.4.0": - "integrity" "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - "resolved" "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" - "version" "1.4.0" +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== -"natural-compare@^1.4.0": - "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - "version" "1.4.0" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -"no-case@^3.0.4": - "integrity" "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==" - "resolved" "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - "version" "3.0.4" +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: - "lower-case" "^2.0.2" - "tslib" "^2.0.3" + lower-case "^2.0.2" + tslib "^2.0.3" -"node-releases@^2.0.12": - "integrity" "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" - "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - "version" "2.0.13" +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== -"notistack@^3.0.1": - "integrity" "sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA==" - "resolved" "https://registry.npmjs.org/notistack/-/notistack-3.0.1.tgz" - "version" "3.0.1" +notistack@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/notistack/-/notistack-3.0.1.tgz" + integrity sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA== dependencies: - "clsx" "^1.1.0" - "goober" "^2.0.33" + clsx "^1.1.0" + goober "^2.0.33" -"nprogress@^0.2.0": - "integrity" "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" - "resolved" "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" - "version" "0.2.0" +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= -"numeral@^2.0.6": - "integrity" "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==" - "resolved" "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz" - "version" "2.0.6" +numeral@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz" + integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== -"object-assign@^3.0.0": - "integrity" "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz" - "version" "3.0.0" +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz" + integrity sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ== -"object-assign@^4.1.1": - "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - "version" "4.1.1" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -"object-inspect@^1.12.2", "object-inspect@^1.9.0": - "integrity" "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" - "version" "1.12.2" +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -"object-is@^1.0.1": - "integrity" "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==" - "resolved" "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" - "version" "1.1.5" +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" + call-bind "^1.0.2" + define-properties "^1.1.3" -"object-keys@^1.1.1": - "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - "version" "1.1.1" +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -"object.assign@^4.1.0", "object.assign@^4.1.2", "object.assign@^4.1.4": - "integrity" "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==" - "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - "version" "4.1.4" +object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "has-symbols" "^1.0.3" - "object-keys" "^1.1.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" -"object.entries@^1.1.5", "object.entries@^1.1.6": - "integrity" "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==" - "resolved" "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" - "version" "1.1.6" +object.entries@^1.1.5, object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" -"object.fromentries@^2.0.6": - "integrity" "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==" - "resolved" "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" - "version" "2.0.6" +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" -"object.hasown@^1.1.2": - "integrity" "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==" - "resolved" "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" - "version" "1.1.2" +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" + define-properties "^1.1.4" + es-abstract "^1.20.4" -"object.values@^1.1.6": - "integrity" "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==" - "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" - "version" "1.1.6" +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" -"once@^1.3.0": - "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: - "wrappy" "1" + wrappy "1" -"optionator@^0.9.3": - "integrity" "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==" - "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" - "version" "0.9.3" +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: "@aashutoshrathi/word-wrap" "^1.2.3" - "deep-is" "^0.1.3" - "fast-levenshtein" "^2.0.6" - "levn" "^0.4.1" - "prelude-ls" "^1.2.1" - "type-check" "^0.4.0" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" -"p-limit@^3.0.2": - "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - "version" "3.1.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - "yocto-queue" "^0.1.0" + yocto-queue "^0.1.0" -"p-locate@^5.0.0": - "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - "version" "5.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - "p-limit" "^3.0.2" + p-limit "^3.0.2" -"param-case@^3.0.4": - "integrity" "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==" - "resolved" "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" - "version" "3.0.4" +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: - "dot-case" "^3.0.4" - "tslib" "^2.0.3" + dot-case "^3.0.4" + tslib "^2.0.3" -"parchment@^1.1.2", "parchment@^1.1.4": - "integrity" "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" - "resolved" "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz" - "version" "1.1.4" +parchment@^1.1.2, parchment@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz" + integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg== -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - "callsites" "^3.0.0" + callsites "^3.0.0" -"parse-json@^5.0.0": - "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - "version" "5.2.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" - "error-ex" "^1.3.1" - "json-parse-even-better-errors" "^2.3.0" - "lines-and-columns" "^1.1.6" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" -"pascal-case@^3.1.2": - "integrity" "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==" - "resolved" "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" - "version" "3.1.2" +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: - "no-case" "^3.0.4" - "tslib" "^2.0.3" + no-case "^3.0.4" + tslib "^2.0.3" -"path-case@^3.0.4": - "integrity" "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==" - "resolved" "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz" - "version" "3.0.4" +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== dependencies: - "dot-case" "^3.0.4" - "tslib" "^2.0.3" + dot-case "^3.0.4" + tslib "^2.0.3" -"path-exists@^4.0.0": - "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - "version" "4.0.0" +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -"path-is-absolute@^1.0.0": - "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -"path-key@^3.1.0": - "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - "version" "3.1.1" +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -"path-parse@^1.0.7": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -"path-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -"picocolors@^1.0.0": - "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - "version" "1.0.0" +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -"picomatch@^2.2.2", "picomatch@^2.2.3", "picomatch@^2.3.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" +picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -"pnpm@^8.6.9": - "integrity" "sha512-LPEaCGvlV4dVGeJeHqi/pCR/SETooqmScv2wcr0gTqGUebpkt1w9TIEX0awLMhLO29p7pcXfz5ZO59B70Tnc0w==" - "resolved" "https://registry.npmjs.org/pnpm/-/pnpm-8.6.9.tgz" - "version" "8.6.9" +pnpm@^8.6.9: + version "8.6.9" + resolved "https://registry.npmjs.org/pnpm/-/pnpm-8.6.9.tgz" + integrity sha512-LPEaCGvlV4dVGeJeHqi/pCR/SETooqmScv2wcr0gTqGUebpkt1w9TIEX0awLMhLO29p7pcXfz5ZO59B70Tnc0w== -"popmotion@11.0.3": - "integrity" "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==" - "resolved" "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" - "version" "11.0.3" +popmotion@11.0.3: + version "11.0.3" + resolved "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" + integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== dependencies: - "framesync" "6.0.1" - "hey-listen" "^1.0.8" - "style-value-types" "5.0.0" - "tslib" "^2.1.0" + framesync "6.0.1" + hey-listen "^1.0.8" + style-value-types "5.0.0" + tslib "^2.1.0" -"postcss@^8.4.18": - "integrity" "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz" - "version" "8.4.18" +postcss@^8.4.18: + version "8.4.18" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz" + integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== dependencies: - "nanoid" "^3.3.4" - "picocolors" "^1.0.0" - "source-map-js" "^1.0.2" + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" -"prelude-ls@^1.2.1": - "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - "version" "1.2.1" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -"prettier-linter-helpers@^1.0.0": - "integrity" "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==" - "resolved" "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" - "version" "1.0.0" +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: - "fast-diff" "^1.1.2" + fast-diff "^1.1.2" -"prettier@^2.8.6", "prettier@>=2.0.0": - "integrity" "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - "version" "2.8.8" +prettier@^2.8.6, prettier@>=2.0.0: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -"pretty-bytes@^5.3.0": - "integrity" "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" - "resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" - "version" "5.6.0" +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -"pretty-bytes@^6.0.0": - "integrity" "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==" - "resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz" - "version" "6.0.0" +pretty-bytes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz" + integrity sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg== -"prop-types@^15.5.7", "prop-types@^15.6.1", "prop-types@^15.6.2", "prop-types@^15.7.2", "prop-types@^15.8.1": - "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==" - "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - "version" "15.8.1" +prop-types@^15.5.7, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: - "loose-envify" "^1.4.0" - "object-assign" "^4.1.1" - "react-is" "^16.13.1" + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" -"property-expr@^2.0.4": - "integrity" "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" - "resolved" "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz" - "version" "2.0.5" +property-expr@^2.0.4: + version "2.0.5" + resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz" + integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== -"punycode@^2.1.0": - "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - "version" "2.1.1" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -"pusher-js@^8.0.2": - "integrity" "sha512-6GohP06WlVeomAQQe9qWh1IDzd3+InluWt+ZUOcecVK1SEQkg6a8uYVsvxSJm7cbccfmHhE0jDkmhKIhue8vmA==" - "resolved" "https://registry.npmjs.org/pusher-js/-/pusher-js-8.3.0.tgz" - "version" "8.3.0" +pusher-js@^8.0.2: + version "8.3.0" + resolved "https://registry.npmjs.org/pusher-js/-/pusher-js-8.3.0.tgz" + integrity sha512-6GohP06WlVeomAQQe9qWh1IDzd3+InluWt+ZUOcecVK1SEQkg6a8uYVsvxSJm7cbccfmHhE0jDkmhKIhue8vmA== dependencies: - "tweetnacl" "^1.0.3" + tweetnacl "^1.0.3" -"queue-microtask@^1.2.2": - "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - "version" "1.2.3" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -"quill-delta@^3.6.2": - "integrity" "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==" - "resolved" "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz" - "version" "3.6.3" +quill-delta@^3.6.2: + version "3.6.3" + resolved "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz" + integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg== dependencies: - "deep-equal" "^1.0.1" - "extend" "^3.0.2" - "fast-diff" "1.1.2" + deep-equal "^1.0.1" + extend "^3.0.2" + fast-diff "1.1.2" -"quill@^1.3.7": - "integrity" "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==" - "resolved" "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz" - "version" "1.3.7" +quill@^1.3.7: + version "1.3.7" + resolved "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz" + integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g== dependencies: - "clone" "^2.1.1" - "deep-equal" "^1.0.1" - "eventemitter3" "^2.0.3" - "extend" "^3.0.2" - "parchment" "^1.1.4" - "quill-delta" "^3.6.2" + clone "^2.1.1" + deep-equal "^1.0.1" + eventemitter3 "^2.0.3" + extend "^3.0.2" + parchment "^1.1.4" + quill-delta "^3.6.2" -"randombytes@^2.1.0": - "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" - "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - "version" "2.1.0" +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: - "safe-buffer" "^5.1.0" + safe-buffer "^5.1.0" -"react-apexcharts@^1.4.0": - "integrity" "sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q==" - "resolved" "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz" - "version" "1.4.0" +react-apexcharts@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz" + integrity sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q== dependencies: - "prop-types" "^15.5.7" + prop-types "^15.5.7" -"react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react-dom@^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", "react-dom@^16 || ^17", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^17.0.2", "react-dom@^17.0.2 || ^18.0.0", "react-dom@>=16.6.0", "react-dom@>=16.8", "react-dom@>=16.8 || ^17.0.0 || ^18.0.0": - "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" - "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - "version" "17.0.2" +"react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react-dom@^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", "react-dom@^16 || ^17", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^17.0.2, "react-dom@^17.0.2 || ^18.0.0", react-dom@>=16.6.0, react-dom@>=16.8, "react-dom@>=16.8 || ^17.0.0 || ^18.0.0": + version "17.0.2" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" - "scheduler" "^0.20.2" + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" -"react-dropzone@^14.2.3": - "integrity" "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==" - "resolved" "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz" - "version" "14.2.3" +react-dropzone@^14.2.3: + version "14.2.3" + resolved "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz" + integrity sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug== dependencies: - "attr-accept" "^2.2.2" - "file-selector" "^0.6.0" - "prop-types" "^15.8.1" + attr-accept "^2.2.2" + file-selector "^0.6.0" + prop-types "^15.8.1" -"react-fast-compare@^3.2.0": - "integrity" "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - "resolved" "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" - "version" "3.2.0" +react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -"react-helmet-async@^1.3.0": - "integrity" "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==" - "resolved" "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" - "version" "1.3.0" +react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== dependencies: "@babel/runtime" "^7.12.5" - "invariant" "^2.2.4" - "prop-types" "^15.7.2" - "react-fast-compare" "^3.2.0" - "shallowequal" "^1.1.0" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" -"react-hook-form@^7.0.0", "react-hook-form@^7.43.7": - "integrity" "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==" - "resolved" "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz" - "version" "7.45.2" +react-hook-form@^7.0.0, react-hook-form@^7.43.7: + version "7.45.2" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz" + integrity sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A== -"react-intersection-observer@^8.34.0": - "integrity" "sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw==" - "resolved" "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz" - "version" "8.34.0" +react-intersection-observer@^8.34.0: + version "8.34.0" + resolved "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz" + integrity sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw== -"react-is@^16.13.1": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-is@^16.7.0": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" +react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-is@^17.0.2": - "integrity" "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - "version" "17.0.2" +react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -"react-is@^18.2.0": - "integrity" "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - "version" "18.2.0" +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -"react-lazy-load-image-component@^1.5.6": - "integrity" "sha512-8KFkDTgjh+0+PVbH+cx0AgxLGbdTsxWMnxXzU5HEUztqewk9ufQAu8cstjZhyvtMIPsdMcPZfA0WAa7HtjQbBQ==" - "resolved" "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz" - "version" "1.6.0" +react-lazy-load-image-component@^1.5.6: + version "1.6.0" + resolved "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz" + integrity sha512-8KFkDTgjh+0+PVbH+cx0AgxLGbdTsxWMnxXzU5HEUztqewk9ufQAu8cstjZhyvtMIPsdMcPZfA0WAa7HtjQbBQ== dependencies: - "lodash.debounce" "^4.0.8" - "lodash.throttle" "^4.1.1" + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" -"react-number-format@^5.1.4": - "integrity" "sha512-wCh64Z1HCwXcO2dbgkeYIaB+Rmp/fcsH8kAeRtUkc46dv1pIrgDjie2WkOqKBw8YqyqhwNdYgNFNQuuY+iGJ/g==" - "resolved" "https://registry.npmjs.org/react-number-format/-/react-number-format-5.2.2.tgz" - "version" "5.2.2" +react-number-format@^5.1.4: + version "5.2.2" + resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-5.2.2.tgz" + integrity sha512-wCh64Z1HCwXcO2dbgkeYIaB+Rmp/fcsH8kAeRtUkc46dv1pIrgDjie2WkOqKBw8YqyqhwNdYgNFNQuuY+iGJ/g== dependencies: - "prop-types" "^15.7.2" + prop-types "^15.7.2" -"react-quill@2.0.0-beta.4": - "integrity" "sha512-KyAHvAlPjP4xLElKZJefMth91Z6FbbXRvq9OSu6xN3KBaoasLP9p+3dcxg4Ywr4tBlpMGXcPszYSAgd5CpJ45Q==" - "resolved" "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0-beta.4.tgz" - "version" "2.0.0-beta.4" +react-quill@2.0.0-beta.4: + version "2.0.0-beta.4" + resolved "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0-beta.4.tgz" + integrity sha512-KyAHvAlPjP4xLElKZJefMth91Z6FbbXRvq9OSu6xN3KBaoasLP9p+3dcxg4Ywr4tBlpMGXcPszYSAgd5CpJ45Q== dependencies: "@types/quill" "^1.3.10" - "lodash" "^4.17.4" - "quill" "^1.3.7" + lodash "^4.17.4" + quill "^1.3.7" -"react-refresh@^0.13.0": - "integrity" "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==" - "resolved" "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz" - "version" "0.13.0" +react-refresh@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz" + integrity sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg== -"react-router-dom@^6.9.0": - "integrity" "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==" - "resolved" "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz" - "version" "6.14.2" +react-router-dom@^6.9.0: + version "6.14.2" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz" + integrity sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg== dependencies: "@remix-run/router" "1.7.2" - "react-router" "6.14.2" + react-router "6.14.2" -"react-router@^6.9.0", "react-router@6.14.2": - "integrity" "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==" - "resolved" "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz" - "version" "6.14.2" +react-router@^6.9.0, react-router@6.14.2: + version "6.14.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz" + integrity sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ== dependencies: "@remix-run/router" "1.7.2" -"react-transition-group@^4.4.2", "react-transition-group@^4.4.5": - "integrity" "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==" - "resolved" "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" - "version" "4.4.5" +react-transition-group@^4.4.2, react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" - "dom-helpers" "^5.0.1" - "loose-envify" "^1.4.0" - "prop-types" "^15.6.2" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" -"react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0", "react@^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", "react@^16 || ^17", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0", "react@^17.0.2", "react@^17.0.2 || ^18.0.0", "react@>= 16.8 || 18.0.0", "react@>=0.13", "react@>=16", "react@>=16.6.0", "react@>=16.8", "react@>=16.8 || ^17.0.0 || ^18.0.0", "react@>=16.8.0", "react@17.0.2": - "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==" - "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - "version" "17.0.2" +"react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0", "react@^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", "react@^16 || ^17", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0", react@^17.0.2, "react@^17.0.2 || ^18.0.0", "react@>= 16.8 || 18.0.0", react@>=0.13, react@>=16, react@>=16.6.0, react@>=16.8, "react@>=16.8 || ^17.0.0 || ^18.0.0", react@>=16.8.0, react@17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" + loose-envify "^1.1.0" + object-assign "^4.1.1" -"regenerate-unicode-properties@^10.0.1": - "integrity" "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==" - "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz" - "version" "10.0.1" +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== dependencies: - "regenerate" "^1.4.2" + regenerate "^1.4.2" -"regenerate@^1.4.2": - "integrity" "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - "resolved" "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - "version" "1.4.2" +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -"regenerator-runtime@^0.13.11", "regenerator-runtime@^0.13.4": - "integrity" "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - "version" "0.13.11" +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -"regenerator-transform@^0.14.2": - "integrity" "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==" - "resolved" "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" - "version" "0.14.5" +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" -"regexp.prototype.flags@^1.2.0", "regexp.prototype.flags@^1.4.3": - "integrity" "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==" - "resolved" "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" - "version" "1.4.3" +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.3" - "functions-have-names" "^1.2.2" + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" -"regexpu-core@^5.0.1": - "integrity" "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==" - "resolved" "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz" - "version" "5.0.1" +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== dependencies: - "regenerate" "^1.4.2" - "regenerate-unicode-properties" "^10.0.1" - "regjsgen" "^0.6.0" - "regjsparser" "^0.8.2" - "unicode-match-property-ecmascript" "^2.0.0" - "unicode-match-property-value-ecmascript" "^2.0.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" -"regjsgen@^0.6.0": - "integrity" "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" - "resolved" "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz" - "version" "0.6.0" +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== -"regjsparser@^0.8.2": - "integrity" "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==" - "resolved" "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz" - "version" "0.8.4" +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== dependencies: - "jsesc" "~0.5.0" + jsesc "~0.5.0" -"require-from-string@^2.0.2": - "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - "version" "2.0.2" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -"reselect@^4.1.6": - "integrity" "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" - "resolved" "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" - "version" "4.1.7" +reselect@^4.1.6: + version "4.1.7" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" + integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -"resolve@^1.14.2", "resolve@^1.19.0", "resolve@^1.22.0", "resolve@^1.22.1": - "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - "version" "1.22.1" +resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - "is-core-module" "^2.9.0" - "path-parse" "^1.0.7" - "supports-preserve-symlinks-flag" "^1.0.0" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -"resolve@^2.0.0-next.4": - "integrity" "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" - "version" "2.0.0-next.4" +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - "is-core-module" "^2.9.0" - "path-parse" "^1.0.7" - "supports-preserve-symlinks-flag" "^1.0.0" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -"rifm@^0.12.1": - "integrity" "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==" - "resolved" "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz" - "version" "0.12.1" +rifm@^0.12.1: + version "0.12.1" + resolved "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz" + integrity sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg== -"rimraf@^3.0.2": - "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - "version" "3.0.2" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: - "glob" "^7.1.3" + glob "^7.1.3" -"rollup-plugin-terser@^7.0.0": - "integrity" "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==" - "resolved" "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" - "version" "7.0.2" +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== dependencies: "@babel/code-frame" "^7.10.4" - "jest-worker" "^26.2.1" - "serialize-javascript" "^4.0.0" - "terser" "^5.0.0" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" -"rollup@^1.20.0 || ^2.0.0", "rollup@^1.20.0||^2.0.0", "rollup@^1.20.0||^2.0.0||^3.0.0", "rollup@^2.0.0", "rollup@^2.43.1", "rollup@^2.75.7", "rollup@^2.79.1": - "integrity" "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==" - "resolved" "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" - "version" "2.79.1" +"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^1.20.0||^2.0.0||^3.0.0, rollup@^2.0.0, rollup@^2.43.1, rollup@^2.75.7, rollup@^2.79.1: + version "2.79.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== optionalDependencies: - "fsevents" "~2.3.2" + fsevents "~2.3.2" -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - "queue-microtask" "^1.2.2" + queue-microtask "^1.2.2" -"safe-buffer@^5.1.0", "safe-buffer@~5.1.1": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" +safe-buffer@^5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safe-regex-test@^1.0.0": - "integrity" "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==" - "resolved" "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" - "version" "1.0.0" +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: - "call-bind" "^1.0.2" - "get-intrinsic" "^1.1.3" - "is-regex" "^1.1.4" + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" -"scheduler@^0.20.2": - "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==" - "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - "version" "0.20.2" +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: - "loose-envify" "^1.1.0" - "object-assign" "^4.1.1" + loose-envify "^1.1.0" + object-assign "^4.1.1" -"semver@^6.1.1", "semver@^6.1.2", "semver@^6.3.0": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -"semver@^6.3.1": - "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - "version" "6.3.1" +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -"semver@^7.3.5": - "integrity" "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - "version" "7.3.5" +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: - "lru-cache" "^6.0.0" + lru-cache "^6.0.0" -"semver@^7.3.7": - "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - "version" "7.5.4" +semver@^7.3.7: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: - "lru-cache" "^6.0.0" + lru-cache "^6.0.0" -"semver@7.0.0": - "integrity" "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" - "version" "7.0.0" +semver@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -"sentence-case@^3.0.4": - "integrity" "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==" - "resolved" "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz" - "version" "3.0.4" +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== dependencies: - "no-case" "^3.0.4" - "tslib" "^2.0.3" - "upper-case-first" "^2.0.2" + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" -"serialize-javascript@^4.0.0": - "integrity" "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==" - "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" - "version" "4.0.0" +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: - "randombytes" "^2.1.0" + randombytes "^2.1.0" -"shallowequal@^1.1.0": - "integrity" "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - "resolved" "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" - "version" "1.1.0" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -"shebang-command@^2.0.0": - "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" - "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - "version" "2.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - "shebang-regex" "^3.0.0" + shebang-regex "^3.0.0" -"shebang-regex@^3.0.0": - "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - "version" "3.0.0" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -"side-channel@^1.0.4": - "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" - "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - "version" "1.0.4" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - "call-bind" "^1.0.0" - "get-intrinsic" "^1.0.2" - "object-inspect" "^1.9.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" -"simplebar-react@^2.4.3": - "integrity" "sha512-Ep8gqAUZAS5IC2lT5RE4t1ZFUIVACqbrSRQvFV9a6NbVUzXzOMnc4P82Hl8Ak77AnPQvmgUwZS7aUKLyBoMAcg==" - "resolved" "https://registry.npmjs.org/simplebar-react/-/simplebar-react-2.4.3.tgz" - "version" "2.4.3" +simplebar-react@^2.4.3: + version "2.4.3" + resolved "https://registry.npmjs.org/simplebar-react/-/simplebar-react-2.4.3.tgz" + integrity sha512-Ep8gqAUZAS5IC2lT5RE4t1ZFUIVACqbrSRQvFV9a6NbVUzXzOMnc4P82Hl8Ak77AnPQvmgUwZS7aUKLyBoMAcg== dependencies: - "prop-types" "^15.6.1" - "simplebar" "^5.3.9" + prop-types "^15.6.1" + simplebar "^5.3.9" -"simplebar@^5.3.9": - "integrity" "sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag==" - "resolved" "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz" - "version" "5.3.9" +simplebar@^5.3.9: + version "5.3.9" + resolved "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz" + integrity sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag== dependencies: "@juggle/resize-observer" "^3.3.1" - "can-use-dom" "^0.1.0" - "core-js" "^3.0.1" - "lodash.debounce" "^4.0.8" - "lodash.memoize" "^4.1.2" - "lodash.throttle" "^4.1.1" + can-use-dom "^0.1.0" + core-js "^3.0.1" + lodash.debounce "^4.0.8" + lodash.memoize "^4.1.2" + lodash.throttle "^4.1.1" -"slash@^3.0.0": - "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - "version" "3.0.0" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -"snake-case@^3.0.4": - "integrity" "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==" - "resolved" "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" - "version" "3.0.4" +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== dependencies: - "dot-case" "^3.0.4" - "tslib" "^2.0.3" + dot-case "^3.0.4" + tslib "^2.0.3" -"source-map-js@^1.0.2": - "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - "version" "1.0.2" +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -"source-map-support@~0.5.20": - "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - "version" "0.5.21" +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: - "buffer-from" "^1.0.0" - "source-map" "^0.6.0" + buffer-from "^1.0.0" + source-map "^0.6.0" -"source-map@^0.5.7": - "integrity" "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - "version" "0.5.7" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -"source-map@^0.6.0": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -"source-map@^0.8.0-beta.0": - "integrity" "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" - "version" "0.8.0-beta.0" +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== dependencies: - "whatwg-url" "^7.0.0" + whatwg-url "^7.0.0" -"source-map@~0.7.2": - "integrity" "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" - "version" "0.7.3" +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -"sourcemap-codec@^1.4.4": - "integrity" "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - "resolved" "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" - "version" "1.4.8" +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -"string-natural-compare@^3.0.1": - "integrity" "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - "resolved" "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" - "version" "3.0.1" +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string.prototype.matchall@^4.0.6", "string.prototype.matchall@^4.0.8": - "integrity" "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==" - "resolved" "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" - "version" "4.0.8" +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - "get-intrinsic" "^1.1.3" - "has-symbols" "^1.0.3" - "internal-slot" "^1.0.3" - "regexp.prototype.flags" "^1.4.3" - "side-channel" "^1.0.4" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" -"string.prototype.trimend@^1.0.5": - "integrity" "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==" - "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" - "version" "1.0.5" +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.19.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" -"string.prototype.trimstart@^1.0.5": - "integrity" "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==" - "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" - "version" "1.0.5" +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.19.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" -"stringify-object@^3.3.0": - "integrity" "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==" - "resolved" "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" - "version" "3.3.0" +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: - "get-own-enumerable-property-symbols" "^3.0.0" - "is-obj" "^1.0.1" - "is-regexp" "^1.0.0" + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" -"strip-ansi@^6.0.1": - "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - "version" "6.0.1" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - "ansi-regex" "^5.0.1" + ansi-regex "^5.0.1" -"strip-bom@^3.0.0": - "integrity" "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - "version" "3.0.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -"strip-comments@^2.0.1": - "integrity" "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" - "resolved" "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz" - "version" "2.0.1" +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== -"strip-json-comments@^3.1.1": - "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - "version" "3.1.1" +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -"style-value-types@5.0.0": - "integrity" "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==" - "resolved" "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz" - "version" "5.0.0" +style-value-types@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz" + integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA== dependencies: - "hey-listen" "^1.0.8" - "tslib" "^2.1.0" + hey-listen "^1.0.8" + tslib "^2.1.0" -"stylis-plugin-rtl@^2.1.1": - "integrity" "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==" - "resolved" "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz" - "version" "2.1.1" +stylis-plugin-rtl@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz" + integrity sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg== dependencies: - "cssjanus" "^2.0.1" + cssjanus "^2.0.1" -"stylis@^4.1.3", "stylis@4.2.0", "stylis@4.x": - "integrity" "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" - "version" "4.2.0" +stylis@^4.1.3, stylis@4.2.0, stylis@4.x: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - "has-flag" "^3.0.0" + has-flag "^3.0.0" -"supports-color@^7.0.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - "has-flag" "^4.0.0" + has-flag "^4.0.0" -"supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - "has-flag" "^4.0.0" + has-flag "^4.0.0" -"supports-preserve-symlinks-flag@^1.0.0": - "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - "version" "1.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -"svg-parser@^2.0.4": - "integrity" "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - "resolved" "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" - "version" "2.0.4" +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -"svg.draggable.js@^2.2.2": - "integrity" "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==" - "resolved" "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz" - "version" "2.2.2" +svg.draggable.js@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz" + integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== dependencies: - "svg.js" "^2.0.1" + svg.js "^2.0.1" -"svg.easing.js@^2.0.0": - "integrity" "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==" - "resolved" "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz" - "version" "2.0.0" +svg.easing.js@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz" + integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== dependencies: - "svg.js" ">=2.3.x" + svg.js ">=2.3.x" -"svg.filter.js@^2.0.2": - "integrity" "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==" - "resolved" "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz" - "version" "2.0.2" +svg.filter.js@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz" + integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== dependencies: - "svg.js" "^2.2.5" + svg.js "^2.2.5" -"svg.js@^2.0.1", "svg.js@^2.2.5", "svg.js@^2.4.0", "svg.js@^2.6.5", "svg.js@>=2.3.x": - "integrity" "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" - "resolved" "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" - "version" "2.7.1" +svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5, svg.js@>=2.3.x: + version "2.7.1" + resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" + integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== -"svg.pathmorphing.js@^0.1.3": - "integrity" "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==" - "resolved" "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz" - "version" "0.1.3" +svg.pathmorphing.js@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz" + integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== dependencies: - "svg.js" "^2.4.0" + svg.js "^2.4.0" -"svg.resize.js@^1.4.3": - "integrity" "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==" - "resolved" "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz" - "version" "1.4.3" +svg.resize.js@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz" + integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== dependencies: - "svg.js" "^2.6.5" - "svg.select.js" "^2.1.2" + svg.js "^2.6.5" + svg.select.js "^2.1.2" -"svg.select.js@^2.1.2": - "integrity" "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==" - "resolved" "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz" - "version" "2.1.2" +svg.select.js@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz" + integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== dependencies: - "svg.js" "^2.2.5" + svg.js "^2.2.5" -"svg.select.js@^3.0.1": - "integrity" "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==" - "resolved" "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz" - "version" "3.0.1" +svg.select.js@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz" + integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== dependencies: - "svg.js" "^2.6.5" + svg.js "^2.6.5" -"temp-dir@^2.0.0": - "integrity" "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" - "resolved" "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" - "version" "2.0.0" +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -"tempy@^0.6.0": - "integrity" "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==" - "resolved" "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" - "version" "0.6.0" +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== dependencies: - "is-stream" "^2.0.0" - "temp-dir" "^2.0.0" - "type-fest" "^0.16.0" - "unique-string" "^2.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" -"terser@^5.0.0", "terser@^5.4.0": - "integrity" "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==" - "resolved" "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz" - "version" "5.11.0" +terser@^5.0.0, terser@^5.4.0: + version "5.11.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz" + integrity sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A== dependencies: - "acorn" "^8.5.0" - "commander" "^2.20.0" - "source-map" "~0.7.2" - "source-map-support" "~0.5.20" + acorn "^8.5.0" + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" -"text-table@^0.2.0": - "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - "version" "0.2.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -"to-fast-properties@^2.0.0": - "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - "version" "2.0.0" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - "is-number" "^7.0.0" + is-number "^7.0.0" -"toposort@^2.0.2": - "integrity" "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" - "resolved" "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" - "version" "2.0.2" +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== -"tr46@^1.0.1": - "integrity" "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==" - "resolved" "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" - "version" "1.0.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== dependencies: - "punycode" "^2.1.0" + punycode "^2.1.0" -"tsconfig-paths@^3.14.1": - "integrity" "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==" - "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" - "version" "3.14.1" +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" - "json5" "^1.0.1" - "minimist" "^1.2.6" - "strip-bom" "^3.0.0" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" -"tslib@^1.8.1": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -"tslib@^2.0.3", "tslib@^2.1.0", "tslib@^2.3.1", "tslib@^2.4.0": - "integrity" "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" - "version" "2.4.1" +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== -"tsutils@^3.21.0": - "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" - "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - "version" "3.21.0" +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: - "tslib" "^1.8.1" + tslib "^1.8.1" -"tweetnacl@^1.0.3": - "integrity" "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" - "version" "1.0.3" +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== -"type-check@^0.4.0", "type-check@~0.4.0": - "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" - "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - "version" "0.4.0" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - "prelude-ls" "^1.2.1" + prelude-ls "^1.2.1" -"type-fest@^0.16.0": - "integrity" "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" - "version" "0.16.0" +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== -"type-fest@^0.20.2": - "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - "version" "0.20.2" +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -"typescript@^4.9.5", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": - "integrity" "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" - "version" "4.9.5" +typescript@^4.9.5, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -"unbox-primitive@^1.0.2": - "integrity" "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==" - "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - "version" "1.0.2" +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - "call-bind" "^1.0.2" - "has-bigints" "^1.0.2" - "has-symbols" "^1.0.3" - "which-boxed-primitive" "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" -"unicode-canonical-property-names-ecmascript@^2.0.0": - "integrity" "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" - "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - "version" "2.0.0" +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -"unicode-match-property-ecmascript@^2.0.0": - "integrity" "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==" - "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - "version" "2.0.0" +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: - "unicode-canonical-property-names-ecmascript" "^2.0.0" - "unicode-property-aliases-ecmascript" "^2.0.0" + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -"unicode-match-property-value-ecmascript@^2.0.0": - "integrity" "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" - "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" - "version" "2.0.0" +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== -"unicode-property-aliases-ecmascript@^2.0.0": - "integrity" "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" - "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" - "version" "2.0.0" +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== -"unique-string@^2.0.0": - "integrity" "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==" - "resolved" "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" - "version" "2.0.0" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: - "crypto-random-string" "^2.0.0" + crypto-random-string "^2.0.0" -"universalify@^2.0.0": - "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - "resolved" "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - "version" "2.0.0" +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -"upath@^1.2.0": - "integrity" "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - "resolved" "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" - "version" "1.2.0" +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -"update-browserslist-db@^1.0.11": - "integrity" "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==" - "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - "version" "1.0.11" +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: - "escalade" "^3.1.1" - "picocolors" "^1.0.0" + escalade "^3.1.1" + picocolors "^1.0.0" -"upper-case-first@^2.0.2": - "integrity" "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==" - "resolved" "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" - "version" "2.0.2" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== dependencies: - "tslib" "^2.0.3" + tslib "^2.0.3" -"upper-case@^2.0.2": - "integrity" "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==" - "resolved" "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz" - "version" "2.0.2" +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== dependencies: - "tslib" "^2.0.3" + tslib "^2.0.3" -"uri-js@^4.2.2": - "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - "version" "4.4.1" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: - "punycode" "^2.1.0" + punycode "^2.1.0" -"vite-plugin-pwa@^0.12.8": - "integrity" "sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA==" - "resolved" "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz" - "version" "0.12.8" +vite-plugin-pwa@^0.12.8: + version "0.12.8" + resolved "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz" + integrity sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA== dependencies: - "debug" "^4.3.4" - "fast-glob" "^3.2.11" - "pretty-bytes" "^6.0.0" - "rollup" "^2.75.7" - "workbox-build" "^6.5.3" - "workbox-window" "^6.5.3" + debug "^4.3.4" + fast-glob "^3.2.11" + pretty-bytes "^6.0.0" + rollup "^2.75.7" + workbox-build "^6.5.3" + workbox-window "^6.5.3" -"vite-plugin-svgr@^2.4.0": - "integrity" "sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==" - "resolved" "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz" - "version" "2.4.0" +vite-plugin-svgr@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz" + integrity sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA== dependencies: "@rollup/pluginutils" "^5.0.2" "@svgr/core" "^6.5.1" -"vite@^2.0.0 || ^3.0.0-0", "vite@^2.6.0 || 3 || 4", "vite@^3.2.5": - "integrity" "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==" - "resolved" "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz" - "version" "3.2.7" +"vite@^2.0.0 || ^3.0.0-0", "vite@^2.6.0 || 3 || 4", vite@^3.2.5: + version "3.2.7" + resolved "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz" + integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g== dependencies: - "esbuild" "^0.15.9" - "postcss" "^8.4.18" - "resolve" "^1.22.1" - "rollup" "^2.79.1" + esbuild "^0.15.9" + postcss "^8.4.18" + resolve "^1.22.1" + rollup "^2.79.1" optionalDependencies: - "fsevents" "~2.3.2" + fsevents "~2.3.2" -"webidl-conversions@^4.0.2": - "integrity" "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" - "version" "4.0.2" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -"whatwg-url@^7.0.0": - "integrity" "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==" - "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" - "version" "7.1.0" +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: - "lodash.sortby" "^4.7.0" - "tr46" "^1.0.1" - "webidl-conversions" "^4.0.2" + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" -"which-boxed-primitive@^1.0.2": - "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==" - "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - "version" "1.0.2" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - "is-bigint" "^1.0.1" - "is-boolean-object" "^1.1.0" - "is-number-object" "^1.0.4" - "is-string" "^1.0.5" - "is-symbol" "^1.0.3" + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" -"which@^2.0.1": - "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - "version" "2.0.2" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - "isexe" "^2.0.0" + isexe "^2.0.0" -"workbox-background-sync@6.5.4": - "integrity" "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==" - "resolved" "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz" - "version" "6.5.4" +workbox-background-sync@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz" + integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== dependencies: - "idb" "^7.0.1" - "workbox-core" "6.5.4" + idb "^7.0.1" + workbox-core "6.5.4" -"workbox-broadcast-update@6.5.4": - "integrity" "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==" - "resolved" "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz" - "version" "6.5.4" +workbox-broadcast-update@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz" + integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== dependencies: - "workbox-core" "6.5.4" + workbox-core "6.5.4" -"workbox-build@^6.5.3": - "integrity" "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==" - "resolved" "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz" - "version" "6.5.4" +workbox-build@^6.5.3: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz" + integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== dependencies: "@apideck/better-ajv-errors" "^0.3.1" "@babel/core" "^7.11.1" @@ -5084,170 +5091,170 @@ "@rollup/plugin-node-resolve" "^11.2.1" "@rollup/plugin-replace" "^2.4.1" "@surma/rollup-plugin-off-main-thread" "^2.2.3" - "ajv" "^8.6.0" - "common-tags" "^1.8.0" - "fast-json-stable-stringify" "^2.1.0" - "fs-extra" "^9.0.1" - "glob" "^7.1.6" - "lodash" "^4.17.20" - "pretty-bytes" "^5.3.0" - "rollup" "^2.43.1" - "rollup-plugin-terser" "^7.0.0" - "source-map" "^0.8.0-beta.0" - "stringify-object" "^3.3.0" - "strip-comments" "^2.0.1" - "tempy" "^0.6.0" - "upath" "^1.2.0" - "workbox-background-sync" "6.5.4" - "workbox-broadcast-update" "6.5.4" - "workbox-cacheable-response" "6.5.4" - "workbox-core" "6.5.4" - "workbox-expiration" "6.5.4" - "workbox-google-analytics" "6.5.4" - "workbox-navigation-preload" "6.5.4" - "workbox-precaching" "6.5.4" - "workbox-range-requests" "6.5.4" - "workbox-recipes" "6.5.4" - "workbox-routing" "6.5.4" - "workbox-strategies" "6.5.4" - "workbox-streams" "6.5.4" - "workbox-sw" "6.5.4" - "workbox-window" "6.5.4" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.5.4" + workbox-broadcast-update "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-google-analytics "6.5.4" + workbox-navigation-preload "6.5.4" + workbox-precaching "6.5.4" + workbox-range-requests "6.5.4" + workbox-recipes "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + workbox-streams "6.5.4" + workbox-sw "6.5.4" + workbox-window "6.5.4" -"workbox-cacheable-response@6.5.4": - "integrity" "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==" - "resolved" "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz" - "version" "6.5.4" +workbox-cacheable-response@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz" + integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== dependencies: - "workbox-core" "6.5.4" + workbox-core "6.5.4" -"workbox-core@6.5.4": - "integrity" "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==" - "resolved" "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz" - "version" "6.5.4" +workbox-core@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz" + integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== -"workbox-expiration@6.5.4": - "integrity" "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==" - "resolved" "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz" - "version" "6.5.4" +workbox-expiration@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz" + integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== dependencies: - "idb" "^7.0.1" - "workbox-core" "6.5.4" + idb "^7.0.1" + workbox-core "6.5.4" -"workbox-google-analytics@6.5.4": - "integrity" "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==" - "resolved" "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz" - "version" "6.5.4" +workbox-google-analytics@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz" + integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== dependencies: - "workbox-background-sync" "6.5.4" - "workbox-core" "6.5.4" - "workbox-routing" "6.5.4" - "workbox-strategies" "6.5.4" + workbox-background-sync "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -"workbox-navigation-preload@6.5.4": - "integrity" "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==" - "resolved" "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz" - "version" "6.5.4" +workbox-navigation-preload@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz" + integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== dependencies: - "workbox-core" "6.5.4" + workbox-core "6.5.4" -"workbox-precaching@6.5.4": - "integrity" "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==" - "resolved" "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz" - "version" "6.5.4" +workbox-precaching@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz" + integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== dependencies: - "workbox-core" "6.5.4" - "workbox-routing" "6.5.4" - "workbox-strategies" "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -"workbox-range-requests@6.5.4": - "integrity" "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==" - "resolved" "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz" - "version" "6.5.4" +workbox-range-requests@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz" + integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== dependencies: - "workbox-core" "6.5.4" + workbox-core "6.5.4" -"workbox-recipes@6.5.4": - "integrity" "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==" - "resolved" "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz" - "version" "6.5.4" +workbox-recipes@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz" + integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== dependencies: - "workbox-cacheable-response" "6.5.4" - "workbox-core" "6.5.4" - "workbox-expiration" "6.5.4" - "workbox-precaching" "6.5.4" - "workbox-routing" "6.5.4" - "workbox-strategies" "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-precaching "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -"workbox-routing@6.5.4": - "integrity" "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==" - "resolved" "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz" - "version" "6.5.4" +workbox-routing@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz" + integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== dependencies: - "workbox-core" "6.5.4" + workbox-core "6.5.4" -"workbox-strategies@6.5.4": - "integrity" "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==" - "resolved" "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz" - "version" "6.5.4" +workbox-strategies@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz" + integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== dependencies: - "workbox-core" "6.5.4" + workbox-core "6.5.4" -"workbox-streams@6.5.4": - "integrity" "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==" - "resolved" "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz" - "version" "6.5.4" +workbox-streams@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz" + integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== dependencies: - "workbox-core" "6.5.4" - "workbox-routing" "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" -"workbox-sw@6.5.4": - "integrity" "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==" - "resolved" "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz" - "version" "6.5.4" +workbox-sw@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz" + integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== -"workbox-window@^6.5.3", "workbox-window@6.5.4": - "integrity" "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==" - "resolved" "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz" - "version" "6.5.4" +workbox-window@^6.5.3, workbox-window@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz" + integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== dependencies: "@types/trusted-types" "^2.0.2" - "workbox-core" "6.5.4" + workbox-core "6.5.4" -"wrappy@1": - "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -"yallist@^3.0.2": - "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - "version" "3.1.1" +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -"yallist@^4.0.0": - "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - "version" "4.0.0" +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -"yaml@^1.10.0": - "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - "version" "1.10.2" +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -"yocto-queue@^0.1.0": - "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - "version" "0.1.0" +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -"yup@^0.32.11": - "integrity" "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==" - "resolved" "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" - "version" "0.32.11" +yup@^0.32.11: + version "0.32.11" + resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" + integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== dependencies: "@babel/runtime" "^7.15.4" "@types/lodash" "^4.14.175" - "lodash" "^4.17.21" - "lodash-es" "^4.17.21" - "nanoclone" "^0.2.1" - "property-expr" "^2.0.4" - "toposort" "^2.0.2" + lodash "^4.17.21" + lodash-es "^4.17.21" + nanoclone "^0.2.1" + property-expr "^2.0.4" + toposort "^2.0.2" diff --git a/frontend/dashboard/.env.development b/frontend/dashboard/.env.development index fc501ce1..1e59ea7f 100644 --- a/frontend/dashboard/.env.development +++ b/frontend/dashboard/.env.development @@ -1,7 +1,8 @@ GENERATE_SOURCEMAP=false -PORT=8083 +PORT=8000 REACT_APP_HOST_API_URL="http://lms.test" -VITE_API_URL="http://127.0.0.1:8000/api/internal" +# VITE_API_URL="https://aso-api.linksehat.dev/api/internal" +VITE_API_URL="http://localhost:8000/api/internal" diff --git a/frontend/dashboard/package-lock.json b/frontend/dashboard/package-lock.json index b5a2c5fb..96fd2b49 100644 --- a/frontend/dashboard/package-lock.json +++ b/frontend/dashboard/package-lock.json @@ -1,14 +1,13 @@ { "name": "@minimal/material-kit-react", "version": "3.2.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@minimal/material-kit-react", "version": "3.2.0", "dependencies": { -<<<<<<< HEAD "@ajoelp/json-to-formdata": "^1.5.0", "@date-io/date-fns": "^2.16.0", "@emotion/cache": "^11.10.5", @@ -31,8 +30,6 @@ "esbuild": "^0.17.18", "framer-motion": "^6.5.1", "highlight.js": "^11.7.0", -======= -<<<<<<< HEAD "@ajoelp/json-to-formdata": "^1.5.0", "@date-io/date-fns": "^2.17.0", "@emotion/cache": "^11.11.0", @@ -46,6 +43,7 @@ "@mui/system": "^5.14.6", "@mui/x-data-grid": "^5.17.26", "@mui/x-date-pickers": "5.0.0-beta.2", + "@reduxjs/toolkit": "^1.9.6", "@vitejs/plugin-react": "^1.3.2", "apexcharts": "^3.42.0", "axios": "^0.27.2", @@ -55,10 +53,6 @@ "esbuild": "^0.17.19", "framer-motion": "^6.5.1", "highlight.js": "^11.8.0", -======= -<<<<<<< HEAD - "@ajoelp/json-to-formdata": "^1.5.0", -======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 "@date-io/date-fns": "^2.16.0", "@emotion/cache": "^11.10.5", @@ -82,6 +76,8 @@ "framer-motion": "^6.5.1", "highlight.js": "^11.7.0", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "history": "^5.3.0", "jsx-runtime": "^1.2.0", @@ -95,6 +91,7 @@ "react-dom": "^17.0.2", "react-dropzone": "^14.2.3", "react-helmet-async": "^1.3.0", +<<<<<<< HEAD <<<<<<< HEAD "react-hook-form": "^7.42.1", "react-intersection-observer": "^8.34.0", @@ -109,10 +106,13 @@ "vite": "^3.2.5", ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "react-hook-form": "^7.45.4", "react-intersection-observer": "^8.34.0", "react-lazy-load-image-component": "^1.6.0", "react-quill": "2.0.0-beta.4", + "react-redux": "^8.1.2", "react-router": "^6.15.0", "react-router-dom": "^6.15.0", "simplebar": "^5.3.9", @@ -120,6 +120,7 @@ "stylis": "^4.3.0", "stylis-plugin-rtl": "^2.1.1", "vite": "^3.2.7", +<<<<<<< HEAD ======= "react-hook-form": "^7.42.1", "react-intersection-observer": "^8.34.0", @@ -133,11 +134,15 @@ "stylis-plugin-rtl": "^2.1.1", "vite": "^3.2.5", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "vite-plugin-svgr": "^2.4.0", + "yarn": "^1.22.19", "yup": "^0.32.11" }, "devDependencies": { +<<<<<<< HEAD <<<<<<< HEAD "@babel/core": "^7.20.12", "@babel/eslint-parser": "^7.19.1", @@ -167,6 +172,8 @@ "typescript": "^4.9.4", ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "@babel/core": "^7.22.11", "@babel/eslint-parser": "^7.22.11", "@babel/plugin-syntax-flow": "^7.22.5", @@ -193,6 +200,7 @@ "eslint-plugin-react-hooks": "4.3.0", "prettier": "^2.8.8", "typescript": "^4.9.5", +<<<<<<< HEAD ======= "@babel/core": "^7.20.12", "@babel/eslint-parser": "^7.19.1", @@ -221,6 +229,8 @@ "prettier": "^2.8.3", "typescript": "^4.9.4", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "vite-plugin-pwa": "^0.12.8" } @@ -233,11 +243,14 @@ "engines": { "node": ">=0.10.0" <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging } }, @@ -248,12 +261,15 @@ "dependencies": { "lodash": "4.17.21" <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging } }, @@ -287,6 +303,7 @@ } }, "node_modules/@babel/code-frame": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", @@ -298,9 +315,15 @@ "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", +======= + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", +>>>>>>> origin/staging "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" +<<<<<<< HEAD ======= <<<<<<< HEAD "version": "7.22.5", @@ -317,6 +340,8 @@ "chalk": "^2.4.2" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging }, "engines": { @@ -332,6 +357,7 @@ } }, "node_modules/@babel/core": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", @@ -401,6 +427,26 @@ "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", >>>>>>> origin/staging "semver": "^6.3.1" }, @@ -412,18 +458,10 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/eslint-parser": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.11.tgz", - "integrity": "sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", + "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -438,16 +476,8 @@ "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", @@ -476,6 +506,13 @@ "@babel/types": "^7.22.10", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dependencies": { + "@babel/types": "^7.23.0", >>>>>>> origin/staging "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", @@ -510,6 +547,7 @@ } }, "node_modules/@babel/helper-compilation-targets": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", @@ -530,10 +568,15 @@ "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", >>>>>>> origin/staging "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -550,14 +593,6 @@ "yallist": "^3.0.2" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -620,9 +655,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } @@ -640,12 +675,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -675,26 +710,26 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -796,17 +831,17 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "engines": { "node": ">=6.9.0" } @@ -827,6 +862,7 @@ } }, "node_modules/@babel/helpers": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", @@ -863,6 +899,15 @@ "@babel/types": "^7.22.10" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" >>>>>>> origin/staging }, "engines": { @@ -870,6 +915,7 @@ } }, "node_modules/@babel/highlight": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", @@ -881,9 +927,15 @@ "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", +======= + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", +>>>>>>> origin/staging "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", +<<<<<<< HEAD ======= <<<<<<< HEAD "version": "7.22.5", @@ -902,6 +954,8 @@ "chalk": "^2.4.2", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "js-tokens": "^4.0.0" }, "engines": { @@ -909,6 +963,7 @@ } }, "node_modules/@babel/parser": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", @@ -929,6 +984,11 @@ "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", >>>>>>> origin/staging "bin": { "parser": "bin/babel-parser.js" @@ -2264,6 +2324,7 @@ } }, "node_modules/@babel/runtime": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", @@ -2292,6 +2353,13 @@ "regenerator-runtime": "^0.14.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" >>>>>>> origin/staging }, "engines": { @@ -2317,19 +2385,20 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.8", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", @@ -2383,6 +2452,20 @@ "@babel/types": "^7.22.10", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", >>>>>>> origin/staging "debug": "^4.1.0", "globals": "^11.1.0" @@ -2392,6 +2475,7 @@ } }, "node_modules/@babel/types": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", @@ -2412,10 +2496,15 @@ "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", >>>>>>> origin/staging "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2509,6 +2598,11 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/@emotion/babel-plugin/node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -2634,231 +2728,6 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-x64": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", @@ -2874,96 +2743,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2980,6 +2759,7 @@ } }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { +<<<<<<< HEAD <<<<<<< HEAD "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -3000,6 +2780,11 @@ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", >>>>>>> origin/staging "dev": true, "engines": { @@ -3010,6 +2795,7 @@ } }, "node_modules/@eslint-community/regexpp": { +<<<<<<< HEAD <<<<<<< HEAD "version": "4.6.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", @@ -3030,6 +2816,11 @@ "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", + "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", >>>>>>> origin/staging "dev": true, "engines": { @@ -3037,6 +2828,7 @@ } }, "node_modules/@eslint/eslintrc": { +<<<<<<< HEAD <<<<<<< HEAD "version": "2.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", @@ -3057,6 +2849,11 @@ "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", >>>>>>> origin/staging "dev": true, "dependencies": { @@ -3094,6 +2891,7 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { +<<<<<<< HEAD <<<<<<< HEAD "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -3108,6 +2906,11 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", >>>>>>> origin/staging "dev": true, "dependencies": { @@ -3127,6 +2930,7 @@ "dev": true }, "node_modules/@eslint/js": { +<<<<<<< HEAD <<<<<<< HEAD "version": "8.44.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", @@ -3147,6 +2951,11 @@ "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", >>>>>>> origin/staging "dev": true, "engines": { @@ -3154,28 +2963,28 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", "dependencies": { - "@floating-ui/dom": "^1.3.0" + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -3183,9 +2992,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" }, "node_modules/@hookform/resolvers": { "version": "2.9.11", @@ -3196,9 +3005,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -3268,6 +3077,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -3378,6 +3197,7 @@ } }, "node_modules/@mui/core-downloads-tracker": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.14.2", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.2.tgz", @@ -3398,6 +3218,11 @@ "integrity": "sha512-pW2XghSi3hpYKX57Wu0SCWMTSpzvXZmmucj3TcOJWaCiFt4xr05w2gcwBZi36dAp9uvd9//9N51qbblmnD+GPg==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.10.tgz", + "integrity": "sha512-kPHu/NhZq1k+vSZR5wq3AyUfD4bnfWAeuKpps0+8PS7ZHQ2Lyv1cXJh+PlFdCIOa0PK98rk3JPwMzS8BMhdHwQ==", >>>>>>> origin/staging "funding": { "type": "opencollective", @@ -3405,6 +3230,7 @@ } }, "node_modules/@mui/icons-material": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.14.1", "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.1.tgz", @@ -3431,6 +3257,13 @@ "dependencies": { "@babel/runtime": "^7.22.6" >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.9.tgz", + "integrity": "sha512-xTRQbDsogsJo7tY5Og8R9zbuG2q+KIPVIM6JQoKxtJlz9DPOw1u0T2fGrvwD+XAOVifQf6epNMcGCDLfJAz4Nw==", + "dependencies": { + "@babel/runtime": "^7.22.15" >>>>>>> origin/staging }, "engines": { @@ -3549,6 +3382,7 @@ } }, "node_modules/@mui/material": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.14.2", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.2.tgz", @@ -3562,15 +3396,21 @@ "version": "5.14.6", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.6.tgz", "integrity": "sha512-C3UgGrmtvcGkQkm0ONBU7bTdapTjQc2Se3b2354xMmU7lgSgW7VM6EP9wIH5XqqoJ60m9l/s9kbTWX0Y+EaWvA==", +======= + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.10.tgz", + "integrity": "sha512-ejFMppnO+lzBXpzju+N4SSz0Mhmi5sihXUGcr5FxpgB6bfUP0Lpe32O0Sw/3s8xlmLEvG1fqVT0rRyAVMlCA+A==", +>>>>>>> origin/staging "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/base": "5.0.0-beta.12", - "@mui/core-downloads-tracker": "^5.14.6", - "@mui/system": "^5.14.6", + "@babel/runtime": "^7.22.15", + "@mui/base": "5.0.0-beta.16", + "@mui/core-downloads-tracker": "^5.14.10", + "@mui/system": "^5.14.10", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.6", + "@mui/utils": "^5.14.10", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", +<<<<<<< HEAD ======= <<<<<<< HEAD "version": "5.14.1", @@ -3603,6 +3443,8 @@ "clsx": "^2.0.0", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "csstype": "^3.1.2", "prop-types": "^15.8.1", @@ -3636,6 +3478,7 @@ } }, "node_modules/@mui/material/node_modules/@mui/base": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.0.0-beta.8", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.8.tgz", @@ -3649,14 +3492,19 @@ "version": "5.0.0-beta.12", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.12.tgz", "integrity": "sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==", +======= + "version": "5.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.16.tgz", + "integrity": "sha512-OYxhC81c9bO0wobGcM8rrY5bRwpCXAI21BL0P2wz/2vTv4ek7ALz9+U5M8wgdmtRNUhmCmAB4L2WRwFRf5Cd8Q==", +>>>>>>> origin/staging "dependencies": { - "@babel/runtime": "^7.22.10", - "@emotion/is-prop-valid": "^1.2.1", - "@floating-ui/react-dom": "^2.0.1", + "@babel/runtime": "^7.22.15", + "@floating-ui/react-dom": "^2.0.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.6", + "@mui/utils": "^5.14.10", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", +<<<<<<< HEAD ======= <<<<<<< HEAD "version": "5.0.0-beta.8", @@ -3684,6 +3532,9 @@ >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 "prop-types": "^15.8.1", "react-is": "^18.2.0" +======= + "prop-types": "^15.8.1" +>>>>>>> origin/staging }, "engines": { "node": ">=12.0.0" @@ -3717,6 +3568,7 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/private-theming": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.13.7", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.7.tgz", @@ -3749,6 +3601,14 @@ "@mui/utils": "^5.14.4", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.10.tgz", + "integrity": "sha512-f67xOj3H06wWDT9xBg7hVL/HSKNF+HG1Kx0Pm23skkbEqD2Ef2Lif64e5nPdmWVv+7cISCYtSuE2aeuzrZe78w==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@mui/utils": "^5.14.10", >>>>>>> origin/staging "prop-types": "^15.8.1" }, @@ -3770,6 +3630,7 @@ } }, "node_modules/@mui/styled-engine": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.13.2", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", @@ -3790,6 +3651,13 @@ "dependencies": { "@babel/runtime": "^7.21.0", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.10.tgz", + "integrity": "sha512-EJckxmQHrsBvDbFu1trJkvjNw/1R7jfNarnqPSnL+jEQawCkQIqVELWLrlOa611TFtxSJGkdUfCFXeJC203HVg==", + "dependencies": { + "@babel/runtime": "^7.22.15", >>>>>>> origin/staging "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", @@ -3817,6 +3685,7 @@ } }, "node_modules/@mui/system": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.14.1", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.1.tgz", @@ -3827,13 +3696,19 @@ "version": "5.14.6", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.6.tgz", "integrity": "sha512-/n0ae1MegWjiV1BpRU8jgg4E0zBjeB2VYsT/68ag/xaDuq3/TaDKJeT9REIvyBvwlG3CI3S2O+tRELktxCD1kg==", +======= + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.10.tgz", + "integrity": "sha512-QQmtTG/R4gjmLiL5ECQ7kRxLKDm8aKKD7seGZfbINtRVJDyFhKChA1a+K2bfqIAaBo1EMDv+6FWNT1Q5cRKjFA==", +>>>>>>> origin/staging "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/private-theming": "^5.14.6", - "@mui/styled-engine": "^5.14.6", + "@babel/runtime": "^7.22.15", + "@mui/private-theming": "^5.14.10", + "@mui/styled-engine": "^5.14.10", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.6", + "@mui/utils": "^5.14.10", "clsx": "^2.0.0", +<<<<<<< HEAD ======= <<<<<<< HEAD "version": "5.14.1", @@ -3862,6 +3737,8 @@ "clsx": "^2.0.0", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -3913,6 +3790,7 @@ } }, "node_modules/@mui/utils": { +<<<<<<< HEAD <<<<<<< HEAD "version": "5.14.1", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.1.tgz", @@ -3939,9 +3817,15 @@ "dependencies": { "@babel/runtime": "^7.22.6", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.10.tgz", + "integrity": "sha512-Rn+vYQX7FxkcW0riDX/clNUwKuOJFH45HiULxwmpgnzQoQr3A0lb+QYwaZ+FAkZrR7qLoHKmLQlcItu6LT0y/Q==", + "dependencies": { + "@babel/runtime": "^7.22.15", >>>>>>> origin/staging "@types/prop-types": "^15.7.5", - "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -3953,7 +3837,13 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@mui/utils/node_modules/react-is": { @@ -4096,7 +3986,31 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.6.tgz", + "integrity": "sha512-Gc4ikl90ORF4viIdAkY06JNUnODjKfGxZRwATM30EdHq8hLSVoSrwXne5dd739yenP5bJxAX7tLuOWK5RPGtrw==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { +<<<<<<< HEAD <<<<<<< HEAD "version": "1.7.2", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", @@ -4111,6 +4025,11 @@ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", + "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", >>>>>>> origin/staging "engines": { "node": ">=14.0.0" @@ -4286,6 +4205,15 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -4299,6 +4227,7 @@ "dev": true }, "node_modules/@types/lodash": { +<<<<<<< HEAD <<<<<<< HEAD "version": "4.14.196", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", @@ -4319,6 +4248,11 @@ "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==" >>>>>>> origin/staging }, "node_modules/@types/node": { @@ -4352,6 +4286,7 @@ } }, "node_modules/@types/react": { +<<<<<<< HEAD <<<<<<< HEAD "version": "17.0.62", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", @@ -4372,6 +4307,11 @@ "integrity": "sha512-T+aaG8RlIkgJ4VzWLJYbMW9QX7sIAV8CcuyV6FU6Hm7yu3Bee1YBZQRu2vYEm/dU8kre+/mzl2aGYh5MFgVLaQ==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "17.0.65", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", + "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", >>>>>>> origin/staging "dependencies": { "@types/prop-types": "*", @@ -4383,23 +4323,15 @@ "version": "17.0.20", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, + "devOptional": true, "dependencies": { "@types/react": "^17" } }, - "node_modules/@types/react-is": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", - "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-lazy-load-image-component": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.3.tgz", - "integrity": "sha512-hTzsQQ64mmPR6W03DQr6zhzeBGn17ExnVd7sLHqTQZQVd9Oi0Dy7tfSPgK0+AZV5YNC+e8Jw7oq9kzYfDkCDCA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz", + "integrity": "sha512-KIwp3KA2o6vtX1nN80tOCnr9Knx1a+QATUw/+fv2hBnAWuC9TWtWXtgJK8tsiFnK5o1u70veqI+3z6Rt3YhhKA==", "dev": true, "dependencies": { "@types/react": "*", @@ -4435,9 +4367,9 @@ "dev": true }, "node_modules/@types/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.1.tgz", + "integrity": "sha512-OSaMrXUKxVigGlKRrET39V2xdhzlztQ9Aqumn1WbCBKHOi9ry7jKSd7rkyj0GzmWaU960Rd+LpOFpLfx5bMQAg==", "dev": true }, "node_modules/@types/trusted-types": { @@ -4446,6 +4378,11 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", "dev": true }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -4581,6 +4518,7 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { +<<<<<<< HEAD <<<<<<< HEAD "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -4601,6 +4539,11 @@ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", >>>>>>> origin/staging "dev": true, "engines": { @@ -4746,6 +4689,7 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { +<<<<<<< HEAD <<<<<<< HEAD "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -4766,6 +4710,11 @@ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", >>>>>>> origin/staging "dev": true, "engines": { @@ -4935,6 +4884,7 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { +<<<<<<< HEAD <<<<<<< HEAD "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -4955,6 +4905,11 @@ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", >>>>>>> origin/staging "dev": true, "engines": { @@ -5020,9 +4975,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5264,6 +5219,7 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD "node_modules/array.prototype.flat": { @@ -5295,8 +5251,19 @@ <<<<<<< HEAD ======= >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", +>>>>>>> origin/staging "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -5315,9 +5282,12 @@ "define-properties": "^1.1.4", "es-abstract": "^1.20.4", <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "es-shim-unscopables": "^1.0.0" }, @@ -5360,21 +5330,25 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -5387,9 +5361,12 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "node_modules/ast-types-flow": { "version": "0.0.7", @@ -5397,6 +5374,12 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -5613,6 +5596,7 @@ } }, "node_modules/browserslist": { +<<<<<<< HEAD <<<<<<< HEAD "version": "4.21.9", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", @@ -5633,6 +5617,11 @@ "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", >>>>>>> origin/staging "funding": [ { @@ -5649,6 +5638,7 @@ } ], "dependencies": { +<<<<<<< HEAD <<<<<<< HEAD "caniuse-lite": "^1.0.30001503", "electron-to-chromium": "^1.4.431", @@ -5671,6 +5661,12 @@ >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging "update-browserslist-db": "^1.0.11" +======= + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" +>>>>>>> origin/staging }, "bin": { "browserslist": "cli.js" @@ -5743,6 +5739,7 @@ "integrity": "sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=" }, "node_modules/caniuse-lite": { +<<<<<<< HEAD <<<<<<< HEAD "version": "1.0.30001517", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", @@ -5763,6 +5760,11 @@ "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "1.0.30001554", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz", + "integrity": "sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==", >>>>>>> origin/staging "funding": [ { @@ -5910,12 +5912,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/core-js": { "version": "3.21.1", @@ -5928,28 +5927,18 @@ } }, "node_modules/core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", + "integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", - "semver": "7.0.0" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { "version": "3.21.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", @@ -6065,11 +6054,25 @@ "node": ">=0.10.0" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -6131,12 +6134,12 @@ } }, "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "dependencies": { - "jake": "^10.6.1" + "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" @@ -6146,6 +6149,7 @@ } }, "node_modules/electron-to-chromium": { +<<<<<<< HEAD <<<<<<< HEAD "version": "1.4.471", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz", @@ -6166,6 +6170,11 @@ "integrity": "sha512-Dv4sTjiW7t/UWGL+H8ZkgIjtUAVZDgb/PwGWvMsCT7jipzUV/u5skbLXPFKb6iV0tiddVi/bcS2/kUrczeWgIQ==" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "1.4.568", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.568.tgz", + "integrity": "sha512-3TCOv8+BY6Ltpt1/CmGBMups2IdKOyfEmz4J8yIS4xLSeMm0Rf+psSaxLuswG9qMKt+XbNbmADybtXGpTFlbDg==" >>>>>>> origin/staging }, "node_modules/emoji-regex": { @@ -6183,18 +6192,18 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", @@ -6210,23 +6219,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -6235,16 +6244,15 @@ "url": "https://github.com/sponsors/ljharb" } }, -<<<<<<< HEAD "node_modules/es-iterator-helpers": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", - "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -6254,12 +6262,10 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, -======= ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -6336,111 +6342,6 @@ "@esbuild/win32-x64": "0.17.19" } }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-linux-64": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", @@ -6456,186 +6357,6 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6656,6 +6377,7 @@ } }, "node_modules/eslint": { +<<<<<<< HEAD <<<<<<< HEAD "version": "8.45.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", @@ -6671,11 +6393,17 @@ "version": "8.48.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", +======= + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", +>>>>>>> origin/staging "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", +<<<<<<< HEAD "@eslint/js": "8.48.0", ======= <<<<<<< HEAD @@ -6702,6 +6430,10 @@ >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging "@humanwhocodes/config-array": "^0.11.10", +======= + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", +>>>>>>> origin/staging "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -6710,6 +6442,7 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", +<<<<<<< HEAD <<<<<<< HEAD "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", @@ -6730,6 +6463,11 @@ "espree": "^9.6.1", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", >>>>>>> origin/staging "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -6819,6 +6557,7 @@ } }, "node_modules/eslint-config-prettier": { +<<<<<<< HEAD <<<<<<< HEAD "version": "8.8.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", @@ -6839,6 +6578,11 @@ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", >>>>>>> origin/staging "dev": true, "bin": { @@ -6877,6 +6621,7 @@ } }, "node_modules/eslint-import-resolver-node": { +<<<<<<< HEAD <<<<<<< HEAD "version": "0.3.7", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", @@ -6898,6 +6643,8 @@ "resolve": "^1.22.4" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "version": "0.3.7", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", @@ -6906,6 +6653,7 @@ "debug": "^3.2.7", "is-core-module": "^2.11.0", "resolve": "^1.22.1" +<<<<<<< HEAD ======= "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -6917,6 +6665,8 @@ "resolve": "^1.22.4" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging } }, @@ -6929,23 +6679,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-import-resolver-typescript": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", @@ -7011,6 +6744,7 @@ } }, "node_modules/eslint-plugin-import": { +<<<<<<< HEAD <<<<<<< HEAD "version": "2.27.5", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", @@ -7020,6 +6754,8 @@ "array-includes": "^3.1.6", ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "version": "2.28.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", @@ -7027,6 +6763,7 @@ "dependencies": { "array-includes": "^3.1.6", "array.prototype.findlastindex": "^1.2.2", +<<<<<<< HEAD ======= <<<<<<< HEAD "version": "2.27.5", @@ -7045,12 +6782,15 @@ "array.prototype.findlastindex": "^1.2.2", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", +<<<<<<< HEAD <<<<<<< HEAD "eslint-module-utils": "^2.7.4", "has": "^1.0.3", @@ -7059,6 +6799,8 @@ "minimatch": "^3.1.2", ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "eslint-module-utils": "^2.8.0", "has": "^1.0.3", "is-core-module": "^2.13.0", @@ -7069,6 +6811,7 @@ "object.values": "^1.1.6", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" +<<<<<<< HEAD ======= <<<<<<< HEAD "eslint-module-utils": "^2.7.4", @@ -7095,6 +6838,8 @@ "tsconfig-paths": "^3.14.2" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging }, "engines": { "node": ">=4" @@ -7125,6 +6870,7 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD "node_modules/eslint-plugin-import/node_modules/semver": { @@ -7165,6 +6911,8 @@ } }, >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "node_modules/eslint-plugin-jest": { "version": "25.7.0", @@ -7238,6 +6986,7 @@ } }, "node_modules/eslint-plugin-react": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.33.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz", @@ -7258,6 +7007,11 @@ "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", >>>>>>> origin/staging "dev": true, "dependencies": { @@ -7326,15 +7080,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-testing-library": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.5.tgz", @@ -7466,6 +7211,7 @@ "dev": true }, "node_modules/eslint/node_modules/eslint-scope": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.2.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", @@ -7486,6 +7232,11 @@ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", >>>>>>> origin/staging "dev": true, "dependencies": { @@ -7500,6 +7251,7 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { +<<<<<<< HEAD <<<<<<< HEAD "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -7520,6 +7272,11 @@ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", >>>>>>> origin/staging "dev": true, "engines": { @@ -7546,6 +7303,7 @@ } }, "node_modules/eslint/node_modules/globals": { +<<<<<<< HEAD <<<<<<< HEAD "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -7560,6 +7318,11 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", >>>>>>> origin/staging "dev": true, "dependencies": { @@ -7671,6 +7434,7 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { +<<<<<<< HEAD <<<<<<< HEAD "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", @@ -7691,6 +7455,11 @@ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", >>>>>>> origin/staging "dev": true, "engines": { @@ -7838,12 +7607,33 @@ } }, "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/fill-range": { @@ -7960,9 +7750,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -7978,15 +7768,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -8134,7 +7924,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -8281,6 +8070,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -8676,7 +8474,6 @@ "url": "https://github.com/sponsors/ljharb" } }, -<<<<<<< HEAD "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -8686,8 +8483,6 @@ "url": "https://github.com/sponsors/ljharb" } }, -======= ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -8700,7 +8495,6 @@ "url": "https://github.com/sponsors/ljharb" } }, -<<<<<<< HEAD "node_modules/is-weakset": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", @@ -8714,8 +8508,6 @@ "url": "https://github.com/sponsors/ljharb" } }, -======= ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -8729,42 +8521,106 @@ "dev": true }, "node_modules/iterator.prototype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", - "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "has-tostringtag": "^1.0.0", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/jake/node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9063,9 +8919,15 @@ "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -9223,14 +9085,14 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, @@ -9398,9 +9260,9 @@ } }, "node_modules/pnpm": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-8.6.12.tgz", - "integrity": "sha512-Eza4C5SO/Xl5IYozupbZ5NOA5leBRPYxmXmXfe7G4/4uCkRLhks84rB33aitxNZU/uMrnDGGjwrLktoKvPjqHA==", + "version": "8.7.6", + "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-8.7.6.tgz", + "integrity": "sha512-ZJ/LpDy+IGYpCPYo2INfnw2MopUOTHQ3HcnhbiSqVLtV5rTmsrbFHe4i35ITLpcgvIWptWbzUTZ8efDYXWpFew==", "bin": { "pnpm": "bin/pnpm.cjs", "pnpx": "bin/pnpx.cjs" @@ -9424,9 +9286,9 @@ } }, "node_modules/postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -9435,10 +9297,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -9651,6 +9517,7 @@ } }, "node_modules/react-hook-form": { +<<<<<<< HEAD <<<<<<< HEAD "version": "7.45.2", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz", @@ -9671,6 +9538,11 @@ "integrity": "sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==", >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "7.46.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.46.2.tgz", + "integrity": "sha512-x1DWmHQchV7x2Rq9l99M/cQHC8JGchAnw9Z0uTz5KrPa0bTl/Inm1NR7ceOARfIrkNuQNAhuSuZPYa6k7QYn3Q==", >>>>>>> origin/staging "engines": { "node": ">=12.22.0" @@ -9723,7 +9595,51 @@ "react-dom": "^16 || ^17" } }, + "node_modules/react-redux": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.2.tgz", + "integrity": "sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-router": { +<<<<<<< HEAD <<<<<<< HEAD "version": "6.14.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", @@ -9744,6 +9660,13 @@ "dependencies": { "@remix-run/router": "1.7.2" >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", + "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", + "dependencies": { + "@remix-run/router": "1.9.0" >>>>>>> origin/staging }, "engines": { @@ -9754,6 +9677,7 @@ } }, "node_modules/react-router-dom": { +<<<<<<< HEAD <<<<<<< HEAD "version": "6.14.2", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", @@ -9777,6 +9701,14 @@ "@remix-run/router": "1.7.2", "react-router": "6.14.2" >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", + "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", + "dependencies": { + "@remix-run/router": "1.9.0", + "react-router": "6.16.0" >>>>>>> origin/staging }, "engines": { @@ -9802,16 +9734,32 @@ "react-dom": ">=16.6.0" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/reflect.getprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", - "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -9841,9 +9789,9 @@ } }, "node_modules/regenerator-runtime": { -<<<<<<< HEAD "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", +<<<<<<< HEAD "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" ======= <<<<<<< HEAD @@ -9859,6 +9807,10 @@ ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true >>>>>>> origin/staging }, "node_modules/regenerator-transform": { @@ -9871,13 +9823,13 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -9940,9 +9892,9 @@ } }, "node_modules/reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { "version": "1.22.1", @@ -10098,13 +10050,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -10118,7 +10070,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex-test": { "version": "1.0.0", @@ -10144,10 +10097,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -10162,6 +10114,19 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -10313,14 +10278,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -10330,28 +10295,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10579,14 +10544,14 @@ } }, "node_modules/terser": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", - "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", "devOptional": true, "dependencies": { - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -10602,15 +10567,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "devOptional": true }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "devOptional": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -10735,12 +10691,15 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "node_modules/typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", @@ -10807,9 +10766,12 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "node_modules/typescript": { "version": "4.9.5", @@ -10902,9 +10864,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -10955,6 +10917,14 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/vite": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", @@ -11534,36 +11504,6 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/vite/node_modules/esbuild": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", @@ -11649,8 +11589,11 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "node_modules/which-builtin-type": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", @@ -11669,28 +11612,12 @@ "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", "which-typed-array": "^1.1.9" -======= -<<<<<<< HEAD -======= - "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" -<<<<<<< HEAD } }, "node_modules/which-collection": { @@ -11725,11 +11652,12 @@ }, "funding": { "url": "https://github.com/sponsors/ljharb" -======= ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 } }, +<<<<<<< HEAD >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "node_modules/wrappy": { "version": "1.0.2", @@ -11751,6 +11679,19 @@ "node": ">= 6" } }, + "node_modules/yarn": { + "version": "1.22.19", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.19.tgz", + "integrity": "sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==", + "hasInstallScript": true, + "bin": { + "yarn": "bin/yarn.js", + "yarnpkg": "bin/yarn.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -11780,6 +11721,7 @@ "node": ">=10" } } +<<<<<<< HEAD }, "dependencies": { "@aashutoshrathi/word-wrap": { @@ -20128,5 +20070,7 @@ "toposort": "^2.0.2" } } +======= +>>>>>>> origin/staging } } diff --git a/frontend/dashboard/package.json b/frontend/dashboard/package.json index d74a28ae..83b1a540 100644 --- a/frontend/dashboard/package.json +++ b/frontend/dashboard/package.json @@ -51,6 +51,7 @@ "@mui/system": "^5.14.6", "@mui/x-data-grid": "^5.17.26", "@mui/x-date-pickers": "5.0.0-beta.2", + "@reduxjs/toolkit": "^1.9.6", "@vitejs/plugin-react": "^1.3.2", "apexcharts": "^3.42.0", "axios": "^0.27.2", @@ -75,7 +76,9 @@ "react-hook-form": "^7.45.4", "react-intersection-observer": "^8.34.0", "react-lazy-load-image-component": "^1.6.0", + "react-number-format": "^5.3.1", "react-quill": "2.0.0-beta.4", + "react-redux": "^8.1.2", "react-router": "^6.15.0", "react-router-dom": "^6.15.0", "simplebar": "^5.3.9", @@ -84,6 +87,7 @@ "stylis-plugin-rtl": "^2.1.1", "vite": "^3.2.7", "vite-plugin-svgr": "^2.4.0", + "yarn": "^1.22.19", "yup": "^0.32.11" }, "devDependencies": { diff --git a/frontend/dashboard/pnpm-lock.yaml b/frontend/dashboard/pnpm-lock.yaml index d718dbbc..b026ce7e 100644 --- a/frontend/dashboard/pnpm-lock.yaml +++ b/frontend/dashboard/pnpm-lock.yaml @@ -40,10 +40,13 @@ dependencies: version: 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react@17.0.2) '@mui/x-data-grid': specifier: ^5.17.26 - version: 5.17.26(@mui/material@5.14.6)(@mui/system@5.14.6)(react-dom@17.0.2)(react@17.0.2) + version: 5.17.26(@mui/material@5.14.6)(@mui/system@5.14.6)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) '@mui/x-date-pickers': specifier: 5.0.0-beta.2 - version: 5.0.0-beta.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.6)(@mui/system@5.14.6)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2) + version: 5.0.0-beta.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.6)(@mui/system@5.14.6)(@types/react@17.0.65)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2) + '@reduxjs/toolkit': + specifier: ^1.9.6 + version: 1.9.6(react-redux@8.1.2)(react@17.0.2) '@vitejs/plugin-react': specifier: ^1.3.2 version: 1.3.2 @@ -89,6 +92,9 @@ dependencies: numeral: specifier: ^2.0.6 version: 2.0.6 + pnpm: + specifier: ^8.6.12 + version: 8.6.12 react: specifier: ^17.0.2 version: 17.0.2 @@ -113,9 +119,15 @@ dependencies: react-lazy-load-image-component: specifier: ^1.6.0 version: 1.6.0(react-dom@17.0.2)(react@17.0.2) + react-number-format: + specifier: ^5.3.1 + version: 5.3.1(react-dom@17.0.2)(react@17.0.2) react-quill: specifier: 2.0.0-beta.4 version: 2.0.0-beta.4(react-dom@17.0.2)(react@17.0.2) + react-redux: + specifier: ^8.1.2 + version: 8.1.2(@types/react-dom@17.0.20)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1) react-router: specifier: ^6.15.0 version: 6.15.0(react@17.0.2) @@ -140,6 +152,9 @@ dependencies: vite-plugin-svgr: specifier: ^2.4.0 version: 2.4.0(rollup@2.79.1)(vite@3.2.7) + yarn: + specifier: ^1.22.19 + version: 1.22.19 yup: specifier: ^0.32.11 version: 0.32.11 @@ -229,37 +244,23 @@ devDependencies: packages: -<<<<<<< Updated upstream -<<<<<<< HEAD /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} dev: true -======= ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 -======= ->>>>>>> Stashed changes /@ajoelp/json-to-formdata@1.5.0: resolution: {integrity: sha512-nrlfeTSL0X0dtx5r2KpzPiqLSIQquiiJjUKsQAKzWaCmO2QoYZCyb5ENZwF3YoffKronOCJr25mxaD8JRJmK8w==} dependencies: lodash: 4.17.21 dev: false -<<<<<<< Updated upstream -<<<<<<< HEAD /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} -======= -======= ->>>>>>> Stashed changes - /@ampproject/remapping@2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} @@ -273,15 +274,15 @@ packages: leven: 3.1.0 dev: true - /@babel/code-frame@7.22.10: - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.10 + '@babel/highlight': 7.22.20 chalk: 2.4.2 - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} /@babel/core@7.22.11: @@ -289,15 +290,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) - '@babel/helpers': 7.22.11 - '@babel/parser': 7.22.11 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -306,6 +307,29 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/eslint-parser@7.22.11(@babel/core@7.22.11)(eslint@8.48.0): resolution: {integrity: sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -320,58 +344,76 @@ packages: semver: 6.3.1 dev: true - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: - resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 dev: true - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==} + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -382,96 +424,161 @@ packages: semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.11): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.22.11): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.22.4 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.11 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 - /@babel/helper-member-expression-to-functions@7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 dev: true - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + /@babel/helper-module-transforms@7.23.0(@babel/core@7.22.11): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 dev: true /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.22.11): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.10 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.22.11): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 dev: true @@ -479,69 +586,69 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function@7.22.10: - resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/types': 7.22.11 + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: true - /@babel/helpers@7.22.11: - resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color - /@babel/highlight@7.22.10: - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.11: - resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -550,8 +657,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 @@ -559,30 +676,43 @@ packages: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.12(@babel/core@7.22.11) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.22.11) + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.11): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-decorators@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==} + /@babel/plugin-proposal-decorators@7.23.2(@babel/core@7.22.11): + resolution: {integrity: sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) '@babel/helper-split-export-declaration': 7.22.6 '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.22.11) dev: true @@ -590,6 +720,7 @@ packages: /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.11): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -601,6 +732,7 @@ packages: /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.11): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -612,6 +744,7 @@ packages: /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.11): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -624,11 +757,12 @@ packages: /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.11): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -641,15 +775,25 @@ packages: '@babel/core': 7.22.11 dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.22.11): resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) dev: true @@ -663,6 +807,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -672,6 +825,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -682,6 +844,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.22.11): resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} engines: {node: '>=6.9.0'} @@ -701,6 +873,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -710,6 +891,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} @@ -730,6 +920,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} @@ -740,6 +940,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -749,6 +959,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -758,6 +977,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -776,6 +1004,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -785,6 +1022,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -794,6 +1040,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -803,6 +1058,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -812,6 +1076,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -821,6 +1094,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -831,6 +1113,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -841,6 +1133,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} @@ -858,7 +1160,18 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -872,19 +1185,42 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==} + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.22.11): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.11) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) dev: true + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} @@ -892,9 +1228,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) dev: true /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11): @@ -907,8 +1255,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.22.11): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -917,6 +1275,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} @@ -924,7 +1292,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -935,25 +1314,55 @@ packages: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) dev: true - /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.11): - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true @@ -966,11 +1375,22 @@ packages: dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 + '@babel/template': 7.22.15 dev: true - /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.22.11): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -979,6 +1399,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} @@ -986,7 +1416,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1000,6 +1441,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} @@ -1011,6 +1462,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) dev: true + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} @@ -1018,7 +1480,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1033,6 +1506,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) dev: true + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} @@ -1044,8 +1528,8 @@ packages: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.11) dev: true - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1054,6 +1538,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} @@ -1061,8 +1555,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1077,6 +1583,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) dev: true + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} @@ -1087,6 +1604,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} @@ -1098,6 +1625,17 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) dev: true + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} @@ -1108,40 +1646,86 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==} + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.22.11): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.22.11): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.22.11): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 dev: true /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11): @@ -1151,7 +1735,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1162,7 +1757,18 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1176,6 +1782,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} @@ -1187,6 +1803,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) dev: true + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} @@ -1198,18 +1825,43 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) dev: true - /@babel/plugin-transform-object-rest-spread@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==} + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) dev: true /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11): @@ -1220,7 +1872,18 @@ packages: dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) dev: true /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11): @@ -1234,8 +1897,19 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) dev: true - /@babel/plugin-transform-optional-chaining@7.22.12(@babel/core@7.22.11): - resolution: {integrity: sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==} + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.22.11): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1246,8 +1920,20 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1256,6 +1942,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} @@ -1263,7 +1959,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1275,11 +1982,24 @@ packages: dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) dev: true + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} @@ -1290,6 +2010,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} @@ -1329,6 +2059,20 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) + '@babel/types': 7.23.0 + dev: true + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} engines: {node: '>=6.9.0'} @@ -1337,10 +2081,10 @@ packages: dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} @@ -1364,6 +2108,17 @@ packages: regenerator-transform: 0.15.2 dev: true + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} @@ -1374,18 +2129,28 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-runtime@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==} + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.22.11): + resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.11) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.11) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.11) + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.22.11) + babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.22.11) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.22.11) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -1401,6 +2166,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} @@ -1412,6 +2187,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} @@ -1422,6 +2208,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} @@ -1432,6 +2228,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} @@ -1442,15 +2248,25 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA==} + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) dev: true @@ -1465,6 +2281,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} @@ -1472,7 +2298,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1483,7 +2320,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1494,23 +2342,34 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.23.2(@babel/core@7.22.11): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.11) + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.22.11) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.22.11) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) @@ -1531,39 +2390,39 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.11) '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-async-generator-functions': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.22.11) '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.22.11) '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.11) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.22.11) '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.22.11) '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.11) '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.22.11) '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.11) '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.11) '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.22.11) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.22.11) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.22.11) '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.11) '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-object-rest-spread': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.22.11) '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-optional-chaining': 7.22.12(@babel/core@7.22.11) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.22.11) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.11) '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.11) '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.11) @@ -1579,11 +2438,102 @@ packages: '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.11) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.11) - '@babel/types': 7.22.11 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.11) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.11) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.11) - core-js-compat: 3.32.1 + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.22.11) + babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.22.11) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.22.11) + core-js-compat: 3.33.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-env@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + core-js-compat: 3.33.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -1596,88 +2546,99 @@ packages: dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 esutils: 2.0.3 dev: true - /@babel/preset-react@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 + dev: true + + /@babel/preset-react@7.22.15(@babel/core@7.22.11): + resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 + '@babel/helper-validator-option': 7.22.15 '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.11) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.22.11) dev: true - /@babel/preset-typescript@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-tWY5wyCZYBGY7IlalfKI1rLiGlIfnwsRHZqlky0HVv8qviwQ1Uo/05M6+s+TcTCVa6Bmoo2uJW5TMFX6Wa4qVg==} + /@babel/preset-typescript@7.23.2(@babel/core@7.22.11): + resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 + '@babel/helper-validator-option': 7.22.15 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-typescript': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.22.11) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.22.11) dev: true /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime-corejs3@7.22.11: - resolution: {integrity: sha512-NhfzUbdWbiE6fCFypbWCPu6AR8xre31EOPF7wwAIJEvGQ2avov04eymayWinCuyXmV1b0+jzoXP/HYzzUYdvwg==} + /@babel/runtime-corejs3@7.23.2: + resolution: {integrity: sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.32.1 + core-js-pure: 3.33.0 regenerator-runtime: 0.14.0 dev: true - /@babel/runtime@7.22.11: - resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 - /@babel/traverse@7.22.11: - resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.22.11: - resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 /@date-io/core@2.17.0: @@ -1732,8 +2693,8 @@ packages: /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: - '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.11 + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -1792,7 +2753,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 @@ -1828,7 +2789,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 '@emotion/react': 11.11.1(@types/react@17.0.65)(react@17.0.2) @@ -2083,8 +3044,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + /@eslint-community/regexpp@4.9.1: + resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -2095,7 +3056,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.21.0 + globals: 13.23.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2110,32 +3071,32 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@floating-ui/core@1.4.1: - resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==} + /@floating-ui/core@1.5.0: + resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} dependencies: - '@floating-ui/utils': 0.1.1 + '@floating-ui/utils': 0.1.6 dev: false - /@floating-ui/dom@1.5.1: - resolution: {integrity: sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==} + /@floating-ui/dom@1.5.3: + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} dependencies: - '@floating-ui/core': 1.4.1 - '@floating-ui/utils': 0.1.1 + '@floating-ui/core': 1.5.0 + '@floating-ui/utils': 0.1.6 dev: false - /@floating-ui/react-dom@2.0.1(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} + /@floating-ui/react-dom@2.0.2(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.5.1 + '@floating-ui/dom': 1.5.3 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: false - /@floating-ui/utils@0.1.1: - resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==} + /@floating-ui/utils@0.1.6: + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: false /@hookform/resolvers@2.9.11(react-hook-form@7.45.4): @@ -2146,8 +3107,8 @@ packages: react-hook-form: 7.45.4(react@17.0.2) dev: false - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -2180,7 +3141,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -2194,14 +3155,14 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 @@ -2210,49 +3171,49 @@ packages: resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} dev: false - /@motionone/animation@10.15.1: - resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} + /@motionone/animation@10.16.3: + resolution: {integrity: sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==} dependencies: - '@motionone/easing': 10.15.1 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 + '@motionone/easing': 10.16.3 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 tslib: 2.6.2 dev: false /@motionone/dom@10.12.0: resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} dependencies: - '@motionone/animation': 10.15.1 - '@motionone/generators': 10.15.1 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 + '@motionone/animation': 10.16.3 + '@motionone/generators': 10.16.4 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 hey-listen: 1.0.8 tslib: 2.6.2 dev: false - /@motionone/easing@10.15.1: - resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} + /@motionone/easing@10.16.3: + resolution: {integrity: sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==} dependencies: - '@motionone/utils': 10.15.1 + '@motionone/utils': 10.16.3 tslib: 2.6.2 dev: false - /@motionone/generators@10.15.1: - resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} + /@motionone/generators@10.16.4: + resolution: {integrity: sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==} dependencies: - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 tslib: 2.6.2 dev: false - /@motionone/types@10.15.1: - resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} + /@motionone/types@10.16.3: + resolution: {integrity: sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==} dev: false - /@motionone/utils@10.15.1: - resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} + /@motionone/utils@10.16.3: + resolution: {integrity: sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==} dependencies: - '@motionone/types': 10.15.1 + '@motionone/types': 10.16.3 hey-listen: 1.0.8 tslib: 2.6.2 dev: false @@ -2268,10 +3229,10 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@emotion/is-prop-valid': 1.2.1 - '@mui/types': 7.2.4(@types/react@17.0.65) - '@mui/utils': 5.14.6(react@17.0.2) + '@mui/types': 7.2.6(@types/react@17.0.65) + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) '@popperjs/core': 2.11.8 '@types/react': 17.0.65 clsx: 1.2.1 @@ -2292,11 +3253,11 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@emotion/is-prop-valid': 1.2.1 - '@floating-ui/react-dom': 2.0.1(react-dom@17.0.2)(react@17.0.2) - '@mui/types': 7.2.4(@types/react@17.0.65) - '@mui/utils': 5.14.6(react@17.0.2) + '@floating-ui/react-dom': 2.0.2(react-dom@17.0.2)(react@17.0.2) + '@mui/types': 7.2.6(@types/react@17.0.65) + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) '@popperjs/core': 2.11.8 '@types/react': 17.0.65 clsx: 2.0.0 @@ -2306,8 +3267,8 @@ packages: react-is: 18.2.0 dev: false - /@mui/core-downloads-tracker@5.14.6: - resolution: {integrity: sha512-QZEU3pyGWLuaHbxvOlShol7U1FVgzWBR0OH9H8D7L8w4/vto5N5jJVvlqFQS3T0zbR6YGHxFaiL6Ky87jQg7aw==} + /@mui/core-downloads-tracker@5.14.14: + resolution: {integrity: sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==} dev: false /@mui/icons-material@5.14.6(@mui/material@5.14.6)(@types/react@17.0.65)(react@17.0.2): @@ -2321,7 +3282,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@mui/material': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) '@types/react': 17.0.65 react: 17.0.2 @@ -2351,12 +3312,12 @@ packages: moment: optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@mui/base': 5.0.0-alpha.79(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) '@mui/material': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) '@mui/system': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react@17.0.2) - '@mui/utils': 5.14.6(react@17.0.2) - '@mui/x-date-pickers': 5.0.0-alpha.0(@mui/material@5.14.6)(@mui/system@5.14.6)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2) + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) + '@mui/x-date-pickers': 5.0.0-alpha.0(@mui/material@5.14.6)(@mui/system@5.14.6)(@types/react@17.0.65)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2) '@types/react': 17.0.65 clsx: 1.2.1 date-fns: 2.30.0 @@ -2388,16 +3349,16 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(@types/react@17.0.65)(react@17.0.2) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@17.0.65)(react@17.0.2) '@mui/base': 5.0.0-beta.12(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) - '@mui/core-downloads-tracker': 5.14.6 + '@mui/core-downloads-tracker': 5.14.14 '@mui/system': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react@17.0.2) - '@mui/types': 7.2.4(@types/react@17.0.65) - '@mui/utils': 5.14.6(react@17.0.2) + '@mui/types': 7.2.6(@types/react@17.0.65) + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) '@types/react': 17.0.65 - '@types/react-transition-group': 4.4.6 + '@types/react-transition-group': 4.4.8 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 @@ -2407,8 +3368,8 @@ packages: react-transition-group: 4.4.5(react-dom@17.0.2)(react@17.0.2) dev: false - /@mui/private-theming@5.14.6(@types/react@17.0.65)(react@17.0.2): - resolution: {integrity: sha512-3VBLFGizBXfofyk33bwRg6t9L648aKnLmOKPfY1wFuiXq3AEYwobK65iDci/tHKxm/VKbZ6A7PFjLejvB3EvRQ==} + /@mui/private-theming@5.14.14(@types/react@17.0.65)(react@17.0.2): + resolution: {integrity: sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2417,15 +3378,15 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 - '@mui/utils': 5.14.6(react@17.0.2) + '@babel/runtime': 7.23.2 + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) '@types/react': 17.0.65 prop-types: 15.8.1 react: 17.0.2 dev: false - /@mui/styled-engine@5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@17.0.2): - resolution: {integrity: sha512-I6zeu/OP1Hk4NsX1Oj85TiYl1dER0JMsLJVn76J1Ihl24A5EbiZQKJp3Mn+ufA79ypkdAvM9aQCAQyiVBFcUHg==} + /@mui/styled-engine@5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@17.0.2): + resolution: {integrity: sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -2437,7 +3398,7 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(@types/react@17.0.65)(react@17.0.2) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@17.0.65)(react@17.0.2) @@ -2462,13 +3423,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(@types/react@17.0.65)(react@17.0.2) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@17.0.65)(react@17.0.2) - '@mui/private-theming': 5.14.6(@types/react@17.0.65)(react@17.0.2) - '@mui/styled-engine': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@17.0.2) - '@mui/types': 7.2.4(@types/react@17.0.65) - '@mui/utils': 5.14.6(react@17.0.2) + '@mui/private-theming': 5.14.14(@types/react@17.0.65)(react@17.0.2) + '@mui/styled-engine': 5.14.14(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@17.0.2) + '@mui/types': 7.2.6(@types/react@17.0.65) + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) '@types/react': 17.0.65 clsx: 2.0.0 csstype: 3.1.2 @@ -2476,10 +3437,10 @@ packages: react: 17.0.2 dev: false - /@mui/types@7.2.4(@types/react@17.0.65): - resolution: {integrity: sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==} + /@mui/types@7.2.6(@types/react@17.0.65): + resolution: {integrity: sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==} peerDependencies: - '@types/react': '*' + '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -2487,21 +3448,25 @@ packages: '@types/react': 17.0.65 dev: false - /@mui/utils@5.14.6(react@17.0.2): - resolution: {integrity: sha512-AznpqLu6hrFnpHgcvsSSMCG+cDbkcCYfo+daUwBVReNYv4l+NQ8+wvBAF4aUMi155N7xWbbgh0cyKs6Wdsm3aA==} + /@mui/utils@5.14.14(@types/react@17.0.65)(react@17.0.2): + resolution: {integrity: sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==} engines: {node: '>=12.0.0'} peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@babel/runtime': 7.22.11 - '@types/prop-types': 15.7.5 - '@types/react-is': 18.2.1 + '@babel/runtime': 7.23.2 + '@types/prop-types': 15.7.9 + '@types/react': 17.0.65 prop-types: 15.8.1 react: 17.0.2 react-is: 18.2.0 dev: false - /@mui/x-data-grid@5.17.26(@mui/material@5.14.6)(@mui/system@5.14.6)(react-dom@17.0.2)(react@17.0.2): + /@mui/x-data-grid@5.17.26(@mui/material@5.14.6)(@mui/system@5.14.6)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-eGJq9J0g9cDGLFfMmugOadZx0mJeOd/yQpHwEa5gUXyONS6qF0OhXSWyDOhDdA3l2TOoQzotMN5dY/T4Wl1KYA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2510,18 +3475,20 @@ packages: react: ^17.0.2 || ^18.0.0 react-dom: ^17.0.2 || ^18.0.0 dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@mui/material': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) '@mui/system': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react@17.0.2) - '@mui/utils': 5.14.6(react@17.0.2) + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) clsx: 1.2.1 prop-types: 15.8.1 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) reselect: 4.1.8 + transitivePeerDependencies: + - '@types/react' dev: false - /@mui/x-date-pickers@5.0.0-alpha.0(@mui/material@5.14.6)(@mui/system@5.14.6)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2): + /@mui/x-date-pickers@5.0.0-alpha.0(@mui/material@5.14.6)(@mui/system@5.14.6)(@types/react@17.0.65)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-JTzTaNSWbxNi8KDUJjHCH6im0YlIEv88gPoKhGm7s6xCGT1q6FtMp/oQ40nhfwrJ73nkM5G1JXRIzI/yfsHXQQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2548,7 +3515,7 @@ packages: '@date-io/moment': 2.17.0 '@mui/material': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) '@mui/system': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react@17.0.2) - '@mui/utils': 5.14.6(react@17.0.2) + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) clsx: 1.2.1 date-fns: 2.30.0 prop-types: 15.8.1 @@ -2556,10 +3523,11 @@ packages: react-transition-group: 4.4.5(react-dom@17.0.2)(react@17.0.2) rifm: 0.12.1(react@17.0.2) transitivePeerDependencies: + - '@types/react' - react-dom dev: false - /@mui/x-date-pickers@5.0.0-beta.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.6)(@mui/system@5.14.6)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2): + /@mui/x-date-pickers@5.0.0-beta.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@mui/material@5.14.6)(@mui/system@5.14.6)(@types/react@17.0.65)(date-fns@2.30.0)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-UEXQ2tmhosklAQwOUtwQBI2WngSdp5Q8vYqsmvxNJxuXYuM/DawdQBwyfFyK7jx5wf/RTsniG1e12hqii3wPYg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2586,7 +3554,7 @@ packages: moment: optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@date-io/core': 2.17.0 '@date-io/date-fns': 2.17.0(date-fns@2.30.0) '@date-io/dayjs': 2.17.0 @@ -2596,8 +3564,8 @@ packages: '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@17.0.65)(react@17.0.2) '@mui/material': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2) '@mui/system': 5.14.6(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.65)(react@17.0.2) - '@mui/utils': 5.14.6(react@17.0.2) - '@types/react-transition-group': 4.4.6 + '@mui/utils': 5.14.14(@types/react@17.0.65)(react@17.0.2) + '@types/react-transition-group': 4.4.8 clsx: 1.2.1 date-fns: 2.30.0 prop-types: 15.8.1 @@ -2605,6 +3573,7 @@ packages: react-transition-group: 4.4.5(react-dom@17.0.2)(react@17.0.2) rifm: 0.12.1(react@17.0.2) transitivePeerDependencies: + - '@types/react' - react-dom dev: false @@ -2639,12 +3608,31 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false + /@reduxjs/toolkit@1.9.6(react-redux@8.1.2)(react@17.0.2): + resolution: {integrity: sha512-Gc4ikl90ORF4viIdAkY06JNUnODjKfGxZRwATM30EdHq8hLSVoSrwXne5dd739yenP5bJxAX7tLuOWK5RPGtrw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 9.0.21 + react: 17.0.2 + react-redux: 8.1.2(@types/react-dom@17.0.20)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1) + redux: 4.2.1 + redux-thunk: 2.4.2(redux@4.2.1) + reselect: 4.1.8 + dev: false + /@remix-run/router@1.8.0: resolution: {integrity: sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==} engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.2)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2655,8 +3643,8 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-imports': 7.22.5 + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 dev: true @@ -2672,7 +3660,7 @@ packages: builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.4 + resolve: 1.22.8 rollup: 2.79.1 dev: true @@ -2706,23 +3694,23 @@ packages: picomatch: 2.3.1 dev: false - /@rollup/pluginutils@5.0.4(rollup@2.79.1): - resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} + /@rollup/pluginutils@5.0.5(rollup@2.79.1): + resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 2.79.1 dev: false - /@rushstack/eslint-patch@1.3.3: - resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} + /@rushstack/eslint-patch@1.5.1: + resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} dev: true /@surma/rollup-plugin-off-main-thread@2.2.3: @@ -2731,7 +3719,7 @@ packages: ejs: 3.1.9 json5: 2.2.3 magic-string: 0.25.9 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.10 dev: true /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.22.11): @@ -2840,7 +3828,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 entities: 4.5.0 dev: false @@ -2863,12 +3851,19 @@ packages: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + /@types/estree@1.0.3: + resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} dev: false - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + /@types/hoist-non-react-statics@3.3.4: + resolution: {integrity: sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==} + dependencies: + '@types/react': 17.0.65 + hoist-non-react-statics: 3.3.2 + dev: false + + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} dev: true /@types/json5@0.0.29: @@ -2878,19 +3873,21 @@ packages: /@types/lodash@4.14.197: resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==} - /@types/node@20.5.7: - resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} + /@types/node@20.8.7: + resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==} + dependencies: + undici-types: 5.25.3 dev: true /@types/nprogress@0.2.0: resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==} dev: true - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + /@types/parse-json@4.0.1: + resolution: {integrity: sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==} - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/prop-types@15.7.9: + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} /@types/quill@1.3.10: resolution: {integrity: sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==} @@ -2902,13 +3899,6 @@ packages: resolution: {integrity: sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==} dependencies: '@types/react': 17.0.65 - dev: true - - /@types/react-is@18.2.1: - resolution: {integrity: sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==} - dependencies: - '@types/react': 17.0.65 - dev: false /@types/react-lazy-load-image-component@1.5.3: resolution: {integrity: sha512-hTzsQQ64mmPR6W03DQr6zhzeBGn17ExnVd7sLHqTQZQVd9Oi0Dy7tfSPgK0+AZV5YNC+e8Jw7oq9kzYfDkCDCA==} @@ -2917,8 +3907,8 @@ packages: csstype: 3.1.2 dev: true - /@types/react-transition-group@4.4.6: - resolution: {integrity: sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==} + /@types/react-transition-group@4.4.8: + resolution: {integrity: sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==} dependencies: '@types/react': 17.0.65 dev: false @@ -2926,31 +3916,35 @@ packages: /@types/react@17.0.65: resolution: {integrity: sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==} dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 csstype: 3.1.2 /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.5.7 + '@types/node': 20.8.7 dev: true - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + /@types/scheduler@0.16.5: + resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + /@types/semver@7.5.4: + resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} dev: true /@types/stylis@4.2.0: resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} dev: true - /@types/trusted-types@2.0.3: - resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + /@types/trusted-types@2.0.5: + resolution: {integrity: sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==} dev: true + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@4.9.5): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2962,7 +3956,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.8.0 + '@eslint-community/regexpp': 4.9.1 '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.48.0)(typescript@4.9.5) @@ -3073,8 +4067,8 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) @@ -3105,7 +4099,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) '@rollup/pluginutils': 4.2.1 react-refresh: 0.13.0 - resolve: 1.22.4 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: false @@ -3184,8 +4178,8 @@ packages: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: - '@babel/runtime': 7.22.11 - '@babel/runtime-corejs3': 7.22.11 + '@babel/runtime': 7.23.2 + '@babel/runtime-corejs3': 7.23.2 dev: true /array-buffer-byte-length@1.0.0: @@ -3195,13 +4189,13 @@ packages: is-array-buffer: 3.0.2 dev: true - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 get-intrinsic: 1.2.1 is-string: 1.0.7 dev: true @@ -3211,54 +4205,55 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 dev: true - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 dev: true - /array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + /array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 dev: true - /arraybuffer.prototype.slice@1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 - define-properties: 1.2.0 + define-properties: 1.2.1 + es-abstract: 1.22.2 get-intrinsic: 1.2.1 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 @@ -3297,15 +4292,15 @@ packages: engines: {node: '>= 0.4'} dev: true - /axe-core@4.7.2: - resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + /axe-core@4.8.2: + resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==} engines: {node: '>=4'} dev: true /axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.3 form-data: 4.0.0 transitivePeerDependencies: - debug @@ -3319,42 +4314,78 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 cosmiconfig: 7.1.0 - resolve: 1.22.4 + resolve: 1.22.8 - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.11): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.22.11): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.11) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) - core-js-compat: 3.32.1 + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.11): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.22.11): + resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.11) + core-js-compat: 3.33.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.2): + resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + core-js-compat: 3.33.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.22.11): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.11) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) transitivePeerDependencies: - supports-color dev: true @@ -3368,7 +4399,7 @@ packages: dependencies: '@babel/core': 7.22.11 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-decorators': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.22.11) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.11) '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.11) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.11) @@ -3376,11 +4407,11 @@ packages: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.22.11) '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-runtime': 7.22.10(@babel/core@7.22.11) - '@babel/preset-env': 7.22.10(@babel/core@7.22.11) - '@babel/preset-react': 7.22.5(@babel/core@7.22.11) - '@babel/preset-typescript': 7.22.11(@babel/core@7.22.11) - '@babel/runtime': 7.22.11 + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.22.11) + '@babel/preset-env': 7.23.2(@babel/core@7.22.11) + '@babel/preset-react': 7.22.15(@babel/core@7.22.11) + '@babel/preset-typescript': 7.23.2(@babel/core@7.22.11) + '@babel/runtime': 7.23.2 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -3411,15 +4442,15 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001524 - electron-to-chromium: 1.4.503 + caniuse-lite: 1.0.30001550 + electron-to-chromium: 1.4.559 node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) + update-browserslist-db: 1.0.13(browserslist@4.22.1) /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -3433,7 +4464,7 @@ packages: /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.1 /callsites@3.1.0: @@ -3456,8 +4487,8 @@ packages: resolution: {integrity: sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==} dev: false - /caniuse-lite@1.0.30001524: - resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} + /caniuse-lite@1.0.30001550: + resolution: {integrity: sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ==} /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -3569,19 +4600,23 @@ packages: /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /core-js-compat@3.32.1: - resolution: {integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==} - dependencies: - browserslist: 4.21.10 + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /core-js-pure@3.32.1: - resolution: {integrity: sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ==} + /core-js-compat@3.33.0: + resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} + dependencies: + browserslist: 4.22.1 + dev: true + + /core-js-pure@3.33.0: + resolution: {integrity: sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==} requiresBuild: true dev: true - /core-js@3.32.1: - resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + /core-js@3.33.0: + resolution: {integrity: sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==} requiresBuild: true dev: false @@ -3589,7 +4624,7 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: - '@types/parse-json': 4.0.0 + '@types/parse-json': 4.0.1 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -3625,7 +4660,7 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 dev: false /debug@3.2.7: @@ -3658,7 +4693,7 @@ packages: is-regex: 1.1.4 object-is: 1.1.5 object-keys: 1.1.1 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 dev: false /deep-is@0.1.4: @@ -3670,10 +4705,19 @@ packages: engines: {node: '>=0.10.0'} dev: true - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: + get-intrinsic: 1.2.1 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 has-property-descriptors: 1.0.0 object-keys: 1.1.1 @@ -3706,7 +4750,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 csstype: 3.1.2 dev: false @@ -3725,8 +4769,8 @@ packages: jake: 10.8.7 dev: true - /electron-to-chromium@1.4.503: - resolution: {integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==} + /electron-to-chromium@1.4.559: + resolution: {integrity: sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==} /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -3742,22 +4786,22 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + /es-abstract@1.22.2: + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 + arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 + function.prototype.name: 1.1.6 get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.3 + has: 1.0.4 has-property-descriptors: 1.0.0 has-proto: 1.0.1 has-symbols: 1.0.3 @@ -3770,15 +4814,15 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.13.0 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 typed-array-buffer: 1.0.0 typed-array-byte-length: 1.0.0 typed-array-byte-offset: 1.0.0 @@ -3787,23 +4831,23 @@ packages: which-typed-array: 1.1.11 dev: true - /es-iterator-helpers@1.0.14: - resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: asynciterator.prototype: 1.0.0 call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-set-tostringtag: 2.0.1 - function-bind: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.1 globalthis: 1.0.3 has-property-descriptors: 1.0.0 has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - iterator.prototype: 1.1.0 - safe-array-concat: 1.0.0 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 dev: true /es-set-tostringtag@2.0.1: @@ -3811,14 +4855,14 @@ packages: engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.1 - has: 1.0.3 + has: 1.0.4 has-tostringtag: 1.0.0 dev: true /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: - has: 1.0.3 + has: 1.0.4 dev: true /es-to-primitive@1.2.1: @@ -4072,7 +5116,7 @@ packages: eslint: 8.48.0 eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.48.0) object.assign: 4.1.4 - object.entries: 1.1.6 + object.entries: 1.1.7 semver: 6.3.1 dev: true @@ -4108,7 +5152,7 @@ packages: eslint-plugin-react: 7.33.2(eslint@8.48.0) eslint-plugin-react-hooks: 4.3.0(eslint@8.48.0) object.assign: 4.1.4 - object.entries: 1.1.6 + object.entries: 1.1.7 dev: true /eslint-config-prettier@8.10.0(eslint@8.48.0): @@ -4132,7 +5176,7 @@ packages: dependencies: '@babel/core': 7.22.11 '@babel/eslint-parser': 7.22.11(@babel/core@7.22.11)(eslint@8.48.0) - '@rushstack/eslint-patch': 1.3.3 + '@rushstack/eslint-patch': 1.5.1 '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@4.9.5) '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@4.9.5) babel-preset-react-app: 10.0.1 @@ -4160,7 +5204,7 @@ packages: dependencies: debug: 3.2.7 is-core-module: 2.13.0 - resolve: 1.22.4 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true @@ -4177,7 +5221,7 @@ packages: eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.48.0) glob: 7.2.3 is-glob: 4.0.3 - resolve: 1.22.4 + resolve: 1.22.8 tsconfig-paths: 3.14.2 transitivePeerDependencies: - supports-color @@ -4239,22 +5283,22 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@4.9.5) - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.48.0) - has: 1.0.3 + has: 1.0.4 is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -4290,16 +5334,16 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 aria-query: 4.2.2 - array-includes: 3.1.6 + array-includes: 3.1.7 ast-types-flow: 0.0.7 - axe-core: 4.7.2 + axe-core: 4.8.2 axobject-query: 2.2.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 eslint: 8.48.0 - has: 1.0.3 + has: 1.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 @@ -4337,23 +5381,23 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 - es-iterator-helpers: 1.0.14 + es-iterator-helpers: 1.0.15 eslint: 8.48.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 prop-types: 15.8.1 - resolve: 2.0.0-next.4 + resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.10 dev: true /eslint-plugin-testing-library@5.11.1(eslint@8.48.0)(typescript@4.9.5): @@ -4401,10 +5445,10 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@eslint-community/regexpp': 4.8.0 + '@eslint-community/regexpp': 4.9.1 '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -4422,7 +5466,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.23.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -4536,7 +5580,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.1.0 + flat-cache: 3.1.1 dev: true /file-selector@0.6.0: @@ -4571,21 +5615,21 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} engines: {node: '>=12.0.0'} dependencies: - flatted: 3.2.7 - keyv: 4.5.3 + flatted: 3.2.9 + keyv: 4.5.4 rimraf: 3.0.2 dev: true - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4654,16 +5698,16 @@ packages: requiresBuild: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 functions-have-names: 1.2.3 dev: true @@ -4677,8 +5721,8 @@ packages: /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: - function-bind: 1.1.1 - has: 1.0.3 + function-bind: 1.1.2 + has: 1.0.4 has-proto: 1.0.1 has-symbols: 1.0.3 @@ -4723,8 +5767,8 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -4734,7 +5778,7 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /globby@11.1.0: @@ -4761,7 +5805,6 @@ packages: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.1 - dev: true /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4803,11 +5846,9 @@ packages: dependencies: has-symbols: 1.0.3 - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 /header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} @@ -4828,7 +5869,7 @@ packages: /history@5.3.0: resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 dev: false /hoist-non-react-statics@3.3.2: @@ -4846,6 +5887,10 @@ packages: engines: {node: '>= 4'} dev: true + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -4874,7 +5919,7 @@ packages: engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.1 - has: 1.0.3 + has: 1.0.4 side-channel: 1.0.4 dev: true @@ -4932,7 +5977,7 @@ packages: /is-core-module@2.13.0: resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: - has: 1.0.3 + has: 1.0.4 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -5073,14 +6118,14 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /iterator.prototype@1.1.0: - resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 get-intrinsic: 1.2.1 has-symbols: 1.0.3 - has-tostringtag: 1.0.0 - reflect.getprototypeof: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 dev: true /jake@10.8.7: @@ -5098,7 +6143,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.5.7 + '@types/node': 20.8.7 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -5175,10 +6220,10 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 object.assign: 4.1.4 - object.values: 1.1.6 + object.values: 1.1.7 dev: true /jsx-runtime@1.2.0: @@ -5187,8 +6232,8 @@ packages: object-assign: 3.0.0 dev: false - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 dev: true @@ -5395,8 +6440,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.0: + resolution: {integrity: sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==} dev: true /object-is@1.1.5: @@ -5404,7 +6449,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 + define-properties: 1.2.1 dev: false /object-keys@1.1.1: @@ -5416,52 +6461,52 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 get-intrinsic: 1.2.1 dev: true - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true /once@1.4.0: @@ -5517,7 +6562,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5565,6 +6610,12 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /pnpm@8.6.12: + resolution: {integrity: sha512-Eza4C5SO/Xl5IYozupbZ5NOA5leBRPYxmXmXfe7G4/4uCkRLhks84rB33aitxNZU/uMrnDGGjwrLktoKvPjqHA==} + engines: {node: '>=16.14'} + hasBin: true + dev: false + /popmotion@11.0.3: resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} dependencies: @@ -5574,8 +6625,8 @@ packages: tslib: 2.6.2 dev: false - /postcss@8.4.28: - resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -5617,8 +6668,8 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 - /property-expr@2.0.5: - resolution: {integrity: sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==} + /property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} dev: false /punycode@2.3.0: @@ -5700,7 +6751,7 @@ packages: react: ^16.6.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 invariant: 2.2.4 prop-types: 15.8.1 react: 17.0.2 @@ -5749,6 +6800,17 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /react-number-format@5.3.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + dev: false + /react-quill@2.0.0-beta.4(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-KyAHvAlPjP4xLElKZJefMth91Z6FbbXRvq9OSu6xN3KBaoasLP9p+3dcxg4Ywr4tBlpMGXcPszYSAgd5CpJ45Q==} peerDependencies: @@ -5762,6 +6824,40 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /react-redux@8.1.2(@types/react-dom@17.0.20)(@types/react@17.0.65)(react-dom@17.0.2)(react@17.0.2)(redux@4.2.1): + resolution: {integrity: sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: ^4 || ^5.0.0-beta.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@types/hoist-non-react-statics': 3.3.4 + '@types/react': 17.0.65 + '@types/react-dom': 17.0.20 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-is: 18.2.0 + redux: 4.2.1 + use-sync-external-store: 1.2.0(react@17.0.2) + dev: false + /react-refresh@0.13.0: resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} engines: {node: '>=0.10.0'} @@ -5796,7 +6892,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -5812,20 +6908,34 @@ packages: object-assign: 4.1.1 dev: false - /reflect.getprototypeof@1.0.3: - resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + /redux-thunk@2.4.2(redux@4.2.1): + resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + peerDependencies: + redux: ^4 + dependencies: + redux: 4.2.1 + dev: false + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.23.2 + dev: false + + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 get-intrinsic: 1.2.1 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 @@ -5841,16 +6951,16 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 dev: true - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + define-properties: 1.2.1 + set-function-name: 2.0.1 /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} @@ -5858,7 +6968,7 @@ packages: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 + regenerate-unicode-properties: 10.1.1 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 @@ -5884,16 +6994,16 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: is-core-module: 2.13.0 @@ -5927,11 +7037,11 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.22.13 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.19.2 + terser: 5.22.0 dev: true /rollup@2.79.1: @@ -5947,8 +7057,8 @@ packages: queue-microtask: 1.2.3 dev: true - /safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.2 @@ -6002,6 +7112,14 @@ packages: randombytes: 2.1.0 dev: true + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + /shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} dev: false @@ -6023,7 +7141,7 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + object-inspect: 1.13.0 dev: true /simplebar-react@2.4.3(react-dom@17.0.2)(react@17.0.2): @@ -6043,7 +7161,7 @@ packages: dependencies: '@juggle/resize-observer': 3.4.0 can-use-dom: 0.1.0 - core-js: 3.32.1 + core-js: 3.33.0 lodash.debounce: 4.0.8 lodash.memoize: 4.1.2 lodash.throttle: 4.1.1 @@ -6098,42 +7216,43 @@ packages: resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} dev: true - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 get-intrinsic: 1.2.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 side-channel: 1.0.4 dev: true - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true /stringify-object@3.3.0: @@ -6281,8 +7400,8 @@ packages: unique-string: 2.0.0 dev: true - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + /terser@5.22.0: + resolution: {integrity: sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -6414,6 +7533,10 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /undici-types@5.25.3: + resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} + dev: true + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -6454,13 +7577,13 @@ packages: engines: {node: '>=4'} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.10 + browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 @@ -6482,6 +7605,14 @@ packages: punycode: 2.3.0 dev: true + /use-sync-external-store@1.2.0(react@17.0.2): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 17.0.2 + dev: false + /vite-plugin-pwa@0.12.8(vite@3.2.7)(workbox-build@6.6.0)(workbox-window@6.6.0): resolution: {integrity: sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA==} peerDependencies: @@ -6505,7 +7636,7 @@ packages: peerDependencies: vite: ^2.6.0 || 3 || 4 dependencies: - '@rollup/pluginutils': 5.0.4(rollup@2.79.1) + '@rollup/pluginutils': 5.0.5(rollup@2.79.1) '@svgr/core': 6.5.1 vite: 3.2.7 transitivePeerDependencies: @@ -6539,8 +7670,8 @@ packages: optional: true dependencies: esbuild: 0.15.18 - postcss: 8.4.28 - resolve: 1.22.4 + postcss: 8.4.31 + resolve: 1.22.8 rollup: 2.79.1 optionalDependencies: fsevents: 2.3.3 @@ -6571,7 +7702,7 @@ packages: resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} dependencies: - function.prototype.name: 1.1.5 + function.prototype.name: 1.1.6 has-tostringtag: 1.0.0 is-async-function: 2.0.0 is-date-object: 1.0.5 @@ -6631,10 +7762,10 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.22.11 - '@babel/preset-env': 7.22.10(@babel/core@7.22.11) - '@babel/runtime': 7.22.11 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.11)(rollup@2.79.1) + '@babel/core': 7.23.2 + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/runtime': 7.23.2 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.2)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -6756,7 +7887,7 @@ packages: /workbox-window@6.6.0: resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} dependencies: - '@types/trusted-types': 2.0.3 + '@types/trusted-types': 2.0.5 workbox-core: 6.6.0 dev: true @@ -6775,6 +7906,13 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + /yarn@1.22.19: + resolution: {integrity: sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==} + engines: {node: '>=4.0.0'} + hasBin: true + requiresBuild: true + dev: false + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -6784,11 +7922,11 @@ packages: resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 '@types/lodash': 4.14.197 lodash: 4.17.21 lodash-es: 4.17.21 nanoclone: 0.2.1 - property-expr: 2.0.5 + property-expr: 2.0.6 toposort: 2.0.2 dev: false diff --git a/frontend/dashboard/src/@types/claims.ts b/frontend/dashboard/src/@types/claims.ts new file mode 100644 index 00000000..61e098cc --- /dev/null +++ b/frontend/dashboard/src/@types/claims.ts @@ -0,0 +1,109 @@ +import { Benefit } from "./corporates"; +import { Member } from "./member"; + +export type ClaimRequest = { + id: number; + code: string; + name: string; + submission_date: string; + payment_type: string; + service_code: string; + claim_method: string; + service_type: string; + code_provider: string; + file_condition: Files; + member: Member; + claim: { + organization: Organizations + } + }; + +export type Claims = { + id: number; + code: string; + plan: Plan; + payor_id: string; + corporate_id: string; + policy_number: string; + benefit_desc: string; + member: Member; + benefit: Benefit | boolean; + status: string; + claim_request: ClaimRequest; +}; + +export type ClaimsEdit = { + id: number; + plan_id: string; + payor_id: string; + corporate_id: string; + policy_number: string; + member_id: string; + benefit_code: string; + benefit_desc: string; + amount_incurred: number; + amount_approved: number; + amount_not_approved: number; + excess_paid: number; +} + +export type Files = { + name: string; + url: string; + path: string; +} + +export type Plan = { + code: string; +} + +export type ClaimHistoryCare = { + id: number; + claim_id: number; + service_code: string; + admission_date: string; + discharge_date: string; + main_diagnosis_id: number; + main_diagnosis_name: string; + medical_record_number: string; + organization_id: number; + practitioner_id: number; + organization_name: string; + practitioner_name: string; + secondary_diagnosis_id: number[]; + sign: string; + symptoms: string; + name: any; +} + +export type Organizations = { + id: number; + code: string; + name: string; + address: string; + type: string; + lat: string; + lng: string; + phone: string; + timezone: string; + active: boolean | number; + province_id: number; + city_id: number; + district_id: number; + village_id: number; + postal_code: string; + description: string; + technology: string; + support_services: string; + merchant_code: string; + merchant_key: string; + image_url: string; + region_groups: string; +}; + +export type Import = { + result_file: { + url: string, + name: string, + } +} \ No newline at end of file diff --git a/frontend/dashboard/src/@types/corporates.ts b/frontend/dashboard/src/@types/corporates.ts index 45ad95ca..50e9d8c9 100644 --- a/frontend/dashboard/src/@types/corporates.ts +++ b/frontend/dashboard/src/@types/corporates.ts @@ -5,6 +5,7 @@ export type Corporate = { code: string; name?: string; welcome_message?: string; + payor_id: string; help_text?: string; logo?: any; logo_url?: string; @@ -12,6 +13,10 @@ export type Corporate = { divisions?: Division[]; employees?: Employee[]; current_policy?: Policy; + corporate_plans_count: number; + corporate_benefits_count: number; + employees_count: number; + }; export type Division = { @@ -21,6 +26,14 @@ export type Division = { name?: string; } +export type Hospital = { + id: number; + corporate_id: number; + code: string; + name?: string; + active: number; +} + export type Employee = { id: number; name: string; @@ -39,14 +52,19 @@ export type Policy = { minimal_stop_service_net: number; start: string | Date; end: string | Date; + limit_balance: number; } export type CorporatePlan = { id: number; corporate_id: number; code: string; + service_code: string; + limit_rules: number; + corporate_plan_id: number; name: string; description: string | null; + type: number; active: boolean | number; } @@ -101,6 +119,7 @@ export type Plan = { currency: string; max_surgery_reinstatement_days: string; max_surgery_periode_days: string; + active: number } export type CorporateBenefit = { @@ -113,6 +132,7 @@ export type CorporateBenefit = { } export type Benefit = { + id : number; service_code : string; plan_code : string; benefit_code : string; @@ -170,6 +190,11 @@ export type Benefit = { currency : string; show_benefit_item : string; show_benefit_value : string; + plan : Plan; + benefit: Benefit; + corporate_benefit_code: string; + active: number; + limit_free_tc: number; } export type CorporateService = { @@ -182,3 +207,14 @@ export type CorporateService = { status: string; configurations: any; } + +export type MasterExclusion = { + id?: string | number; + name?: string; + code: string; + description?: string; +} + +export type CorporateId = { + corporate_id?: number +} \ No newline at end of file diff --git a/frontend/dashboard/src/@types/diagnosis.ts b/frontend/dashboard/src/@types/diagnosis.ts index 2d2d65db..8bd53e58 100644 --- a/frontend/dashboard/src/@types/diagnosis.ts +++ b/frontend/dashboard/src/@types/diagnosis.ts @@ -5,9 +5,12 @@ export type Icd = { version?: string; code: string; name: string; + service_code: string; + active: number; description?: any; childs?: Icd[]; status: string; + rules:any }; diff --git a/frontend/dashboard/src/@types/member.ts b/frontend/dashboard/src/@types/member.ts index c38b0640..45bfc833 100644 --- a/frontend/dashboard/src/@types/member.ts +++ b/frontend/dashboard/src/@types/member.ts @@ -1,5 +1,7 @@ // ---------------------------------------------------------------------- +import { Corporate, Plan } from "./corporates"; + export type Member = { id: string, member_id: string, @@ -18,4 +20,7 @@ export type Member = { relation_with_principal: string, bpjs_class: string, active: string, + current_plans: Plan, + current_corporate: Corporate, + full_name: string, }; diff --git a/frontend/dashboard/src/@types/pharmacy-and-delivery-managements.ts b/frontend/dashboard/src/@types/pharmacy-and-delivery-managements.ts new file mode 100644 index 00000000..661f4a46 --- /dev/null +++ b/frontend/dashboard/src/@types/pharmacy-and-delivery-managements.ts @@ -0,0 +1,8 @@ +export type Drug = { + id: number; + type: string; + code: string; + name: string; + version:string; + active: number; +} \ No newline at end of file diff --git a/frontend/dashboard/src/App.tsx b/frontend/dashboard/src/App.tsx index 33c51771..e3a87817 100644 --- a/frontend/dashboard/src/App.tsx +++ b/frontend/dashboard/src/App.tsx @@ -10,12 +10,15 @@ import { ProgressBarStyle } from './components/ProgressBar'; import ThemeColorPresets from './components/ThemeColorPresets'; import MotionLazyContainer from './components/animate/MotionLazyContainer'; import { SnackbarProvider } from 'notistack'; +import { Provider } from 'react-redux'; +import store from "./store" // ---------------------------------------------------------------------- export default function App() { return ( - + + @@ -29,5 +32,6 @@ export default function App() { + ); } diff --git a/frontend/dashboard/src/components/DialogUpdateStatus.tsx b/frontend/dashboard/src/components/DialogUpdateStatus.tsx new file mode 100644 index 00000000..71b8f908 --- /dev/null +++ b/frontend/dashboard/src/components/DialogUpdateStatus.tsx @@ -0,0 +1,208 @@ +import * as Yup from 'yup'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { Dialog, DialogTitle, DialogContent, Stack, Typography, IconButton, Grid } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import { ReactElement } from 'react'; +import Iconify from './Iconify'; +import { Card } from '@mui/material'; +import { FormProvider, RHFTextField, RHFSwitch, RHFSelect } from './hook-form'; +import { Button } from '@mui/material'; +import { LoadingButton } from '@mui/lab'; +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; + +// ---------------------------------------------------------------------- + +type DataContent = { + code: string; + name: string; + id: number; + status: string +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + maxWidth?: string; + data?: DataContent | undefined; + description: string; +}; + +type FormValuesProps = { + value: string; + active: boolean; +}; + + +// ---------------------------------------------------------------------- + +const DialogUpdateStatus = ({ title, openDialog, setOpenDialog, data, maxWidth, content }: MuiDialogProps) => { + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Corporate Status is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + + useEffect(() => { + if (openDialog === false) { + reset(); + } + }, [openDialog, reset]); + + const handleClose = () => { + setOpenDialog(false); + }; + + const handleUpdate = (id: number, status: number) => { + axios + .put(`/corporates/${id}/activation`, { + // service_code: service.service_code, + active: status, + }) + .then((res) => { + handleClose() + window.location.reload(); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + } + let maxWidthDialog = 'md'; + + if (maxWidth) { + maxWidthDialog = maxWidth; + } + + const onSubmit = async (row : any) => { + console.log('test') + }; + + return ( + + + + {title?.icon ? ( + + + {title?.name} + + ) : ( + {title?.name ? title?.name : ''} + )} + + + + + + + + {/* + {description} + + + + + Code + + + {data?.code} + + + Corporate Name + + + {data?.name} + + + + + + Reason for update* + + + + + + + + + + + + + + + {data?.status == 1 ? + + : } + + */} + {content} + + + + ); +}; + +export default DialogUpdateStatus; diff --git a/frontend/dashboard/src/components/Label.tsx b/frontend/dashboard/src/components/Label.tsx new file mode 100644 index 00000000..c633ec4f --- /dev/null +++ b/frontend/dashboard/src/components/Label.tsx @@ -0,0 +1,98 @@ +// @mui +import { alpha, Theme, useTheme, styled } from '@mui/material/styles'; +import { BoxProps } from '@mui/material'; +// theme +import { ColorSchema } from '../theme/palette'; + +// ---------------------------------------------------------------------- + +type LabelColor = 'default' | 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'; + +type LabelVariant = 'filled' | 'outlined' | 'ghost'; + +const RootStyle = styled('span')( + ({ + theme, + ownerState, + }: { + theme: Theme; + ownerState: { + color: LabelColor; + variant: LabelVariant; + }; + }) => { + const isLight = theme.palette.mode === 'light'; + const { color, variant } = ownerState; + + const styleFilled = (color: ColorSchema) => ({ + color: theme.palette[color].contrastText, + backgroundColor: theme.palette[color].main, + }); + + const styleOutlined = (color: ColorSchema) => ({ + color: theme.palette[color].main, + backgroundColor: 'transparent', + border: `1px solid ${theme.palette[color].main}`, + }); + + const styleGhost = (color: ColorSchema) => ({ + color: theme.palette[color][isLight ? 'dark' : 'light'], + backgroundColor: alpha(theme.palette[color].main, 0.16), + }); + + return { + height: 22, + minWidth: 22, + lineHeight: 0, + borderRadius: 6, + // cursor: 'default', + alignItems: 'center', + whiteSpace: 'nowrap', + display: 'inline-flex', + justifyContent: 'center', + padding: theme.spacing(0, 1), + color: theme.palette.grey[800], + fontSize: theme.typography.pxToRem(12), + fontFamily: theme.typography.fontFamily, + backgroundColor: theme.palette.grey[300], + fontWeight: theme.typography.fontWeightBold, + + ...(color !== 'default' + ? { + ...(variant === 'filled' && { ...styleFilled(color) }), + ...(variant === 'outlined' && { ...styleOutlined(color) }), + ...(variant === 'ghost' && { ...styleGhost(color) }), + } + : { + ...(variant === 'outlined' && { + backgroundColor: 'transparent', + color: theme.palette.text.primary, + border: `1px solid ${theme.palette.grey[500_32]}`, + }), + ...(variant === 'ghost' && { + color: isLight ? theme.palette.text.secondary : theme.palette.common.white, + backgroundColor: theme.palette.grey[500_16], + }), + }), + }; + } +); + +// ---------------------------------------------------------------------- + +interface Props extends BoxProps { + color?: LabelColor; + variant?: LabelVariant; +} + +export default function Label({ color = 'default', variant = 'ghost', children, sx }: Props) { + const theme = useTheme(); + + return ( + + {children} + + ); +} + + diff --git a/frontend/dashboard/src/components/MoreMenu.tsx b/frontend/dashboard/src/components/MoreMenu.tsx new file mode 100644 index 00000000..90aed362 --- /dev/null +++ b/frontend/dashboard/src/components/MoreMenu.tsx @@ -0,0 +1,58 @@ +import Iconify from '@/components/Iconify'; +import MenuPopover from './MenuPopover'; +import { IconButton, MenuItem } from '@mui/material'; +import { useEffect, useState } from 'react'; + +// ---------------------------------------------------------------------- + +type Props = { + actions: React.ReactNode; +}; + +export default function MoreMenu({ actions }: Props) { + const [open, setOpen] = useState(null); + + // Close menu popover + useEffect(() => { + setOpen(null); + }, [actions]) + + const handleOpen = (event: React.MouseEvent) => { + setOpen(event.currentTarget); + }; + + const handleClose = () => { + setOpen(null); + }; + + return ( + <> + + + + + + {actions} + + + + ); +} diff --git a/frontend/dashboard/src/components/MuiDialog.tsx b/frontend/dashboard/src/components/MuiDialog.tsx index 54ee1110..c9b57835 100644 --- a/frontend/dashboard/src/components/MuiDialog.tsx +++ b/frontend/dashboard/src/components/MuiDialog.tsx @@ -1,4 +1,4 @@ -import { Dialog, DialogTitle, DialogContent, Stack, Typography, IconButton } from '@mui/material'; +import { Dialog, DialogTitle, DialogContent, Stack, Typography, IconButton, DialogActions } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import { ReactElement } from 'react'; import Iconify from './Iconify'; @@ -13,12 +13,13 @@ type MuiDialogProps = { openDialog: boolean; setOpenDialog: Function; content?: ReactElement; + action?: ReactElement|null; maxWidth?: string; }; // ---------------------------------------------------------------------- -const MuiDialog = ({ title, openDialog, setOpenDialog, content, maxWidth }: MuiDialogProps) => { +const MuiDialog = ({ title, openDialog, setOpenDialog, content, action, maxWidth }: MuiDialogProps) => { const handleClose = () => { setOpenDialog(false); }; @@ -46,9 +47,15 @@ const MuiDialog = ({ title, openDialog, setOpenDialog, content, maxWidth }: MuiD
+ {content ? content : 'Testing Content Dialog'} + + {action ? ( + {action} + ) : ''} +
); }; diff --git a/frontend/dashboard/src/components/ThemeColorPresets.tsx b/frontend/dashboard/src/components/ThemeColorPresets.tsx index 03d43c43..56c57c2d 100644 --- a/frontend/dashboard/src/components/ThemeColorPresets.tsx +++ b/frontend/dashboard/src/components/ThemeColorPresets.tsx @@ -21,7 +21,7 @@ export default function ThemeColorPresets({ children }: Props) { ...defaultTheme, palette: { ...defaultTheme.palette, - primary: setColor, + // primary: setColor, }, customShadows: { ...defaultTheme.customShadows, diff --git a/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx b/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx index 960c0d11..edbca61e 100644 --- a/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx +++ b/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx @@ -291,8 +291,8 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog spacing={1} sx={{ marginY: 2 }} > - {claim.files_by_type?.result && - claim.files_by_type.result.map((file, index) => ( + {claim.files_by_type?.claim_result && + claim.files_by_type.claim_result.map((file, index) => ( diff --git a/frontend/dashboard/src/components/history/History.tsx b/frontend/dashboard/src/components/history/History.tsx new file mode 100644 index 00000000..f657b5ab --- /dev/null +++ b/frontend/dashboard/src/components/history/History.tsx @@ -0,0 +1,209 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + Container, + FormControl, + Grid, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Stack, +} from '@mui/material'; +import * as React from 'react'; +import { useParams } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; +import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; +import { useContext, useEffect, useState } from 'react'; +import MuiAccordionSummary, { + AccordionSummaryProps, +} from '@mui/material/AccordionSummary'; +import useSettings from '../../hooks/useSettings'; +import axios from '../../utils/axios'; +import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import MuiAccordionDetails from '@mui/material/AccordionDetails'; +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; +import { Corporate } from '@/@types/corporates'; +import { fDate, fDateTime } from '@/utils/formatTime'; + +const Accordion = styled((props: AccordionProps) => ( + +))(({ theme }) => ({ + border: `1px solid ${theme.palette.divider}`, + '&:not(:last-child)': { + borderBottom: 0, + }, + '&:before': { + display: 'none', + }, +})); + +const AccordionSummary = styled((props: AccordionSummaryProps) => ( + } + {...props} + /> +))(({ theme }) => ({ + backgroundColor: + theme.palette.mode === 'dark' + ? 'rgba(255, 255, 255, .05)' + : 'rgba(0, 0, 0, .03)', + flexDirection: 'row-reverse', + '& .MuiAccordionSummary-expandIconWrapper.Mui-expanded': { + transform: 'rotate(90deg)', + }, + '& .MuiAccordionSummary-content': { + marginLeft: theme.spacing(1), + }, +})); + +const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ + padding: theme.spacing(2), + borderTop: '1px solid rgba(0, 0, 0, .125)', +})); + +export default function CustomizedAccordions() { + const [expanded, setExpanded] = React.useState('panel1'); + + const handleChange = + (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + const pageTitle = 'Audittrail Corporate'; + + const { themeStretch } = useSettings(); + + const { corporate_id } = useParams(); + + const [corporate, setCorporate] = useState(); + const [ currentCorporate, setCurrentCorporate ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\Corporate'; + const url = `/audittrail/${corporate_id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentCorporate(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + + }, [configuredCorporateContext]); + + return ( +
+ + {currentCorporate?.data.map((item, index) => ( + + + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + + + + + Field + Old Value + New Values + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'deleted_by' || key === 'created_by' || key === 'updated_by') { + return null; // Melewati iterasi saat key adalah 'deleted_by' + } + switch (key) { + case 'welcome_message': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'help_text': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'active': + renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; + value = value == 1 ? 'Active' : 'Inactive'; + break; + case 'created_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'delete_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + + const field = key.charAt(0).toUpperCase() + key.slice(1); + + return ( + + {`${field}`} + {`${value}`} + {renderedValue} + + ); + })} + + + + + ))} +
+ ); +} diff --git a/frontend/dashboard/src/components/hook-form/RHFAutocompleteNonTerminology.tsx b/frontend/dashboard/src/components/hook-form/RHFAutocompleteNonTerminology.tsx new file mode 100644 index 00000000..07bdeea1 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/RHFAutocompleteNonTerminology.tsx @@ -0,0 +1,59 @@ +import { FormHelperText } from "@mui/material"; +import { Autocomplete, TextField } from "@mui/material"; +import { Controller, useFormContext } from "react-hook-form"; + +type Props = { + name: string, + label: string, + options: string[]; + disabled?: boolean, +} + +const RHFAutocompleteNonTerminology = ({ ...props }: Props) => { + const { control } = useFormContext(); + + return ( + { + let xValue = (value && value.codingCode!=="" ? value : null ); + + return ( + <> + { + onChange(newValue); + }} + renderInput={(params) => ( + + )} + /> + + {!!error && ( + + {error.message} + + )} + + ) + }} + + /> + ) + +} + +export default RHFAutocompleteNonTerminology \ No newline at end of file diff --git a/frontend/dashboard/src/components/hook-form/RHFAutocompleteV2.tsx b/frontend/dashboard/src/components/hook-form/RHFAutocompleteV2.tsx new file mode 100644 index 00000000..0360b3f4 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/RHFAutocompleteV2.tsx @@ -0,0 +1,102 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Autocomplete, AutocompleteProps, FormHelperText, TextField, UseAutocompleteProps } from '@mui/material'; +import { useState } from 'react'; +import { FilterOptionsState } from '@mui/material/useAutocomplete'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string, + label: string, + options: any, + getOptionLabel: (option: any) => string, + isOptionEqualToValue: any, + disableClearable: boolean, + freeSolo: boolean, + renderOption?: any, + onInputChange?: any, + onKeyDown?: any, + onKeyPress?: any, + noOptionsText?: string, + popupIcon?: any, + disabled?: boolean, + sx?: any, + sxTextField?: any, + InputProps?: any, + onSelect?: (option: any) => void, + filterOptions?: (options: any[], state: FilterOptionsState) => any[]; +} + +const RHFAutocompleteV2 = ( {name, label, options, ...rest} : IProps ) => { + const { control } = useFormContext(); + const { + sx, sxTextField, InputProps, + onSelect, + getOptionLabel, filterOptions, + popupIcon, + isOptionEqualToValue, disableClearable, + freeSolo, renderOption, + onInputChange, onKeyDown, onKeyPress, + noOptionsText, disabled } = rest; + + return ( + { + return ( + <> + ( + + )} + onChange={(e, newValue) => { + onChange(newValue); + onSelect && onSelect(newValue); + }} + /> + + {!!error && ( + + {error.message} + + )} + + + + ); + }} + /> + ); + + + +} + +export default RHFAutocompleteV2; \ No newline at end of file diff --git a/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx b/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx index cac7f8bb..5aceb667 100644 --- a/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx +++ b/frontend/dashboard/src/components/hook-form/RHFCheckbox.tsx @@ -1,7 +1,8 @@ // form import { useFormContext, Controller } from 'react-hook-form'; // @mui -import { Checkbox, FormControlLabel, FormGroup, FormControlLabelProps } from '@mui/material'; +import { Checkbox, FormControlLabel, FormGroup, FormControlLabelProps, SxProps } from '@mui/material'; +import { Theme } from '@mui/system'; // ---------------------------------------------------------------------- @@ -77,9 +78,10 @@ interface optionsCustomInterface { interface RHFCustomMultiCheckboxProps { name: string; options: optionsCustomInterface[]; + sx?: SxProps } -export function RHFCustomMultiCheckbox({ name, options, ...other }: RHFCustomMultiCheckboxProps) { +export function RHFCustomMultiCheckbox({ name, options, sx, ...other }: RHFCustomMultiCheckboxProps) { const { control } = useFormContext(); return ( @@ -93,7 +95,7 @@ export function RHFCustomMultiCheckbox({ name, options, ...other }: RHFCustomMul : [...field.value, option.value]; return ( - + {options.map((option, index) => ( + ( + <> + field.onChange(date)} + inputFormat={dateFormat} + value={field.value} + mask={''} + minDate={(minDate) ? new Date(minDate) : null} + maxDate={(maxDate) ? new Date(maxDate) : null} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} diff --git a/frontend/dashboard/src/components/hook-form/RHFDatepicker.tsx b/frontend/dashboard/src/components/hook-form/RHFDatepicker.tsx index 0b00d37c..1cb778bb 100644 --- a/frontend/dashboard/src/components/hook-form/RHFDatepicker.tsx +++ b/frontend/dashboard/src/components/hook-form/RHFDatepicker.tsx @@ -62,6 +62,7 @@ export default function RHFDatepicker({ name, ...other }: IProps & TextFieldProp value={field.value} inputFormat="dd/MMM/yyyy" // inputFormat="dd - MMM - yyyy" + mask='' onChange={(value) => { field.onChange(value); }} diff --git a/frontend/dashboard/src/components/hook-form/v2/FormProvider.tsx b/frontend/dashboard/src/components/hook-form/v2/FormProvider.tsx new file mode 100644 index 00000000..c57e3cd8 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/FormProvider.tsx @@ -0,0 +1,26 @@ +import { ReactNode } from 'react'; +// form +import { FormProvider as Form, UseFormReturn } from 'react-hook-form'; + +// ---------------------------------------------------------------------- + +type Props = { + children: ReactNode; + methods: UseFormReturn; + onSubmit?: VoidFunction; + preventEnterSubmit?: boolean; +}; + +export default function FormProvider({ children, onSubmit, methods, preventEnterSubmit }: Props) { + const checkKeyDown = (e: any) => { + if (e.key === 'Enter' && preventEnterSubmit){ + e.preventDefault(); + } + }; + + return ( +
+ checkKeyDown(e)}>{children}
+ + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFAutocomplete.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFAutocomplete.tsx new file mode 100644 index 00000000..b52f932a --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFAutocomplete.tsx @@ -0,0 +1,102 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Autocomplete, AutocompleteProps, FormHelperText, TextField, UseAutocompleteProps } from '@mui/material'; +import { useState } from 'react'; +import { FilterOptionsState } from '@mui/material/useAutocomplete'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string, + label: string, + options: any, + getOptionLabel: (option: any) => string, + isOptionEqualToValue: any, + disableClearable: boolean, + freeSolo: boolean, + renderOption?: any, + onInputChange?: any, + onKeyDown?: any, + onKeyPress?: any, + noOptionsText?: string, + popupIcon?: any, + disabled?: boolean, + sx?: any, + sxTextField?: any, + InputProps?: any, + onSelect?: (option: any) => void, + filterOptions?: (options: any[], state: FilterOptionsState) => any[]; +} + +const RHFAutocomplete = ( {name, label, options, ...rest} : IProps ) => { + const { control } = useFormContext(); + const { + sx, sxTextField, InputProps, + onSelect, + getOptionLabel, filterOptions, + popupIcon, + isOptionEqualToValue, disableClearable, + freeSolo, renderOption, + onInputChange, onKeyDown, onKeyPress, + noOptionsText, disabled } = rest; + + return ( + { + return ( + <> + ( + + )} + onChange={(e, newValue) => { + onChange(newValue); + onSelect && onSelect(newValue); + }} + /> + + {!!error && ( + + {error.message} + + )} + + + + ); + }} + /> + ); + + + +} + +export default RHFAutocomplete; \ No newline at end of file diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFAutocompleteTags.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFAutocompleteTags.tsx new file mode 100644 index 00000000..c8195440 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFAutocompleteTags.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; +import Chip from '@mui/material/Chip'; +import TextField from '@mui/material/TextField'; +import Autocomplete from '@mui/material/Autocomplete'; +import { FormHelperText } from '@mui/material'; +import { Controller, useFormContext } from 'react-hook-form'; +import { useEffect } from 'react'; + +interface IProps { + name: string, + label: string, + options: any, + defaultValue: any +} + +const RHFAutocompleteTags = ({ name, label, options, defaultValue, ...rest }: IProps) => { + const { control } = useFormContext(); + const fixedOptions: any = []; + const [value, setValue] = React.useState([...fixedOptions]); + + useEffect(() => { + setValue(defaultValue) + }, [options, defaultValue]) + + return ( + { + return ( + <> + { + setValue([ + ...fixedOptions, + ...newValue.filter((option) => fixedOptions.indexOf(option) === -1), + ]); + onChange(newValue); + }} + isOptionEqualToValue={(option, value)=>{ + return option.optionID === value.optionID + }} + options={options} + getOptionLabel={(option: { optionID: string, optionLabel: string }) => `${option.optionLabel}` || ""} + renderTags={(tagValue, getTagProps) => + tagValue.map((option, index) => ( + + + + )) + } + renderInput={(params) => ( + + )} + /> + {!!error && ( + + {error.message} + + )} + + ); + }} + /> + + ); +} + +export default RHFAutocompleteTags; \ No newline at end of file diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFCheckbox.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFCheckbox.tsx new file mode 100644 index 00000000..c1ad1d7c --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFCheckbox.tsx @@ -0,0 +1,111 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Checkbox, FormControlLabel, FormGroup, FormControlLabelProps, Grid, FormHelperText } from '@mui/material'; +import RHFDatePicker from './RHFDatePicker'; + +// ---------------------------------------------------------------------- + +interface RHFCheckboxProps extends Omit { + name: string; +} + +export function RHFCheckbox({ name, ...other }: RHFCheckboxProps) { + const { control } = useFormContext(); + + return ( + ( + <> + + {!!error && ( + + {error.message} + + )} + + + )} + /> + } + {...other} + /> + ); +} + +interface RHFCheckboxEndDateProps extends Omit { + name: string; + endPeriodProp: any; + idx?: any; +} + +export function RHFCheckboxEndDate({ name, endPeriodProp, idx, ...other }: RHFCheckboxEndDateProps) { + const { control } = useFormContext(); + + return ( + + { + endPeriodProp(e.target.checked, idx) + }} + /> + } + /> + } + {...other} + /> + ); +} + + +// ---------------------------------------------------------------------- + +interface RHFMultiCheckboxProps extends Omit { + name: string; + options: string[]; +} + +export function RHFMultiCheckbox({ name, options, ...other }: RHFMultiCheckboxProps) { + const { control } = useFormContext(); + + return ( + { + const onSelected = (option: string) => + field.value.includes(option) + ? field.value.filter((value: string) => value !== option) + : [...field.value, option]; + + return ( + + {options.map((option) => ( + field.onChange(onSelected(option))} + /> + } + label={option} + {...other} + /> + ))} + + ); + }} + /> + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFDatePicker.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFDatePicker.tsx new file mode 100644 index 00000000..e2fa986d --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFDatePicker.tsx @@ -0,0 +1,54 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDatePicker, LocalizationProvider } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + dateFormat: string; + fullWidth?: boolean; + minDate?: any; + maxDate?: any; + disabled?: boolean; +} + +export default function RHFDatePicker({ name, label, dateFormat, minDate, maxDate, disabled, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth } = other; + + return ( + + ( + <> + field.onChange(date)} + inputFormat={dateFormat} + value={field.value} + mask={''} + minDate={(minDate) ? new Date(minDate) : null} + maxDate={(maxDate) ? new Date(maxDate) : null} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFDateTimePicker.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFDateTimePicker.tsx new file mode 100644 index 00000000..6dbc7eb2 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFDateTimePicker.tsx @@ -0,0 +1,53 @@ +// form +import { useFormContext, Controller, useForm } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDateTimePicker, LocalizationProvider } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + dateFormat: string; + fullWidth?: boolean; + onChange?: (date: any) => void; + disabled?: boolean; +} + +export default function RHFDateTimePicker({ name, label, dateFormat, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth, onChange, disabled } = other; + + return ( + + ( + <> + { + field.onChange(date); + onChange && onChange(date); + }} + inputFormat={dateFormat} + value={field.value} + mask={''} + disabled={disabled} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFEditor.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFEditor.tsx new file mode 100644 index 00000000..84cf1c27 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFEditor.tsx @@ -0,0 +1,37 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText } from '@mui/material'; +// +import Editor, { Props as EditorProps } from '../../editor'; + +// ---------------------------------------------------------------------- + +interface Props extends EditorProps { + name: string; +} + +export default function RHFEditor({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + ( + + {error?.message} + + } + {...other} + /> + )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFRadioGroup.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFRadioGroup.tsx new file mode 100644 index 00000000..a2776f13 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFRadioGroup.tsx @@ -0,0 +1,61 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { + Radio, + RadioGroup, + FormHelperText, + RadioGroupProps, + FormControlLabel, +} from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + options: string[]; + getOptionLabel?: string[]; + fullWidth?: boolean; + disabled?: boolean; +} + +export default function RHFRadioGroup({ + name, + options, + getOptionLabel, + fullWidth, + disabled, + ...other +}: IProps & RadioGroupProps) { + const { control } = useFormContext(); + + return ( + ( +
+ + {options.map((option, index) => ( + } + label={getOptionLabel?.length ? getOptionLabel[index] : option} + disabled={disabled} + /> + + ))} + + + {!!error && ( + + {error.message} + + )} +
+ )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFSelect.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFSelect.tsx new file mode 100644 index 00000000..4f6c02b8 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFSelect.tsx @@ -0,0 +1,35 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { TextField, TextFieldProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + children: any; +} + +export default function RHFSelect({ name, children, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + + {children} + + )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFSelectV2.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFSelectV2.tsx new file mode 100644 index 00000000..9337605f --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFSelectV2.tsx @@ -0,0 +1,32 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormControl, FormHelperText, InputLabel, Select, SelectProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + id: string; + children: any; +} + +export default function RHFSelectV2({ name, id, children, ...other }: IProps & SelectProps) { + const { control } = useFormContext(); + + return ( + ( + + {other.label} + + {error && {error.message}} + + )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFSwitch.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFSwitch.tsx new file mode 100644 index 00000000..a56c548a --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFSwitch.tsx @@ -0,0 +1,29 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Switch, FormControlLabel, FormControlLabelProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +type IProps = Omit; + +interface Props extends IProps { + name: string; +} + +export default function RHFSwitch({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + } + /> + } + {...other} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFTextField.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFTextField.tsx new file mode 100644 index 00000000..6ffc8208 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFTextField.tsx @@ -0,0 +1,29 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { TextField, TextFieldProps, Typography } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextField({ name, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + <> + {/* + * + */} + + + )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldMoney.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldMoney.tsx new file mode 100644 index 00000000..c0ecd1cc --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldMoney.tsx @@ -0,0 +1,40 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextFieldMoney({ name, ...other }: IProps & TextFieldProps) { + const { control, watch, setValue } = useFormContext(); + const values = watch(); + + return ( + ( + <> + Rp, + inputComponent: MoneyFormat as any, + }} + /> + + )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldNumber.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldNumber.tsx new file mode 100644 index 00000000..1646f7a8 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldNumber.tsx @@ -0,0 +1,61 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; +// import AutoNumeric from "autonumeric" +// import { useEffect, useRef } from 'react'; +// import React from 'react'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + endAdornment?: React.ReactNode; +} + +export default function RHFTextFieldNumber({ name, endAdornment, ...other }: IProps & TextFieldProps) { + const { control, watch, setValue } = useFormContext(); + const values = watch(); + + // const ref = React.createRef(); + // const mountedRef = useRef(false); + // useEffect(() => { + // mountedRef.current = true; + // new AutoNumeric(ref.current as HTMLElement) + + // return () => { + // mountedRef.current = false; + // } + // }, []) + + + + return ( + ( + <> + { (watch(name) == '0') && setValue(name, '') }} + onBlur={() => { (watch(name) == '') && setValue(name, '0') }} + {...other} + inputProps={{ min: 0, max: 5, style: { textAlign: 'right' } }} + InputProps={{ + inputComponent: MoneyFormat as any, + endAdornment: endAdornment, + + }} + + /> + + )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldPercentage.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldPercentage.tsx new file mode 100644 index 00000000..f09eba7f --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFTextFieldPercentage.tsx @@ -0,0 +1,39 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextFieldPercentage({ name, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + <> + %, + inputComponent: MoneyFormat as any, + }} + /> + + )} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFTimePicker.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFTimePicker.tsx new file mode 100644 index 00000000..70e9d8fe --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFTimePicker.tsx @@ -0,0 +1,46 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDatePicker, LocalizationProvider, TimePicker } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + fullWidth?: boolean; + disabled?: boolean; +} + +export default function RHFTimePicker({ name, label, disabled, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth } = other; + + return ( + + ( + <> + field.onChange(date)} + value={field.value} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/components/hook-form/v2/RHFUpload.tsx b/frontend/dashboard/src/components/hook-form/v2/RHFUpload.tsx new file mode 100644 index 00000000..fddf48d6 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/RHFUpload.tsx @@ -0,0 +1,112 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText } from '@mui/material'; +// type +import { + UploadAvatar, + UploadMultiFile, + UploadSingleFile, + UploadProps, + UploadMultiFileProps, +} from '../../upload'; +import { Accept } from 'react-dropzone'; + +// ---------------------------------------------------------------------- + +interface Props extends Omit { + name: string; +} + +export function RHFUploadAvatar({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && !field.value; + + return ( +
+ + {checkError && ( + + {error.message} + + )} +
+ ); + }} + /> + ); +} + +// ---------------------------------------------------------------------- + +export function RHFUploadSingleFile({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && !field.value; + + return ( + + {error.message} + + ) + } + {...other} + /> + ); + }} + /> + ); +} + +// ---------------------------------------------------------------------- + +interface RHFUploadMultiFileProps extends Omit { + name: string; +} + +export function RHFUploadMultiFile({ name, ...other }: RHFUploadMultiFileProps) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && field.value?.length === 0; + + return ( + + {error?.message} + + ) + } + {...other} + /> + ); + }} + /> + ); +} diff --git a/frontend/dashboard/src/components/hook-form/v2/index.ts b/frontend/dashboard/src/components/hook-form/v2/index.ts new file mode 100644 index 00000000..f58a39a7 --- /dev/null +++ b/frontend/dashboard/src/components/hook-form/v2/index.ts @@ -0,0 +1,12 @@ +export * from './RHFCheckbox'; +export * from './RHFUpload'; + +export { default as FormProvider } from './FormProvider'; + +export { default as RHFSwitch } from './RHFSwitch'; +export { default as RHFAutocomplete } from './RHFAutocomplete'; +export { default as RHFSelect } from './RHFSelect'; +export { default as RHFEditor } from './RHFEditor'; +export { default as RHFTextField } from './RHFTextField'; +export { default as RHFRadioGroup } from './RHFRadioGroup'; +export { default as RHFSelectV2 } from './RHFSelectV2'; diff --git a/frontend/dashboard/src/components/numeric_format/DiscountPctFormat.tsx b/frontend/dashboard/src/components/numeric_format/DiscountPctFormat.tsx new file mode 100644 index 00000000..78c3ec6e --- /dev/null +++ b/frontend/dashboard/src/components/numeric_format/DiscountPctFormat.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { InputAttributes, NumericFormat, NumericFormatProps } from "react-number-format"; + +interface CustomProps { + onChange: (event: { target: { name: string; value: string } }) => void; + name: string; +} + +const DiscountPctFormat = React.forwardRef< + NumericFormatProps, + CustomProps +>(function DiscountPctFormat(props, ref) { + const { onChange, ...other } = props; + + return ( + { + onChange({ + target: { + name: props.name, + value: values.value, + }, + }); + }} + thousandSeparator + valueIsNumericString + allowLeadingZeros={false} + /> + ); +}); + +export default DiscountPctFormat; \ No newline at end of file diff --git a/frontend/dashboard/src/components/numeric_format/MoneyFormat.tsx b/frontend/dashboard/src/components/numeric_format/MoneyFormat.tsx new file mode 100644 index 00000000..6d564143 --- /dev/null +++ b/frontend/dashboard/src/components/numeric_format/MoneyFormat.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { InputAttributes, NumericFormat, NumericFormatProps } from "react-number-format"; + +interface CustomProps { + onChange: (event: { target: { name: string; value: string } }) => void; + name: string; +} + +const MoneyFormat = React.forwardRef< + NumericFormatProps, + CustomProps +>(function MoneyFormat(props, ref) { + const { onChange, ...other } = props; + + return ( + { + onChange({ + target: { + name: props.name, + value: values.value, + }, + }); + }} + thousandSeparator + valueIsNumericString + allowLeadingZeros={false} + /> + ); +}); + +export default MoneyFormat; \ No newline at end of file diff --git a/frontend/dashboard/src/components/table/Index.ts b/frontend/dashboard/src/components/table/Index.ts new file mode 100644 index 00000000..8b4b0f88 --- /dev/null +++ b/frontend/dashboard/src/components/table/Index.ts @@ -0,0 +1 @@ +export { default as TableMoreMenu } from './TableMoreMenu'; \ No newline at end of file diff --git a/frontend/dashboard/src/components/table/TableMoreMenu.tsx b/frontend/dashboard/src/components/table/TableMoreMenu.tsx new file mode 100644 index 00000000..403fd5df --- /dev/null +++ b/frontend/dashboard/src/components/table/TableMoreMenu.tsx @@ -0,0 +1,60 @@ +import { useEffect, useState } from 'react'; +// @mui +import { IconButton } from '@mui/material'; +// +import Iconify from '../Iconify'; +import MenuPopover from '../MenuPopover'; + +// ---------------------------------------------------------------------- + +type Props = { + actions: React.ReactNode; + disableRipple?: boolean; +}; + +export default function TableMoreMenu({ actions, disableRipple }: Props) { + const [open, setOpen] = useState(null); + + // Close menu popover + useEffect(() => { + setOpen(null); + }, [actions]) + + const handleOpen = (event: React.MouseEvent) => { + setOpen(event.currentTarget); + }; + + const handleClose = () => { + setOpen(null); + }; + + return ( + <> + + + + + + {actions} + + + ); +} diff --git a/frontend/dashboard/src/contexts/ConfiguredCorporateContext.tsx b/frontend/dashboard/src/contexts/ConfiguredCorporateContext.tsx index 5fde9420..59270cf0 100644 --- a/frontend/dashboard/src/contexts/ConfiguredCorporateContext.tsx +++ b/frontend/dashboard/src/contexts/ConfiguredCorporateContext.tsx @@ -26,9 +26,6 @@ function ConfiguredCorporateProvider({ children }: ConfiguredCorporateProviderPr const [corporate, setCorporate] = useState(null); useEffect(() => { - // Load Corporate - console.log('calling corporate' + corporate_id); - axios.get(`corporates/${corporate_id}`) .then((res) => { setCorporate(res.data) diff --git a/frontend/dashboard/src/hooks/useLoadOnScroll.ts b/frontend/dashboard/src/hooks/useLoadOnScroll.ts new file mode 100644 index 00000000..a43ed6f7 --- /dev/null +++ b/frontend/dashboard/src/hooks/useLoadOnScroll.ts @@ -0,0 +1,98 @@ +import { RefObject, useEffect, useRef, useState } from 'react'; + +interface FetchFunction { + (page: number): Promise; +} + +const useLoadOnScroll = (executeFetch: FetchFunction) => { + const [data, setData] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [page, setPage] = useState(1); + const [listener, setListener] = useState(1); + const [lastPage, setLastPage] = useState(false); + + const fetchData = async (isSearch?: boolean) => { + if (!lastPage || isSearch === true) + if (isLoading === false) { + setIsLoading(true); + if (isSearch === true) { + const newData = await executeFetch(1); + if (newData.length > 0) { + setData(newData); + setPage((prevPage) => 2); + } else { + setLastPage(true); + setData([]); + } + } else { + const newData = await executeFetch(page); + if (newData.length > 0) { + setData((prevData) => [...prevData, ...newData]); + setPage((prevPage) => prevPage + 1); + } else { + setLastPage(true); + } + } + + setIsLoading(false); + } + }; + + const refetchData = () => { + setPage(1); + setListener((prev) => prev + 1); + }; + + const resetLastPage = () => { + setLastPage(false); + }; + + useEffect(() => { + fetchData(); + }, [listener]); + + // useEffect(() => { + // if (data.length === 0) { + // fetchData(); + // } + // }, [data]); + + const handleScroll = () => { + const { scrollTop, clientHeight, scrollHeight } = document.documentElement; + + if (scrollTop + clientHeight >= scrollHeight - 1) { + setListener((prevListener) => prevListener + 1); + } + }; + + const resetSearch = () => { + console.log('reset search'); + fetchData(true); + resetLastPage(); + }; + + useEffect(() => { + window.addEventListener('scroll', handleScroll); + + return () => { + window.removeEventListener('scroll', handleScroll); + }; + }, []); + + const onClose = () => { + setData([]); + setPage(1); + setLastPage(false); + }; + + const onOpen = () => { + setData([]); + setLastPage(false); + fetchData(true); + }; + + // setData and setPage to reset when the dialog closed + return { data, isLoading, setPage, setData, resetSearch, resetLastPage, onClose, onOpen, refetchData }; +}; + +export default useLoadOnScroll; diff --git a/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx b/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx index f99b2ef4..0827cd38 100644 --- a/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx +++ b/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx @@ -42,6 +42,7 @@ const navConfig = [ { title: 'PHARMACY & DELIVERY MANAGEMENT', children: [ + { title: 'Drug', path: '/master/drugs'}, { title: 'Inventory', path: '/inventory' }, { title: 'Delivery Services', path: '/delivery' }, ], @@ -52,9 +53,8 @@ const navConfig = [ children: [ { title: 'Corporate', path: '/corporates' }, // { title: 'Corporate Create', path: '/corporates/create' }, - { title: 'Formularium', path: '/master/formularium' }, - { title: 'Obat', path: '/master/drugs' }, - { title: 'Diagnosis Library (ICD-X)', path: '/master/diagnosis' }, + { title: 'Formularium', path: '/master/formularium-template-v2' }, + { title: 'Master ICD-10 Diagnosis', path: '/master/diagnosis' }, { title: 'Hospitals', path: '/hospitals' }, ], }, @@ -72,11 +72,20 @@ const navConfig = [ // { title: 'Report', path: '/case-report' }, // ], }, + { + title: 'CASE MANAGEMENT', + children: [ + { title: 'Daily Monitoring', path: '/case_management/daily_monitoring' }, + { title: 'Laboratorium Result', path: '/case_management/laboratorium_result' }, + { title: 'Inpatient Monitoring', path: '/case_management/inpatient_monitoring' }, + ], + }, { title: 'CUSTOMER SERVICES', children: [ - { title: 'Request', path: '/cs-request' }, - { title: 'Membership', path: '/cs-membership' }, + { title: 'Request', path: '/custormer-service/request' }, + // { title: 'Membership', path: '/cs-membership' }, + { title: 'Final LOG', path: '/custormer-service/final-log' }, ], }, { @@ -90,6 +99,13 @@ const navConfig = [ ], }, + { + title: 'MASTER', + children: [ + { title: 'Diagnosis', path: '/master/diagnosis' }, + + ], + }, { title: 'USER MANAGEMENT', path: '/users', diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx new file mode 100644 index 00000000..dde524ea --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx @@ -0,0 +1,71 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, Grid, IconButton, Typography } from '@mui/material'; +import { ArrowBackIosNew } from '@mui/icons-material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '../../../components/Page'; +// - Local - + +/** + * Utils, Types, Functions + * ============================================ + */ +import { getClaimList } from './Model/Functions'; +import { ClaimListType, MemberDetailType } from './Model/Types'; +import ClaimList from './Components/ClaimList'; + +export default function Claim() { + const navigate = useNavigate() + const { member_id } = useParams(); + + // State + // -------------------- + const [memberDetail, setMemberDetail] = useState(); + const [claimList, setClaimList] = useState(); + + // Load Data + // ------------------- + const loadDataTableData = async () => { + const response = await getClaimList(member_id??''); + + setMemberDetail(response.member_detail); + setClaimList(response.claim_list); + } + + useEffect(() => { + loadDataTableData(); + }, []) + + return ( + + + {/* back button */} + + + navigate(`/case_management/daily_monitoring`)} > + + + + + {memberDetail?.name??'_ _ _'} + + + + + {/* tabel claims */} + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimList.tsx new file mode 100644 index 00000000..b9363926 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimList.tsx @@ -0,0 +1,79 @@ +/** + * Core + * ============================================ + */ +import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody } from "@mui/material"; + +/** + * Component + * ============================================ + */ +import ClaimListRow from "./ClaimListRow"; + +/** + * Types & Functions + * ============================================ + */ +import { ClaimListType } from "../Model/Types"; + +type Props = { + claim_list: ClaimListType[] | null, +} + +export default function ClaimList({ ...props }: Props) { + // Tabel Style + // -------------------- + const TableHeadStyle = { + fontWeight: 'bold', + }; + + return ( + + + + {/* Head Table */} + + + + Admission Date + Discharge Date + Code + Service Type + Status + + + + + {/* Body Table */} + {props.claim_list == null ? + ( + + + Loading + + + ) + : + ( + props.claim_list.length == 0 ? + ( + + + No Data + + + ) + : + ( + + {props.claim_list.map((row: ClaimListType, index) => ( + + ))} + + ) + )} +
+
+
+ ) +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx new file mode 100644 index 00000000..67e46a89 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx @@ -0,0 +1,108 @@ +/** + * Core + * ============================================ + */ +import React, { useState } from "react"; +import { useNavigate } from "react-router"; +import { Box, Collapse, MenuItem, TableCell, TableRow, Stack } from "@mui/material"; +import Visibility from '@mui/icons-material/Visibility'; +import AddIcon from '@mui/icons-material/Add'; + +/** + * Component + * ============================================ + */ +// - Global - +import Label from "@/components/Label"; +import TableMoreMenu from '@/components/table/TableMoreMenu'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate } from "@/utils/formatTime"; +import { ClaimListType } from "../Model/Types"; + +type Props = { + row: ClaimListType, + number: number +} + +export default function ClaimListRow ({ ...props }: Props) { + const navigate = useNavigate() + + return ( + + + td': { borderBottom: '1' } }}> + + + {props.row.admission_date == null? + ('-') + : + ( + + )} + + + {props.row.discharge_date == null ? + ('-') + : + ( + + )} + + {props.row.code} + {props.row.service_name} + + {props.row.discharge_date == null ? + ( + + ) : + ( + + ) + } + + + e.stopPropagation()}> + + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.claim_code}/list_monitoring`)}> + + View + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.claim_code}/add_monitoring`)}> + + Daily Monitoring + + + } /> + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx new file mode 100644 index 00000000..60c152cb --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx @@ -0,0 +1,93 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from "react"; +import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody } from "@mui/material"; + +/** + * Types & Functions + * ============================================ + */ +import { getDailyMonitoringList } from "../Model/Functions"; +import { DailyMonitoringListType } from "../Model/Types"; +import DailyMonitoringListRow from "./DailyMonitoringListRow"; + +export default function DailyMonitoringList() { + // State + // -------------------- + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState([]); + + // Tabel Style + // -------------------- + const TableHeadStyle = { + fontWeight: 'bold', + }; + + // Load Data + // ------------------- + const loadDataTableData = async () => { + setDataTableLoading(true); + + const response = await getDailyMonitoringList(); + + setDataTableLoading(false); + setDataTableData(response); + } + + useEffect(() => { + loadDataTableData(); + }, []) + + return ( + + + + {/* Head Table */} + + + + Member ID + Name + Start Date + End Date + Admission Date + Provider + + + + + {/* Body Table */} + {dataTableIsLoading ? + ( + + + Loading + + + ) + : + ( + dataTableData.length == 0 ? + ( + + + No Data + + + ) + : + ( + + {dataTableData.map((row: DailyMonitoringListType, index) => ( + + ))} + + ) + )} +
+
+
+ ) +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringListRow.tsx new file mode 100644 index 00000000..2b6df13b --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringListRow.tsx @@ -0,0 +1,81 @@ +/** + * Core + * ============================================ + */ +import React, { useState } from "react"; +import { useNavigate } from "react-router"; +import { Box, Collapse, MenuItem, TableCell, TableRow, Stack } from "@mui/material"; +import Visibility from '@mui/icons-material/Visibility'; + +/** + * Component + * ============================================ + */ +// - Global - +import Label from "@/components/Label"; +import TableMoreMenu from '@/components/table/TableMoreMenu'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate } from "@/utils/formatTime"; +import { DailyMonitoringListType } from "../Model/Types"; + +type Props = { + row: DailyMonitoringListType, + number: number +} + +export default function DailyMonitoringListRow ({ ...props }: Props) { + const navigate = useNavigate() + + return ( + + + td': { borderBottom: '1' } }}> + + {props.row.member_id} + {props.row.name} + + + + + + + + + + {props.row.provider} + e.stopPropagation()}> + + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims`)}> + + View + + + } /> + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx new file mode 100644 index 00000000..b06b9721 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx @@ -0,0 +1,300 @@ +/** + * Core + * ============================================ + */ +import { useFieldArray, useForm } from 'react-hook-form'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, IconButton, Typography, Grid, Card, Button } from '@mui/material'; +import { LoadingButton } from "@mui/lab"; + +/** + * Components + * ============================================ +*/ +import Page from '@/components/Page'; +import { FormProvider, RHFTextField } from '@/components/hook-form'; + +/** + * Icon + * ============================================ + */ +import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; +import AddIcon from '@mui/icons-material/Add'; +import RemoveIcon from '@mui/icons-material/Remove'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { AddMonitoringDetail } from '../Model/Functions'; +import { DetailMonitoringListType} from '../Model/Types'; + +export default function DetailMonitoringList() { + const { member_id, claim_code } = useParams(); + const navigate = useNavigate() + const pageTitle = claim_code??'_ _ _ _'; + + // setup form + // ==================================== + const defaultValues: DetailMonitoringListType = { + id : '', + claim_code : '', + claim_id : '', + subject : '', + body_temperature: '', + sistole : '', + diastole : '', + respiration_rate: '', + complaints : '', + analysis : '', + medical_plan : [{ + medical_plan_str: '' + }], + created_at : '' + }; + + const methods = useForm({ + defaultValues + }); + + const {fields, append, remove} = useFieldArray({name: 'medical_plan',control: methods.control}) + + const { handleSubmit, reset, formState: { isDirty, isSubmitting } } = methods; + + // Submit Form + // ===================================== + const submitHandler = async (data: DetailMonitoringListType) => { + console.log(claim_code); + + const response = await AddMonitoringDetail(claim_code??'', data); + + if (response == true) { + reset(); + navigate('case_management/daily_monitoring/'+claim_code+'claims'); + window.location.reload() + } + } + + return ( + + + navigate(`/case_management/daily_monitoring/${member_id}/claims`)} > + + + + + {pageTitle} + + + + + + + + {/* Subject */} + + + + + Subject* : + + + + + + + + + {/* Objectif */} + + + + + Objectif + + + + + + + Body Temperature* : + + + + + Sistole* : + + + + + Diastole* : + + + + + Respiration Rate* : + + + + + + + + + + + + Cel + + + + + + + + mm[Hg] + + + + + + + + mm[Hg] + + + + + + + + /min + + + + + + + + {/* Complaints */} + + + + + Complaints* : + + + + + + + + + {/* Analysis */} + + + + + Analysis* : + + + + + + + + + {/* Medical Plan */} + + + + + Medical Plan* : + + + + { + fields.map((field,index) => { + return ( + + + + + { + index == (fields.length-1) ? + ( + + append({medical_plan_str: ''})}> + + + + ) + : + ( + + remove(index)}> + + + + ) + } + + ) + }) + } + + + + + {/* Button Cancle & Save */} + + + + + + Save Changes + + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx new file mode 100644 index 00000000..da31d37d --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx @@ -0,0 +1,241 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, IconButton, Typography, Grid, Card, List, ListItem } from '@mui/material'; +import { LoadingButton } from "@mui/lab"; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '@/components/Page'; +import Label from "@/components/Label"; + +/** + * Icon + * ============================================ + */ +import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; +import FiberManualRecord from '@mui/icons-material/FiberManualRecord'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate } from "@/utils/formatTime"; +import { getMonitoringDetailList } from '../Model/Functions'; +import { DetailMonitoringListType } from '../Model/Types'; + + +export default function DetailMonitoringList() { + const { member_id, claim_code } = useParams(); + const navigate = useNavigate() + const pageTitle = claim_code??'_ _ _ _'; + + // State + // -------------------- + const [detailMonitoringList, setDetailMonitoringList] = useState(); + + // Use Effect + // -------------------- + useEffect(() => { + loadDataTableData(); + }, []) + + // Load Data + // ------------------- + const loadDataTableData = async () => { + const response = await getMonitoringDetailList(claim_code??''); + + setDetailMonitoringList(response); + } + + return ( + + + {/* back button */} + + + navigate(`/case_management/daily_monitoring/${member_id}/claims`)} > + + + + + {pageTitle} + + + + + {/* tabel claims */} + + + { + detailMonitoringList?.map((row, index) => { + return ( + + + {/* card header */} + + + + + {/* card body */} + + + + + + Subject : + + + + + {row.subject} + + + + + + + + + + Object : + + + + + + + Body Temperature + + + + + {row.body_temperature} + + + + + Sistole + + + + + {row.sistole} mm[Hg] + + + + + Diastole + + + + + {row.diastole} mm[Hg] + + + + + Respiration Rate + + + + + {row.respiration_rate} / min + + + + + + + + + + + + Subject : + + + + + {row.subject} + + + + + + + + + + Analysis : + + + + + {row.analysis} + + + + + + + + + + Complaints : + + + + + {row.complaints} + + + + + + + + + + Medical Plan : + + + + + { + row.medical_plan.map((data, index) => { + return ( + + {data.medical_plan_str} + + ) + }) + } + + + + + + + + ) + }) + } + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts new file mode 100644 index 00000000..05ace34d --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts @@ -0,0 +1,96 @@ +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { DailyMonitoringListType, DetailMonitoringListType, ResponseListingClaimType } from "./Types"; + +/** + * Listing Daily Monitoring + */ +export const getDailyMonitoringList = async ( ): Promise => { + const response = await axios.get('/case_management/memberlist') + .then((res) =>{ + return res.data.data.member_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Listing Claim + */ +export const getClaimList = async ( member_id: string ): Promise => { + const response = await axios.get(`/case_management/claimlist/${member_id}`) + .then((res) =>{ + return res.data.data; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return null; + }); + + return response; +}; + +/** + * Add Monitoring Detail + */ +export const AddMonitoringDetail = async ( claim_code: string,data: DetailMonitoringListType ): Promise => { + const response = await axios.post(`/case_management/daily_monitoring/detail/${claim_code}/add`, { + ...data + }) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + for (const key in arr_message) { + enqueueSnackbar(arr_message[key][0], { + variant: 'warning', + }); + } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +}; + +/** + * Get Monitoring Detail List + */ +export const getMonitoringDetailList = async ( claim_code: string ): Promise => { + const response = await axios.get(`/case_management/daily_monitoring/detail/${claim_code}/list`) + .then((res) =>{ + return res.data.data.detail_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts new file mode 100644 index 00000000..216c89e0 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -0,0 +1,63 @@ +/** + * List Daily Monitoring + */ +export type DailyMonitoringListType = { + member_id : string, + name : string, + startdate : string, + enddate : string, + addmision_date : string, + provider : string +} + +/** + * Response Listing Claim + */ +export type ResponseListingClaimType = { + member_detail : MemberDetailType, + claim_list : ClaimListType[], +} + +/** + * Member Detail + */ +export type MemberDetailType = { + id : string, + member_id : string, + name : string, +} + +/** + * List Claim + */ +export type ClaimListType = { + claim_id : number, + admission_date : string, + discharge_date : string, + claim_code : string, + claim_status : string, + service_type : string, + member_id : string +} + +/** + * Detail Monitoring List + */ +export type DetailMonitoringListType = { + id : string|null, + claim_id : string|null, + claim_code : string, + subject : string, + body_temperature: string, + respiration_rate: string, + sistole : string, + diastole : string + analysis : string, + complaints : string, + medical_plan : MedicalPlanStrType[], + created_at : string|null +} + +export type MedicalPlanStrType = { + medical_plan_str: string +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/index.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/index.tsx new file mode 100644 index 00000000..fb989405 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/index.tsx @@ -0,0 +1,48 @@ +/** + * Core + * ============================================ + */ +import { Box, Grid } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '../../../components/Page'; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +// - Local - +import DailyMonitoringList from './Components/DailyMonitoringList'; + +export default function DailyMonitoring() { + const pageTitle = "Daily Monitoring"; + + return ( + + + {/* page header */} + + + + + {/* tabel daily monitoring */} + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/Index.tsx b/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/Index.tsx new file mode 100644 index 00000000..16298e5e --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/Index.tsx @@ -0,0 +1,30 @@ +import { Card, Stack } from "@mui/material"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import List from "./List"; + + + +export default function Claims() { + + const pageTitle = 'Inpatient Monitoring'; + return ( + + + + + {/* */} + + {/* */} + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/List.tsx b/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/List.tsx new file mode 100644 index 00000000..f734db68 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/List.tsx @@ -0,0 +1,582 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + IconButton, + MenuItem, + Table, + TableBody, + TableCell, + TableRow, + TextField, + Typography, + Stack, + Menu, + ButtonGroup, + Link, + Chip, + TableHead, + Grid, +} from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; + +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +// hooks +import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; +import useSettings from '@/hooks/useSettings'; +// components +import axios from '../../../utils/axios'; +import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../../@types/paginated-data'; +import DataTable from '../../../components/LaravelTable'; +import { fCurrency } from '../../../utils/formatNumber'; +import EditRoundedIcon from '@mui/icons-material/EditRounded'; +import { LoadingButton } from '@mui/lab'; +import { enqueueSnackbar } from 'notistack'; +import { Divider } from '@mui/material'; +import Iconify from '@/components/Iconify'; +import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { capitalizeFirstLetter } from '@/utils/formatString'; +import Label from '@/components/Label'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import { Import } from '@/@types/claims'; + +import { FinalLogType } from '../../CustomerService/FinalLog/Model/Types'; +// import LoadingButton from '@/theme/overrides/LoadingButton'; + +export default function List() { + const { themeColorPresets } = useSettings(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + + const navigate = useNavigate() + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(''); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? ''; + setSearchText(newSearchText); + }; + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch({ search: searchText }); // Trigger to Parent + }; + + useEffect(() => { + // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, []); + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); + const [importLoading, setImportLoading] = useState(false); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected'); + } + }; + + const handleCancelImportButton = () => { + importForm.current.value = ''; + importForm.current.dispatchEvent(new Event('change', { bubbles: true })); + }; + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name); + } else { + setCurrentImportFileName(null); + } + }; + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append('file', importForm.current?.files[0]); + + setImportLoading(true); + axios + .post(`claim-requests/import`, formData) + .then((response) => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + setImportLoading(false); + }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + setImportLoading(false); + }); + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }); + } + }; + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + const handleGetData = (type :string) => { + axios.get(`corporates/${corporate_id}/data-plan-benefit`) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + return ( +
+ ); + } + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState( + LaravelPaginatedDataDefault + ); + + const loadDataTableData = async (appliedFilter: any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/customer-service/request?final_log=1&service_code=IP', { params: filter }); + // console.log(response.data); + setDataTableLoading(false); + + setDataTableData(response.data); + }; + + const applyFilter = async (searchFilter: { search: string }) => { + await loadDataTableData(searchFilter); + setSearchParams(searchFilter); + }; + + const handlePageChange = (event: ChangeEvent, value: number): void => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + }; + + const handleApprove = (claimRequest) => { + axios + .post(`claim-requests/${claimRequest.id}/approve`) + .then((response) => { + enqueueSnackbar('Success Approve', { variant: 'success' }); + loadDataTableData(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + }; + + useEffect(() => { + loadDataTableData(); + }, []); + + const headStyle = { + fontWeight: 'bold', + }; + + // Called on every row to map the data to the columns + function createData(data: FinalLogType) { + return { + ...data, + }; + } + + { + /* ------------------ TABLE ROW ------------------ */ + } + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + const [loadingApprove, setLoadingApprove] = React.useState(false); + + return ( + + *': { borderBottom: 'unset' } }}> + {/* + setOpen(!open)}> + {open ? : } + + */ } + {/* + { + // handleShowClaim(row); + // }} + > + {row.id} + + */} + {row.code} + {row.member_name} + + {row.service_name} + {row.payment_type_name} + + { row.status_final_log == "requested" ? + () : + row.status_final_log == "declined" ? + () + : + () + } + + + + {/* navigate(`/claim-requests/edit/${row.id}`)}> + + Edit + */} + navigate ('/custormer-service/final-log/detail/'+row.id+'')}> + + Detail + + + } /> + + {/* + + { + handleShowClaim(row); + }} + > + + + */} + + {/* COLLAPSIBLE ROW */} + + + + + } + spacing={1} + sx={{ marginY: 2 }} + > + + Berkas Hasil Penunjang + {/* {row.files_by_type?.claim_kondisi && + row.files_by_type?.claim_kondisi.map((file, index) => ( + + -{' '} + + {file.name} + + + ))} */} + + {row.files_by_type?.claim_kondisi && ( + <> + - Kondisi + {row.files_by_type?.claim_kondisi.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_diagnosis && ( + <> + - Diagnosa + {row.files_by_type?.claim_diagnosis.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_result && ( + <> + - Hasil + {row.files_by_type?.claim_result.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + {(!row.files_by_type?.claim_result && !row.files_by_type?.claim_diagnosis && !row.files_by_type?.claim_kondisi)&& Tidak ada berkas} + + + + + + + + ); + } + { + /* ------------------ END TABLE ROW ------------------ */ + } + + function TableContent() { + return ( + + {/* ------------------ TABLE HEADER ------------------ */} + + + {/* */} + {/* + ID Request LOG + */} + + Code + + + Name + + + Date of Submission + + + Service Type + + + Claim Method + + + Status + + + + + {/* ------------------ END TABLE HEADER ------------------ */} + + {/* ------------------ TABLE ROW ------------------ */} + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length === 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableData.data.map((row) => ( + + ))} + + )} + {/* ------------------ END TABLE ROW ------------------ */} +
+ ); + } + + // --------------------------------------------------------- + // Dialog Detail Claim Request + const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false); + const [loadingClaimDetail, setLoadingClaimDetail] = useState(true); + const [currentClaim, setCurrentClaim] = useState(null); + + function handleShowClaim(claimRequest) { + setLoadingClaimDetail(true); + setOpenDialogDetailClaim(true); + + axios + .get(`/claim-requests/${claimRequest.id}`) + .then(({ data }) => { + setCurrentClaim(data.data); + setLoadingClaimDetail(false); + }) + .catch((err) => { + enqueueSnackbar(err.message, { variant: 'error' }); + }); + } + + function handleDownloadLog() {} + + return ( + + + + + + + } + /> + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Claim.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Claim.tsx new file mode 100644 index 00000000..0388bc25 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Claim.tsx @@ -0,0 +1,73 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, Grid, IconButton, Typography } from '@mui/material'; +import { ArrowBackIosNew } from '@mui/icons-material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '../../../components/Page'; +// - Local - + +/** + * Utils, Types, Functions + * ============================================ + */ +import { getClaimList } from './Model/Functions'; +import { ClaimListType, MemberDetailType } from './Model/Types'; +import ClaimList from './Components/ClaimList'; + +export default function Claim() { + const navigate = useNavigate() + const { member_id } = useParams(); + + // State + // -------------------- + const [memberDetail, setMemberDetail] = useState(); + const [claimList, setClaimList] = useState(); + + // Use Effect + // -------------------- + useEffect(() => { + loadDataTableData(); + }, []) + + // Load Data + // ------------------- + const loadDataTableData = async () => { + const response = await getClaimList(member_id??''); + + setMemberDetail(response.member_detail); + setClaimList(response.claim_list); + } + + return ( + + + {/* back button */} + + + navigate(`/case_management/laboratorium_result`)} > + + + + + {memberDetail?.name??'_ _ _'} + + + + + {/* tabel claims */} + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimList.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimList.tsx new file mode 100644 index 00000000..b9363926 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimList.tsx @@ -0,0 +1,79 @@ +/** + * Core + * ============================================ + */ +import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody } from "@mui/material"; + +/** + * Component + * ============================================ + */ +import ClaimListRow from "./ClaimListRow"; + +/** + * Types & Functions + * ============================================ + */ +import { ClaimListType } from "../Model/Types"; + +type Props = { + claim_list: ClaimListType[] | null, +} + +export default function ClaimList({ ...props }: Props) { + // Tabel Style + // -------------------- + const TableHeadStyle = { + fontWeight: 'bold', + }; + + return ( + + + + {/* Head Table */} + + + + Admission Date + Discharge Date + Code + Service Type + Status + + + + + {/* Body Table */} + {props.claim_list == null ? + ( + + + Loading + + + ) + : + ( + props.claim_list.length == 0 ? + ( + + + No Data + + + ) + : + ( + + {props.claim_list.map((row: ClaimListType, index) => ( + + ))} + + ) + )} +
+
+
+ ) +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimListRow.tsx new file mode 100644 index 00000000..815f7ed2 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimListRow.tsx @@ -0,0 +1,88 @@ +/** + * Core + * ============================================ + */ +import React, { useState } from "react"; +import { useNavigate } from "react-router"; +import { Box, Collapse, MenuItem, TableCell, TableRow, Stack } from "@mui/material"; +import Visibility from '@mui/icons-material/Visibility'; +import AddIcon from '@mui/icons-material/Add'; + +/** + * Component + * ============================================ + */ +// - Global - +import Label from "@/components/Label"; +import TableMoreMenu from '@/components/table/TableMoreMenu'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate } from "@/utils/formatTime"; +import { ClaimListType } from "../Model/Types"; + +type Props = { + row: ClaimListType, + number: number +} + +export default function ClaimListRow ({ ...props }: Props) { + const navigate = useNavigate() + + return ( + + + td': { borderBottom: '1' } }}> + + + {props.row.admission_date == "0000-00-00 00:00:00" ? + ('-') + : + ( + + )} + + + {props.row.discharge_date == "0000-00-00 00:00:00" ? + ('-') + : + ( + + )} + + {props.row.claim_code} + {props.row.service_type} + {props.row.claim_status} + e.stopPropagation()}> + + + navigate(`/case_management/laboratorium_result/${props.row.member_id}/claims/${props.row.claim_code}/list_lab_result`)}> + + View + + navigate(`/case_management/laboratorium_result/${props.row.member_id}/claims/${props.row.claim_code}/add_lab_result`)}> + + Laboratorium Result + + + } /> + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultForm.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultForm.tsx new file mode 100644 index 00000000..f42bff42 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultForm.tsx @@ -0,0 +1,237 @@ +/** + * Core + * ============================================ + */ +import { useRef } from 'react'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack } from '@mui/material'; +import { LoadingButton } from "@mui/lab"; + +/** + * Components + * ============================================ +*/ +import Page from '@/components/Page'; +import { FormProvider, RHFDatepicker, RHFTextField } from '@/components/hook-form'; +import RHFDatePickerV2 from '@/components/hook-form/RHFDatePickerV2'; + +/** + * Icon + * ============================================ + */ +import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; +import Iconify from '@/components/Iconify'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { AddLabResultDetail } from '../Model/Functions'; +import { DetailLabResultListType} from '../Model/Types'; + +export default function DetailMonitoringList() { + const { member_id, claim_code } = useParams(); + const navigate = useNavigate() + const pageTitle = claim_code??'_ _ _ _'; + const fileInput = useRef(null); + + // setup form + // ==================================== + const defaultValues: DetailLabResultListType = { + id : '', + claim_id : '', + claim_code : '', + date : null, + location : '', + examination : '', + lab_result_file : [], + created_at : '' + }; + + const methods = useForm({ + defaultValues + }); + + const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting } } = methods; + const formValues = watch(); + + // Handle File Input + // ===================================== + const handleInputChange = (event: any) => { + if (event.target.files[0]) { + + let arr_lab_result_file = formValues.lab_result_file; + arr_lab_result_file.push(event.target.files[0]); + + setValue('lab_result_file', arr_lab_result_file) + } + else { + console.log('NO FILE'); + } + }; + + // Handle Remove File + // ===================================== + const handleRemoveFile = (target_index: number) => { + let arr_lab_result_file = formValues.lab_result_file.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + + setValue('lab_result_file', arr_lab_result_file) + }; + + // Submit Form + // ===================================== + const submitHandler = async (data: DetailLabResultListType) => { + const response = await AddLabResultDetail(claim_code??'', data); + + if (response == true) { + reset(defaultValues); + } + } + + return ( + + + navigate(`/case_management/laboratorium_result/${member_id}/claims`)} > + + + + + {pageTitle} + + + + + + + + {/* Date */} + + + + + Date* : + + + + + + + + + {/* Location */} + + + + + Location* : + + + + + + + + + {/* Examination */} + + + + + Examination* : + + + + + + + + + {/* list file & button upload */} + + + + { + formValues.lab_result_file.map((file: any, index: number) => ( + + + + {file.name ? file.name : '-'} + + handleRemoveFile(index)} + sx={{cursor: 'pointer'}} + > + + )) + } + + + fileInput.current?.click()}> + + + + Upload Result + + + + + + + + + {/* Button Cancle & Save */} + + + + + + Save Changes + + + + + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultList.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultList.tsx new file mode 100644 index 00000000..3d79403c --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultList.tsx @@ -0,0 +1,165 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, IconButton, Typography, Grid, Card, List, ListItem, Stack, Link } from '@mui/material'; +import { LoadingButton } from "@mui/lab"; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '@/components/Page'; +import Label from "@/components/Label"; + +/** + * Icon + * ============================================ + */ +import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate } from "@/utils/formatTime"; +import { getLabResultDetailList } from '../Model/Functions'; +import { DetailLabResultListType } from '../Model/Types'; + + +export default function DetailLabResultList() { + const { member_id, claim_code } = useParams(); + const navigate = useNavigate() + const pageTitle = claim_code??'_ _ _ _'; + + // State + // -------------------- + const [LabResultList, setLabResultList] = useState(); + + // Use Effect + // -------------------- + useEffect(() => { + loadDataTableData(); + }, []) + + // Load Data + // ------------------- + const loadDataTableData = async () => { + const response = await getLabResultDetailList(claim_code??''); + + setLabResultList(response); + } + + return ( + + + {/* back button */} + + + navigate(`/case_management/laboratorium_result/${member_id}/claims`)} > + + + + + {pageTitle} + + + + + {/* tabel claims */} + + + { + LabResultList?.map((row, index) => { + return ( + + + {/* card header */} + + + + + {/* card body */} + + + + + + Date + + + + + {row.date} + + + + + Location + + + + + {row.location} + + + + + Examination + + + + + {row.examination} + + + + + + + + + + Document : + + + + { + row.lab_result_file.map((data, index) => { + return ( + + + + + {data.lab_result_file_obj.original_name??'-'} + + + + ) + }) + } + + + + + + + ) + }) + } + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/LaboratoriumResultList.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/LaboratoriumResultList.tsx new file mode 100644 index 00000000..accfc853 --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/LaboratoriumResultList.tsx @@ -0,0 +1,93 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from "react"; +import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody } from "@mui/material"; + +/** + * Types & Functions + * ============================================ + */ +import { getDailyMonitoringList } from "../Model/Functions"; +import { LaboratoriumResultListType } from "../Model/Types"; +import LaboratoriumListRow from "./LaboratoriumResultListRow"; + +export default function LaboratoriumResultList() { + // State + // -------------------- + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState([]); + + // Tabel Style + // -------------------- + const TableHeadStyle = { + fontWeight: 'bold', + }; + + // Use Effect + // -------------------- + useEffect(() => { + loadDataTableData(); + }, []) + + // Load Data + // ------------------- + const loadDataTableData = async () => { + setDataTableLoading(true); + + const response = await getDailyMonitoringList(); + + setDataTableLoading(false); + setDataTableData(response); + } + + return ( + + + + {/* Head Table */} + + + + Member ID + Name + Start Date + End Date + + + + + {/* Body Table */} + {dataTableIsLoading ? + ( + + + Loading + + + ) + : + ( + dataTableData.length == 0 ? + ( + + + No Data + + + ) + : + ( + + {dataTableData.map((row: LaboratoriumResultListType, index) => ( + + ))} + + ) + )} +
+
+
+ ) +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/LaboratoriumResultListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/LaboratoriumResultListRow.tsx new file mode 100644 index 00000000..00c482de --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/LaboratoriumResultListRow.tsx @@ -0,0 +1,72 @@ +/** + * Core + * ============================================ + */ +import React, { useState } from "react"; +import { useNavigate } from "react-router"; +import { Box, Collapse, MenuItem, TableCell, TableRow, Stack } from "@mui/material"; +import Visibility from '@mui/icons-material/Visibility'; + +/** + * Component + * ============================================ + */ +// - Global - +import Label from "@/components/Label"; +import TableMoreMenu from '@/components/table/TableMoreMenu'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate } from "@/utils/formatTime"; +import { LaboratoriumResultListType } from "../Model/Types"; + +type Props = { + row: LaboratoriumResultListType, + number: number +} + +export default function LaboratoriumResultListRow ({ ...props }: Props) { + const navigate = useNavigate() + + return ( + + + td': { borderBottom: '1' } }}> + + {props.row.member_id} + {props.row.name} + + + + + + + e.stopPropagation()}> + + + navigate(`/case_management/laboratorium_result/${props.row.member_id}/claims`)}> + + View + + + } /> + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Functions.ts b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Functions.ts new file mode 100644 index 00000000..7f97102c --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Functions.ts @@ -0,0 +1,100 @@ +import axios from '@/utils/axios'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { enqueueSnackbar } from 'notistack'; +import { DetailLabResultListType, LaboratoriumResultListType, ResponseListingClaimType } from "./Types"; +import { fDate } from '@/utils/formatTime'; + +/** + * Listing Daily Monitoring + */ +export const getDailyMonitoringList = async ( ): Promise => { + const response = await axios.get('/case_management/memberlist') + .then((res) =>{ + return res.data.data.member_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Listing Claim + */ +export const getClaimList = async ( member_id: string ): Promise => { + const response = await axios.get(`/case_management/claimlist/${member_id}`) + .then((res) =>{ + return res.data.data; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return null; + }); + + return response; +}; + +/** + * Add Lab Result Detail + */ +export const AddLabResultDetail = async ( claim_code: string,data: DetailLabResultListType ): Promise => { + data.date = data.date != '' && data.date != null ? fDate(data.date) : ''; + + const formData = makeFormData({...data}); + + const response = await axios.post(`/case_management/laboratorium_result/detail/${claim_code}/add`, formData) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + for (const key in arr_message) { + enqueueSnackbar(arr_message[key][0], { + variant: 'warning', + }); + } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +}; + +/** + * Get Lab Result Detail List + */ +export const getLabResultDetailList = async ( claim_code: string ): Promise => { + const response = await axios.get(`/case_management/laboratorium_result/detail/${claim_code}/list`) + .then((res) =>{ + return res.data.data.lab_result_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Types.ts new file mode 100644 index 00000000..2ddf9dbe --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Types.ts @@ -0,0 +1,57 @@ +/** + * List Laboratorium + */ +export type LaboratoriumResultListType = { + member_id : string, + name : string, + startdate : string, + enddate : string, +} + +/** + * Response Listing Claim + */ +export type ResponseListingClaimType = { + member_detail : MemberDetailType, + claim_list : ClaimListType[], +} + +/** + * Member Detail + */ +export type MemberDetailType = { + id : string, + member_id : string, + name : string, +} + +/** + * List Claim + */ +export type ClaimListType = { + claim_id : number, + admission_date : string, + discharge_date : string, + claim_code : string, + claim_status : string, + service_type : string, + member_id : string +} + +/** + * Detail Lab Result List + */ +export type DetailLabResultListType = { + id : string|null, + claim_id : string|null, + claim_code : string, + date : string|null, + location : string, + examination : string, + lab_result_file : LabResultFileStrType[], + created_at : string|null +} + +export type LabResultFileStrType = { + lab_result_file_obj: any +} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/index.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/index.tsx new file mode 100644 index 00000000..f5e676bd --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/index.tsx @@ -0,0 +1,48 @@ +/** + * Core + * ============================================ + */ +import { Box, Grid } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '../../../components/Page'; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +// - Local - +import LaboratoriumResultList from './Components/LaboratoriumResultList'; + +export default function LaboratoriumResult() { + const pageTitle = "Laboratorium Result"; + + return ( + + + {/* page header */} + + + + + {/* tabel daily monitoring */} + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx new file mode 100644 index 00000000..d952f5e3 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx @@ -0,0 +1,355 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, CircularProgress , Button, styled, Stack, IconButton, Card} from '@mui/material'; +import { LoadingButton } from '@mui/lab'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - +import FormCreateSearch from './FormCreateSearch'; +import FormCreateListChoose from './FormCreateListChoose'; +import FormCreateBtnUpload from './FormCreateBtnUpload'; + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { ArrowBackIosNew } from '@mui/icons-material'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from '../Model/Types'; +import { addClaimRequest, getMemberList } from '../Model/Functions'; +import palette from '@/theme/palette'; +import FormCreateFilesUpload from './FormCreateFilesUpload'; +import useLoadOnScroll from '@/hooks/useLoadOnScroll'; +import useCollapseDrawer from '@/hooks/useCollapseDrawer'; +import FormCreateBtnChoose from './FormCreateBtnChoose'; +import axios from '../../../utils/axios'; + +export default function FormCreate() { + const navigate = useNavigate() + const defaultListChoosed:MemberListType[] = []; + + // State + // ------------------------- + const [keyword, setKeyword] = useState(''); + const [listChoosed, setListChoosed] = useState([]); + const [isChoosed, setIsChoosed] = useState(false); + const [formIsLoading, setFormIsLoading] = useState(false); + + // List Choose - auto Scroll + // ------------------------- + const fetchFunction = async (page: number): Promise => getMemberList(page, keyword) + + const {data: MemberList, isLoading: scrollIsLoading, setData, resetLastPage, refetchData} = useLoadOnScroll(fetchFunction); + + // List Choose - Search + // ------------------------- + const handleSearch = (keyword: string) => { + setData([]) + resetLastPage() + setKeyword(keyword) + refetchData() + } + + // Function - Clear Form + // ----------------------------- + const clearForm = () => { + setListChoosed(defaultListChoosed); + setIsChoosed(false); + } + + // Function - Choose Patien Type + // ----------------------------- + const handleChoosePatienType = (data: MemberListType, type: string) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + list.patien_type = type + } + + return list; + }) + setListChoosed(newListChoosed) + } + + // Function - Handle Btn Upload + // ----------------------------- + const handleChangeInput = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', file: any) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'kondisi') { + if (list.file_kondisi == undefined) { + list.file_kondisi = [file]; + } + else { + list.file_kondisi.push(file); + } + } + + if (type_file == 'diagnosa') { + if (list.file_diagnosa == undefined) { + list.file_diagnosa = [file]; + } + else { + list.file_diagnosa.push(file); + } + } + + if (type_file == 'penunjang') { + if (list.file_penunjang == undefined) { + list.file_penunjang = [file]; + } + else { + list.file_penunjang.push(file); + } + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Remove Fle + // ----------------------------- + const handleRemoveFile = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', target_index: number) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'kondisi') { + list.file_kondisi = list.file_kondisi?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'diagnosa') { + list.file_diagnosa = list.file_diagnosa?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'penunjang') { + list.file_penunjang = list.file_penunjang?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Submit Form + // ----------------------------- + const handleSubmit = async () => { + setFormIsLoading(true) + let response = await addClaimRequest(listChoosed) + setFormIsLoading(false) + + if (response == true) { + clearForm() + } + } + + + + let isDirty = listChoosed.some((row) => { + if (row.patien_type == undefined) { + return true + } + }) + + return ( + + {/* Back Button */} + + isChoosed==false ? navigate(`/claim-requests`) : setIsChoosed(false)} > + + + + + {'Create Claim Requests'} + + + + {/* Choose Section */} + + {/* Search */} + + handleSearch('')} onSubmit={(keyword) => handleSearch(keyword)} /> + + + + + {/* List */} + + + { + MemberList.map((row, index) => { + return ( + { + checked ? setListChoosed((prevData) => [...prevData, data]) : setListChoosed((items) => items.filter(item => item.id != data.id)) + }} + /> + ) + }) + } + + + + {/* Loading */} + + + + + {/* Submit List */} + + setIsChoosed(true)} /> + + + + + + {/* Input Section */} + + { + listChoosed.map((row, index) => { + return ( + + + {/* Patien Name */} + + + + + {row.name} + + + {row.member_id} + + + + + + + {/* Patien Type */} + + + {row.service_type.map((r,i) => { + const code = r.code + return ( + + + + ) + })} + + + + {/* File Kondisi */} + + + + Condition Document + + + {row.file_kondisi && row.file_kondisi.map((file, index) => ( + + handleRemoveFile(row, 'kondisi', index)} /> + + ))} + + + handleChangeInput(row, 'kondisi', file)} /> + + + + + {/* File Diagnosa */} + + + + Diagnosis Document + + + {row.file_diagnosa && row.file_diagnosa.map((file, index) => ( + + handleRemoveFile(row, 'diagnosa', index)} /> + + ))} + + + handleChangeInput(row, 'diagnosa', file)} /> + + + + + {/* File Penunjang */} + + + + Supporting Result Document + + + {row.file_penunjang && row.file_penunjang.map((file, index) => ( + + handleRemoveFile(row, 'penunjang', index)} /> + + ))} + + + handleChangeInput(row, 'penunjang', file)} /> + + + + + + + ) + }) + } + + + + + handleSubmit()}> + Save Changes + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnChoose.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnChoose.tsx new file mode 100644 index 00000000..cffd3bc3 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnChoose.tsx @@ -0,0 +1,39 @@ +import { styled, Button } from "@mui/material"; +import useCollapseDrawer from "@/hooks/useCollapseDrawer"; + +/** + * Custom Style + * ============================================ +*/ +const DivCustom1 = styled('div')(({ theme }) => ({ + background: 'white', + position: 'fixed', + left: '350px', + right: 0, + bottom: 0, + paddingLeft: '32px', + paddingRight: '32px', + paddingTop: '32px', + paddingBottom: '48px', + [theme.breakpoints.between('sm', 'lg')]: { + left: '0px', + }, +})); + +type Props = { + disabled: boolean, + title : string, + handleClickProp: () => void +} + +export default function FormCreateBtnChoose ({disabled, title, handleClickProp}: Props) { + const { collapseClick } = useCollapseDrawer(); + + return ( + + + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnUpload.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnUpload.tsx new file mode 100644 index 00000000..23df5ed5 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnUpload.tsx @@ -0,0 +1,39 @@ +import { useRef } from "react"; +import { Box, ButtonBase, Typography } from "@mui/material"; +import Iconify from "@/components/Iconify"; + +type Props = { + handleChangeInputProp: (event: any) => void +} + +export default function FormCreateBtnUpload ({handleChangeInputProp}: Props) { + const fileInput = useRef(null); + + return ( + fileInput.current?.click()}> + + + + Upload Result + + + handleChangeInputProp(event.target.files ? event.target.files[0] : {})} + accept="application/pdf" + /> + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateFilesUpload.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateFilesUpload.tsx new file mode 100644 index 00000000..7ab9d7bd --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateFilesUpload.tsx @@ -0,0 +1,25 @@ +import Iconify from "@/components/Iconify"; +import { ArrowBackIosNew, InsertDriveFile } from '@mui/icons-material'; +import { Stack, Typography } from "@mui/material"; + +type Props = { + file: any, + handleRemoveFileProp: () => void, +} + +export default function FormCreateFilesUpload({ file, handleRemoveFileProp }: Props) { + return ( + + + + {file.name ? file.name : '-'} + + {handleRemoveFileProp()}} + sx={{cursor: 'pointer'}} + > + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateListChoose.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateListChoose.tsx new file mode 100644 index 00000000..03c8d0b1 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateListChoose.tsx @@ -0,0 +1,78 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, Card} from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from '../Model/Types'; +import palette from '@/theme/palette'; + +/** + * Props + * ===================================================== + */ +type Props = { + data: MemberListType, + ListChoosed: MemberListType[], + handleCheckedProp: (checked: boolean, data: MemberListType) => void, +}; + +export default function FormCreateListChoose({data, ListChoosed, handleCheckedProp}: Props) { + const [isChoosed, setIsChoosed] = useState(false) + + useEffect(() => { + setIsChoosed(false); + + ListChoosed.forEach(list => { + if (list.id == data.id) { + setIsChoosed(true); + } + }) + }, [ListChoosed]) + + return ( + + { + return isChoosed ? palette.light.primary.lighter : palette.light.background.default + } + }}> + + handleCheckedProp(checked, data)} />} + checked={isChoosed} + /> + + + + {data.name} + + + {data.member_id} + + + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateSearch.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateSearch.tsx new file mode 100644 index 00000000..026b886b --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateSearch.tsx @@ -0,0 +1,70 @@ +/** + * Core + * ============================================ + */ +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import { Grid } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import { FormProvider, RHFTextField } from '@/components/hook-form'; +// - Local - + +/** + * Icon, Utils, Types, Functions + * ============================================ + */ +import { Search } from '@mui/icons-material'; +import { SearchType } from '../Model/Types'; + +type Props = { + onSubmit: (keyword: string) => void, + onEmpty: () => void, +}; + +const FormCreateSearch = ({ onSubmit, onEmpty }: Props) => { + const defaultValuesSearchForm = { + keyword: '' + }; + + const methodsSearchForm = useForm({ + defaultValues: defaultValuesSearchForm + }); + + const { handleSubmit, formState: { isDirty } } = methodsSearchForm; + + // search on submit + const onSubmitSearch = (data: SearchType ) => { + onSubmit(data.keyword); + } + + // search on empty + useEffect(() => { + if (isDirty === false) { + onEmpty() + } + },[isDirty]) + + return ( + + + + }} + sx={{ input: { paddingLeft: '14px' } }} + /> + + + + ) +} + +export default FormCreateSearch diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx new file mode 100644 index 00000000..faa95bf0 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx @@ -0,0 +1,456 @@ +import * as Yup from 'yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate } from 'react-router-dom'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Controller, useForm } from 'react-hook-form'; +import React, { useRef, useEffect, useMemo, useState } from 'react'; +import axios from '../../../utils/axios'; +import { FormProvider, RHFTextField } from '../../../components/hook-form'; + +import { makeFormData } from '@/utils/jsonToFormData'; +import { + Autocomplete, + Button, + Grid, + Stack, + Table, + TableBody, + TableCell, + TableRow, + TextField, + Typography, + useTheme, + List, + ListItem, + IconButton, + ListItemAvatar, + Avatar, + ListItemText, + Card, + InputAdornment, + Divider, + ButtonBase, + Box, +} from '@mui/material'; +import Iconify from '../../../components/Iconify'; +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import { LoadingButton } from '@mui/lab'; +import { fCurrency } from '../../../utils/formatNumber'; +import MemberSelectDialog from '../../../components/dialogs/MemberSelectDialog'; +import { Add, ArrowBackIosNew, DeleteOutline } from '@mui/icons-material'; +import { ClaimRequest, Files } from '@/@types/claims'; +import { fDateTimesecond } from '@/utils/formatTime'; + +interface FormValuesProps extends Partial { + taxes: boolean; + inStock: boolean; +} + +type Props = { + isEdit: boolean; + currentClaim?: ClaimRequest; +}; + +export default function FormEdit({ isEdit, currentClaim }: Props) { + const navigate = useNavigate(); + + const { enqueueSnackbar } = useSnackbar(); + + const EditClaimSchema = Yup.object().shape({ + organization_id: Yup.string().required('Code Provider is required'), + }); + + const defaultValues = useMemo( + () => ({ + id: currentClaim?.id || '-', + code: currentClaim?.code || '-', + member_name: currentClaim?.member?.name || '-', + date: currentClaim?.submission_date ? fDateTimesecond(currentClaim?.submission_date) : '-', + claim_method: currentClaim?.payment_type || '-', + service_type: currentClaim?.service_code || '-', + organization_id: currentClaim?.organization?.code || '-', + }), + [currentClaim] + ); + + useEffect(() => { + if (isEdit && currentClaim) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + // setFileKondisis(currentClaim?.files_by_type?.claim_diagnosis); + // setFileDiagnosas(currentClaim?.files_by_type?.claim_diagnosis); + setFileHasilPenunjangCurrent(currentClaim?.files_by_type?.claim_result); + }, [isEdit, currentClaim]); + + + const methods = useForm({ + resolver: yupResolver(EditClaimSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const values = watch(); + + const [isCheckingLimit, setIsCheckingLimit] = useState(false); + const [isEligible, setIsEligible] = useState(false); + const [memberBenefits, setMemberBenefits] = useState([]); + const [diagnosisOption, setDiagnosisOption] = useState([]); + const [isMemberDialogOpen, setIsMemberDialogOpen] = useState(false); + const [member, setMember] = useState({}) + + // ---------------------------------------------------------------------- + + // Files Result Kondisi + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState, index) => { + setFileKondisis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + // Files Result Diagnosa + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + + const handleDiagnosaInputChange = (event) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState, index) => { + setFileDiagnosas( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + // Files Result Hasil Penunjang + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + const [fileHasilPenunjangsCurrent, setFileHasilPenunjangCurrent] = useState([]); + + const handleResultInputChange = (event) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState, index) => { + setFileHasilPenunjangs( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + + const onSubmit = async (data: FormValuesProps) => { + try { + // const formData = new FormData(); + // formData.append('result_files', fileHasilPenunjangs); + // formData.append('diagnosa_files', fileDiagnosaInput); + // formData.append('kondisi_files', fileKondisiInput); + // formData.append('provider_code', data.organization_id); + // formData.append('_method', 'PUT'); + const formData = makeFormData({ + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis, + provider_code: data.organization_id, + _method: 'PUT' + }); + + const response = await axios.put(`/claim-requests/${data.id}`, formData); + + reset(); + enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); + navigate('/claim-requests'); + } catch (error: any) { + if (error && error.response.status === 422) { + for (const [key, value] of Object.entries(error.response.data.errors)) { + // setError(key, { message: value[0] }); + enqueueSnackbar('Failed Processing Request', { variant: 'error' }); + } + } else { + enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); + } + } + }; + + + return ( + + + + navigate(`/claim-requests`)} > + + + + + {'Edit Claim Requests'} + + + + + + + + Code* + + + Name* + + + + + + + + {/* */} + + + + + + Date of Submission* + + + Claim Method* + + + Service Type* + + + Code Provider* + + + + + + + + ), }} + name="date" label="Date of Submission" disabled/> + + + + + + + + + + + + + {/* -------------------------------Upload Dokumen Kondisi------------------------------- */} + + + Condition Document + + + {fileKondisis && + fileKondisis.map((file, index) => ( + + {file.name} + { + removeKondisiFiles(fileKondisis, index); + }} + > + + ))} + + + fileKondisiInput.current?.click()}> + + + + Add File + + + + + + + {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} + + + Diagnosis Document + + + {fileDiagnosas && + fileDiagnosas.map((file, index) => ( + + {file.name} + { + removeDiagnosaFiles(fileDiagnosas, index); + }} + > + + ))} + + + fileDiagnosaInput.current?.click()}> + + + + Add Result + + + + + + + {/* -------------------------------Upload Result Hasil Penunjang------------------------------- */} + + + Supporting Result Document + + + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file, index) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + > + + ))} + + + fileHasilPenunjangInput.current?.click()}> + + + + Add Result + + + + + + + + + + + + + + + Update + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx index 58bb43d6..c710deaa 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx @@ -1,8 +1,10 @@ import * as Yup from 'yup'; +import { Box, IconButton } from '@mui/material'; +import { ArrowBackIosNew } from '@mui/icons-material'; import { yupResolver } from '@hookform/resolvers/yup'; import { Autocomplete, Button, Card, Collapse, Container, Divider, Grid, Stack, Table, TableBody, TableCell, TableRow, TextField, Typography } from '@mui/material'; import { Controller, useForm } from 'react-hook-form'; -import { useParams, useNavigate } from 'react-router-dom'; +import { useParams } from 'react-router-dom'; import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; import { FormProvider, RHFCheckbox, RHFSelect, RHFTextField } from '../../components/hook-form'; import Page from '../../components/Page'; @@ -15,49 +17,46 @@ import { enqueueSnackbar } from 'notistack'; import { LoadingButton } from '@mui/lab'; import { fCurrency } from '../../utils/formatNumber'; import Iconify from '../../components/Iconify'; -import Form from './Form'; +import { ClaimRequest } from '@/@types/claims'; +import FormEdit from './Components/FormEdit'; +import FormCreate from './Components/FormCreate'; export default function ClaimsCreateUpdate() { - - const { themeStretch } = useSettings(); - const { id } = useParams(); - const isEdit = id ? true : false; + const { themeStretch } = useSettings(); + const { id } = useParams(); - const [currentClaim, setCurrentClaim] = useState(); + const isEdit = id ? true : false; + + const [currentClaim, setCurrentClaim] = useState(); + + useEffect(() => { + if (isEdit) { + axios.get('/claim-requests/' + id).then((res) => { + console.log('Yeet', res.data); + setCurrentClaim(res.data.data); + }); + + console.log(currentClaim) + } + }, [id]); - useEffect(() => { - if (isEdit) { - axios.get('/claims/' + id).then((res) => { - // console.log('Yeet', res.data); - setCurrentClaim(res.data); - }); - } - }, [id]); - return ( - + - - - + { + id == undefined + ? + ( + + ) + : + ( + + ) + } -
); diff --git a/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx new file mode 100644 index 00000000..39aa66ab --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx @@ -0,0 +1,306 @@ +// mui +import { Container, Grid, Stack, Typography, Card, TextField, Divider, ButtonBase, Box, IconButton } from '@mui/material'; +// components +import Page from '../../components/Page'; +// utils +import useSettings from '../../hooks/useSettings'; +// react +import { useNavigate, useParams, useLocation } from 'react-router-dom'; +import { useEffect, useState, useRef } from 'react'; +import axios from '../../utils/axios'; +// pages +import DetailTimeline from '../../pages/ClaimRequests/DetailTimeline'; +import DetailStepper from '../../pages/ClaimRequests/DetailStepper'; +import { format } from 'date-fns'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import RemoveIcon from '@mui/icons-material/Remove'; +import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import Iconify from '@/components/Iconify'; +import { fPostFormat } from '@/utils/formatTime'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; +import DownloadIcon from '@mui/icons-material/Download'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { makeFormData } from '@/utils/jsonToFormData'; + +import { enqueueSnackbar } from 'notistack'; + +// ---------------------------------------------------------------------- + +export default function Detail() { + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const code = queryParams.get('code'); + + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const [data, setData] = useState(); + const [dataDialog, setDataDialog] = useState(); + const [document, setDocument] = useState(null); + + const { id } = useParams(); + + useEffect(() => { + axios + .get('/claim-requests/detail/'+id) + .then((response) => { + setData(response.data); + setDataDialog(response.data.data.dialog_submits); + setDocument(response.data.data.documents); + + }) + .catch((error) => { + console.error(error); + }); + + }, []); + + const [isInvoiceVisible, setInvoiceVisibility] = useState(false); + + const handleInvoice = () => { + setInvoiceVisibility(!isInvoiceVisible); + } + const currentDate = new Date(); + const formattedCurrentDate = format(currentDate, 'dd MMM yyyy'); + const [dateInvoice, setDateInvoice] = useState(currentDate); + + const fileInvoiceInput = useRef(null); + const [fileInvoices, setFileInvoices] = useState([]); + + const handleInvoiceInputChange = (event) => { + if (event.target.files[0]) { + setFileInvoices([...fileInvoices, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeInvoiceFiles = (filesState, index) => { + setFileInvoices( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + const date = dateInvoice ? fPostFormat(dateInvoice, 'yyyy-MM-dd') : null; + + const [openDialogSubmit, setOpenDialogSubmit] = useState(false); + const handleCloseDialogSubmit = () => { + setOpenDialogSubmit(false); + } + const handleSubmitData = () => { + // if(fileInvoices.length > 0) + // { + //submit data + axios + .post('claim-requests/'+id+'/approve') + .then((response) => { + enqueueSnackbar('Success Submit Claim Request', { variant: 'success' }); + setOpenDialogSubmit(false); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + //Upload file invoices + const formData = makeFormData({ + date:date, + invoice_files: fileInvoices, + }); + axios + .post('claim-requests/'+id+'/invoice-files', formData) + .then((response) => { + enqueueSnackbar(response.data.message ?? 'Success upload invoice', { variant: 'success' }); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }); + // } + // else + // { + // enqueueSnackbar('Please upload file invoice, before submit', { variant: 'warning' }); + // } + + setTimeout(() => + { + window.location.reload(); + }, 5000); + + }; + + const check_invoice = document?.find((dataInvoice) => dataInvoice.type === 'claim-invoice'); + + return ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + {(data && data.data) ? data.data.status.code : ''} + {data ? ( + + Submission Date + {(data && data.data) ? format(new Date(data.data.status.submission_date), "d MMM yyyy") : ''} + + ) : ''} + + {data ? ( + + + + + + + Format Claim + + + + {check_invoice ? ( + + + Request Claim + + + + ) : ''} + + + + + { + setDateInvoice(newValue); + }} + inputFormat="dd MMM yyyy" + renderInput={(params) => } + /> + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileInvoices && + fileInvoices.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeInvoiceFiles(fileInvoices, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileInvoiceInput.current?.click()}> + + + + Upload Invoice + + + + + + + + + + + + + {dataDialog && dataDialog.status === 'requested' ? ( + <> + + + + ) : ''} + {/* Dialog Submits */} + + + + + Confirmation + + + + + + + + {dataDialog ? ( + + Are you sure to submit this claim ? + + + Code + {dataDialog.code} + + + Name + {dataDialog.name} + + + Date Submission + {fDateTimesecond(dataDialog.submission_date)} + + + Claim Method + Service Type + + + Service Type + + {dataDialog.service_code === 'IP' ? 'Inpatient' : 'Outpatient'} + + + + + ) : ''} + + + + + + + + + + ) : ''} + + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/DetailStepper.tsx b/frontend/dashboard/src/pages/ClaimRequests/DetailStepper.tsx new file mode 100644 index 00000000..b788e29f --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/DetailStepper.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stepper from '@mui/material/Stepper'; +import Step from '@mui/material/Step'; +import StepLabel from '@mui/material/StepLabel'; +import { useEffect, useState } from 'react'; +import ClearIcon from '@mui/icons-material/Clear'; + +const steps = [ + 'Request', + 'Review', + 'Approval', + 'Decline', + ]; + + export default function HorizontalLinearAlternativeLabelStepper({data}) { + const [active, setActive] = useState(0); + const [status, SetStatus] = useState(null); + let updatedSteps = [...steps]; + useEffect(() => { + if (data && data.data) { + if (data.data.status.status === 'requested') { + setActive(1); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'reviewed') { + setActive(2); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'approved') + { + setActive(3); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if(data.data.status.status === 'declined') + { + setActive(4) + updatedSteps = updatedSteps.filter(step => step !== 'Approval'); + } + } + SetStatus(updatedSteps); + }, [data]); + + + + + return ( + + + {status?.map((label) => ( + + : ''}>{label} + + ))} + + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/DetailTimeline.tsx b/frontend/dashboard/src/pages/ClaimRequests/DetailTimeline.tsx new file mode 100644 index 00000000..f62a706d --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/DetailTimeline.tsx @@ -0,0 +1,426 @@ +import * as React from 'react'; +import Timeline from '@mui/lab/Timeline'; +import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; +import TimelineSeparator from '@mui/lab/TimelineSeparator'; +import TimelineConnector from '@mui/lab/TimelineConnector'; +import TimelineContent from '@mui/lab/TimelineContent'; +import TimelineDot from '@mui/lab/TimelineDot'; +import {Typography, Card, Stack, ButtonBase, Box, Divider} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import Iconify from '../../components/Iconify'; +import { useEffect, useState, useRef } from 'react'; +import { format } from 'date-fns'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; +import DescriptionIcon from '@mui/icons-material/Description'; +import { LoadingButton } from '@mui/lab'; +import axios from '../../utils/axios'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { enqueueSnackbar } from 'notistack'; +import { useParams} from 'react-router-dom'; + +const Item1 = styled(Paper)(({ theme }) => ({ + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + backgroundColor: '#919EAB29', + color: '#637381', + width: 'fit-content', + marginRight: 'auto', +})); + +const Item2 = styled(Paper)(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + color: theme.palette.text.secondary, + width: 'fit-content', + marginLeft: 'auto', +})); + +export default function NoOppositeContent({data}) { + const [timeline, setTimeline] = useState(null); + const [requestFile, setRequestFile] = useState(null); + const [document, setDocument] = useState(null); + useEffect(() => { + if (data && data.data) { + setTimeline(data.data.timeline); + setRequestFile(data.data.request_files); + setDocument(data.data.documents); + } + + }, [data]); + + // Diagnosis + const fileRequestDocumentInputDiagnosis = useRef(null); + const [fileDiagnosis, setFileDiagnosis] = useState([]); + const handleRequestDocumentInputChangeDiagnosis = (event) => { + if (event.target.files[0]) { + setFileDiagnosis([...fileDiagnosis, ...event.target.files]); + } + }; + const removeFileDiagnois = (filesState, index) => { + setFileDiagnosis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Kondisi + const fileRequestDocumentInputKondisi = useRef(null); + const [fileKondisi, setFileKondisi] = useState([]); + const handleRequestDocumentInputChangeKondisi = (event) => { + if (event.target.files[0]) { + setFileKondisi([...fileKondisi, ...event.target.files]); + } + }; + const removeFileKondisi = (filesState, index) => { + setFileKondisi( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Result + const fileRequestDocumentInputResult = useRef(null); + const [fileResult, setFileResult] = useState([]); + const handleRequestDocumentInputChangeResult = (event) => { + if (event.target.files[0]) { + setFileResult([...fileResult, ...event.target.files]); + } + }; + const removeFileResult = (filesState, index) => { + setFileResult( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + const { id } = useParams(); + const [submitLoading, setSubmitLoading] = useState(false); + const submitRequestFiles = () => { + setSubmitLoading(true); + const formData = makeFormData({ + fileDiagnosis: fileDiagnosis, + fileKondisis: fileKondisi, + fileResults: fileResult + }); + axios + .post('claim-requests/'+id+'/request-files', formData) + .then((response) => { + window.location.reload(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }); + } + const submitButton = requestFile?.find((dataRequestFile) => dataRequestFile.check_files === null); + return ( + <> + {timeline?.map((dataTimeline, index) => ( + + {dataTimeline.date ? format(new Date(dataTimeline.date), "d MMM yyyy") : ''} + + + + + + + + + + {dataTimeline.date ? format(new Date(dataTimeline.date), "HH : mm") : ''} + {dataTimeline.txt_status} + + + Detail: + {dataTimeline.description} + + {dataTimeline.status === 'reviewed' && requestFile ? ( + <> + {submitButton ? ( + Request Document + ) : ( + Request Document Success Uploaded + )} + {/* Diagnosis */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-diagnosis' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Diagnosis + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosis && + fileDiagnosis.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileDiagnois(fileDiagnosis, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputDiagnosis.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeDiagnosis(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Kondisi */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-kondisi' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Condition + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisi && + fileKondisi.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileKondisi(fileKondisi, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputKondisi.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeKondisi(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Supporting Result */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-result' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Supporting Result + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileResult && + fileResult.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileResult(fileResult, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputResult.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeResult(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {submitButton ? ( + { + submitRequestFiles(); + }} + loading={submitLoading} + > + Submit + + ) : ''} + + ) : ''} + + + {dataTimeline.status === 'requested' ? ( + + + + + Documents + + + {document?.map((dataDocument, index) => ( + + + {dataDocument.type === 'claim-diagnosis' ? + 'Diagnosis' + : dataDocument.type === 'claim-kondisi' ? + 'Condition' + : dataDocument.type === 'claim-result' ? + 'Supporting Result' + : dataDocument.type === 'claim-invoice' ? + 'Invoice' + : ''} + + + + + {dataDocument.original_name ? dataDocument.original_name : '-'} + + + + ))} + + + + ) : ''} + + + + ))} + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Form.tsx b/frontend/dashboard/src/pages/ClaimRequests/Form.tsx deleted file mode 100644 index a4898695..00000000 --- a/frontend/dashboard/src/pages/ClaimRequests/Form.tsx +++ /dev/null @@ -1,596 +0,0 @@ -import * as Yup from 'yup'; -import { useSnackbar } from 'notistack'; -import { useNavigate } from 'react-router-dom'; -import { yupResolver } from '@hookform/resolvers/yup'; -import { Controller, useForm } from 'react-hook-form'; -import React, { useEffect, useMemo, useState } from 'react'; -import axios from '../../utils/axios'; -import { FormProvider, RHFTextField } from '../../components/hook-form'; -import { - Autocomplete, - Button, - Grid, - Stack, - Table, - TableBody, - TableCell, - TableRow, - TextField, - Typography, - useTheme, - List, - ListItem, - IconButton, - ListItemAvatar, - Avatar, - ListItemText, -} from '@mui/material'; -import Iconify from '../../components/Iconify'; -import { LoadingButton } from '@mui/lab'; -import { fCurrency } from '../../utils/formatNumber'; -import MemberSelectDialog from '../../components/dialogs/MemberSelectDialog'; -import { Add, DeleteOutline } from '@mui/icons-material'; - -type Props = { - isEdit: boolean; - currentClaim?: any; -}; - -export default function ClaimForm({ isEdit, currentClaim }: Props) { - const navigate = useNavigate(); - - const { enqueueSnackbar } = useSnackbar(); - - const NewCorporateSchema = Yup.object().shape({ - name: Yup.string().required('Name is required'), - code: Yup.string().required('Corporate Code is required'), - active: Yup.boolean().required('Corporate Status is required'), - // file: Yup.boolean().required('Corporate Status is required'), - }); - - const defaultValues = useMemo( - () => ({ - member: currentClaim?.member || {}, - member_id: currentClaim?.member_id || null, - diagnosis_id: currentClaim?.diagnosis_id || null, - total_claim: currentClaim?.total_claim || 0, - }), - // eslint-disable-next-line react-hooks/exhaustive-deps - [currentClaim] - ); - - const methods = useForm({ - resolver: yupResolver(NewCorporateSchema), - defaultValues, - }); - const { - reset, - watch, - control, - setValue, - getValues, - setError, - handleSubmit, - formState: { isSubmitting }, - } = methods; - - const values = watch(); - - const [isCheckingLimit, setIsCheckingLimit] = useState(false); - const [isEligible, setIsEligible] = useState(false); - const [memberBenefits, setMemberBenefits] = useState([]); - const [diagnosisOption, setDiagnosisOption] = useState([]); - const [isMemberDialogOpen, setIsMemberDialogOpen] = useState(false); - const [member, setMember] = useState({}) - - - useEffect(() => { - console.log('defaultValues', defaultValues); - if (isEdit && currentClaim) { - reset(defaultValues); - setMember(defaultValues.member) - } - if (!isEdit) { - reset(defaultValues); - setMember(defaultValues.member) - } - }, [isEdit, currentClaim]); - - const fileSelected = (event, type) => { - const files = event.target.files; - const currentFiles = getValues(`uploaded_files.${type}`) ?? []; - - setValue(`uploaded_files.${type}`, [...currentFiles, ...files]); - - console.log('currentFiles', getValues('uploaded_files')); - }; - - const memberSelected = (member) => { - setMember(member) - }; - - const checkLimit = async () => { - console.log('CHECKING LIMIT'); - }; - - const onSubmit = async (data: any) => { - try { - if (!isEdit) { - const response = await axios.post('/claims', data); - } else { - const response = await axios.put('/claims/' + currentClaim?.id ?? '', data); - } - reset(); - enqueueSnackbar( - !isEdit ? 'Organizations Created Successfully!' : 'Organizations Udpated Successfully!', - { variant: 'success' } - ); - navigate('/claims'); - } catch (error: any) { - if (error && error.response.status === 422) { - for (const [key, value] of Object.entries(error.response.data.errors)) { - setError(key, { message: value[0] }); - enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); - } - } else { - enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); - } - } - - const ascent = document?.querySelector('ascent'); - if (ascent != null) { - ascent.innerHTML = ''; - } - }; - - function generate(files, element: React.ReactElement) { - return files.map((value) => - React.cloneElement(element, { - key: value, - }) - ); - } - - const headStyle = {}; - return ( - - - Member - - - - { - if (!isEdit) setIsMemberDialogOpen(true); - if (isEdit) enqueueSnackbar('Cannot Change Member', { variant: 'error' }); - }} - /> - - {/* - - */} - - - {member?.id && ( - - - - - - - - Name - - {member?.full_name} - - - - DOB - - - {member?.birth_date} ({member?.age + ' years'}) - - - - - Marital Status - - {member?.marital_status} - - - - Record Type - - {member?.record_type} - - - - Principal ID - - - {member?.principal_id} ( - {member?.relation_with_principal}) - - - -
-
- - - - - - Plan - - {member?.current_plan?.code} - - - - Active - - - {member?.current_plan?.start} -{' '} - {member?.current_plan?.end} (Active) - - - - - Corporate Limit - - - {fCurrency(0)} / {fCurrency(member?.current_plan?.limit_rules)} - - - - - Plan Usage - - - {fCurrency(0)} / {fCurrency(member?.current_plan?.limit_rules)} - - - -
-
-
-
- )} - - ( - - option ? `#${option.id} (${option.code}) ${option.description}` : '' - } - value={value || ''} - onChange={(event: any, newValue: any) => { - setValue('benefit_id', newValue?.id); - onChange(newValue); - }} - renderInput={(params) => ( - { - // if (event.key === 'Enter') - // searchDiagnosis(event.target.value) - // }} - /> - )} - /> - )} - /> - - ( - (option ? `(${option.code}) ${option.name}` : '')} - value={value || ''} - onChange={(event: any, newValue: any) => { - setValue('diagnosis_id', newValue?.id); - // setValue('diagnosis', newValue) - onChange(newValue); - }} - renderInput={(params) => ( - { - if (event.key === 'Enter') searchDiagnosis(event.target.value); - }} - /> - )} - /> - )} - /> - - {isCheckingLimit && ( - - {/* Checking */} - - - - Please Wait, Checking Eligibilty - - - - )} - {false && isCheckingLimit == false && isEligible == null && ( - - {/* No Data Selected */} - - - - Please Select Diagnosis ! - - - - )} - {!isCheckingLimit && isEligible !== null && isEligible && ( - - {/* Eligible */} - - - - Diagnosis is Eligible - - - - 125.000.000 / 125.000.000 - - - )} - {!isCheckingLimit && isEligible !== null && !isEligible && ( - - {/* Not Eligible */} - {/* - - - Not Eligible - - - - 125.000.000 / 125.000.000 - */} - - )} - - - - {isEdit && ( - - Documents - - - {(getValues('uploaded_files.invoice') && getValues('uploaded_files.invoice').length - ? getValues('uploaded_files.invoice') - : [] - ).map((file, index) => ( - - - - } - > - - - {/* */} - I - - - - - ))} - - - - {(getValues('uploaded_files.prescription') && getValues('uploaded_files.prescription').length - ? getValues('uploaded_files.prescription') - : [] - ).map((file, index) => ( - - - - } - > - - - {/* */} - P - - - - - ))} - - - - - {(getValues('uploaded_files.diagnosis') && getValues('uploaded_files.diagnosis').length - ? getValues('uploaded_files.diagnosis') - : [] - ).map((file, index) => ( - - - - } - > - - - {/* */} - DR - - - - - ))} - - - - )} - - {isEligible === true ? ( - - Create Claim - - ) : ( - - Check Limit - - )} -
- - -
- ); -} diff --git a/frontend/dashboard/src/pages/ClaimRequests/List.tsx b/frontend/dashboard/src/pages/ClaimRequests/List.tsx index e8489b62..98e193f4 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/List.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/List.tsx @@ -17,12 +17,17 @@ import { ButtonGroup, Link, Chip, + TableHead, + Grid, } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; + +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; // hooks import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; @@ -38,12 +43,19 @@ import { enqueueSnackbar } from 'notistack'; import { Divider } from '@mui/material'; import Iconify from '@/components/Iconify'; import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { capitalizeFirstLetter } from '@/utils/formatString'; +import Label from '@/components/Label'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import { Import } from '@/@types/claims'; // import LoadingButton from '@/theme/overrides/LoadingButton'; export default function List() { const { themeColorPresets } = useSettings(); const [searchParams, setSearchParams] = useSearchParams(); - const [importResult, setImportResult] = useState(null); + const [importResult, setImportResult] = useState(null); + + const navigate = useNavigate() function SearchInput(props: any) { // SEARCH @@ -75,6 +87,7 @@ export default function List() { fullWidth onChange={handleSearchChange} value={searchText} + placeholder='Search Code or Name...' /> ); @@ -87,26 +100,174 @@ export default function List() { const createMenu = Boolean(anchorEl); const importForm = useRef(null); const [currentImportFileName, setCurrentImportFileName] = useState(null); + const [importLoading, setImportLoading] = useState(false); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; const handleClose = () => { setAnchorEl(null); }; + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected'); + } + }; + + const handleCancelImportButton = () => { + importForm.current.value = ''; + importForm.current.dispatchEvent(new Event('change', { bubbles: true })); + }; + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name); + } else { + setCurrentImportFileName(null); + } + }; + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append('file', importForm.current?.files[0]); + + setImportLoading(true); + axios + .post(`claim-requests/import`, formData) + .then((response) => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + setImportLoading(false); + }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + setImportLoading(false); + }); + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }); + } + }; + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + const handleGetData = (type :string) => { + axios.get(`corporates/${corporate_id}/data-plan-benefit`) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + return (
- - - {/* */} - + + {!currentImportFileName && ( + + + + + Import + {handleGetTemplate('claim-request')}}>Download Template + {handleGetData('data-plan-benefit')}}>Download Claim Request + + + + )} + + {currentImportFileName && ( + + + + + + + } + sx={{ p: 1.8 }} + onClick={handleUpload} + loading={importLoading} + > + Upload + + + )} + {importResult && ( + + + Last Import Result Report :{' '} + + {importResult.result_file?.name ?? '-'} + + + + )}
); } @@ -176,45 +337,46 @@ export default function List() { return ( *': { borderBottom: 'unset' } }}> - + {/* setOpen(!open)}> {open ? : } - + */ } { - handleShowClaim(row); - }} - color={themeColorPresets} + // onClick={() => { + // handleShowClaim(row); + // }} > {row.code} {row.member?.full_name} - {row.member?.full_name} - {row.submission_date} + {row.service_name} {row.payment_type_name} - - + + { row.status == "requested" ? + () : + () + } - {row.status == 'requested' && ( - { - handleApprove(row); - }} - > - Ajukan Claim - - )} + + navigate(`/claim-requests/edit/${row.id}`)}> + + Edit + + navigate ('/claim-requests/detail/'+row.id+'')}> + + Detail + + + } /> {/* - + { handleShowClaim(row); @@ -236,17 +398,58 @@ export default function List() { > Berkas Hasil Penunjang - {row.files_by_type?.result && - row.files_by_type?.result.map((file, index) => ( + {/* {row.files_by_type?.claim_kondisi && + row.files_by_type?.claim_kondisi.map((file, index) => ( -{' '} {file.name} - ))} + ))} */} - {!row.files_by_type?.result && Tidak ada berkas} + {row.files_by_type?.claim_kondisi && ( + <> + - Kondisi + {row.files_by_type?.claim_kondisi.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_diagnosis && ( + <> + - Diagnosa + {row.files_by_type?.claim_diagnosis.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_result && ( + <> + - Hasil + {row.files_by_type?.claim_result.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + {(!row.files_by_type?.claim_result && !row.files_by_type?.claim_diagnosis && !row.files_by_type?.claim_kondisi)&& Tidak ada berkas}
@@ -264,9 +467,9 @@ export default function List() { return ( {/* ------------------ TABLE HEADER ------------------ */} - + - + {/* */} Code @@ -274,23 +477,20 @@ export default function List() { Name - Nomor Polis - - - Tanggal Pengajuan + Date of Submission Service Type - Claim Type + Claim Method Status - + {/* ------------------ END TABLE HEADER ------------------ */} {/* ------------------ TABLE ROW ------------------ */} @@ -346,23 +546,28 @@ export default function List() { function handleDownloadLog() {} return ( - - + + + + - } - /> - - - + + } + /> + + + + + ); } diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx new file mode 100644 index 00000000..da72ff60 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx @@ -0,0 +1,79 @@ +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { MemberListType } from './Types'; +import { makeFormData } from '@/utils/jsonToFormData'; + +/** + * Listing Member + */ +export const getMemberList = async ( page: number, keyword: string ): Promise => { + const response = await axios.get(`/claim-requests/list-member?page=${page}&keyword=${keyword}`) + .then((res) =>{ + return res.data.data.member_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Add Claim Request + */ +export const addClaimRequest = async ( data: MemberListType[] ): Promise => { + // Mapping + const formData = new FormData(); + + data.map((row, index) => { + formData.append(`member_id[${index}]`, row.id.toString()); + formData.append(`service_code[${index}]`, row.patien_type??''); + + if (row.file_kondisi != undefined) { + row.file_kondisi.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_kondisi[member_${row.id}][${file_index}]`, file); + }); + } + + if (row.file_diagnosa != undefined) { + row.file_diagnosa.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_diagnosa[member_${row.id}][${file_index}]`, file); + }); + } + + if (row.file_penunjang != undefined) { + row.file_penunjang.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_penunjang[member_${row.id}][${file_index}]`, file); + }); + } + }) + + // Axios + const response = await axios.post(`/claim-requests`, formData) + .then((res) =>{ + enqueueSnackbar("Berhasil membuat data !", { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return false; + }); + + return response; +}; diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx new file mode 100644 index 00000000..81b7da49 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx @@ -0,0 +1,25 @@ +/** + * Search Type + */ +export type SearchType = { + keyword: string, +} + +/** + * Member List + */ +export type MemberListType = { + id : string, + member_id : string, + name : string, + service_type : ServiceType[], + patien_type? : string, + file_kondisi? : any[], + file_diagnosa? : any[], + file_penunjang? : any[], +} + +export type ServiceType = { + code : string + name : string +} diff --git a/frontend/dashboard/src/pages/Claims/CreateUpdate.tsx b/frontend/dashboard/src/pages/Claims/CreateUpdate.tsx index 58bb43d6..aeae501f 100644 --- a/frontend/dashboard/src/pages/Claims/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/Claims/CreateUpdate.tsx @@ -28,31 +28,26 @@ export default function ClaimsCreateUpdate() { useEffect(() => { if (isEdit) { - axios.get('/claims/' + id).then((res) => { - // console.log('Yeet', res.data); - setCurrentClaim(res.data); - }); + axios.get(`/claims/${id}/edit`).then((res) => { + console.log('Yeet', res.data.data); + setCurrentClaim(res.data.data); + });; + } }, [id]); return ( - + diff --git a/frontend/dashboard/src/pages/Claims/Detail.tsx b/frontend/dashboard/src/pages/Claims/Detail.tsx new file mode 100644 index 00000000..28cf2c47 --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/Detail.tsx @@ -0,0 +1,1569 @@ +import * as Yup from 'yup'; +// mui +import { + Container, + Grid, + Stack, + Typography, + Card, + TextField, + Divider, + ButtonBase, + Box, + IconButton, + Autocomplete, + FormControl, + InputLabel, + Select, + FormHelperText, + MenuItem } from '@mui/material'; +// components +import Page from '../../components/Page'; +// utils +import useSettings from '../../hooks/useSettings'; +// react +import { useNavigate, useParams, useLocation } from 'react-router-dom'; +import { useEffect, useState, useRef, useMemo } from 'react'; +import axios from '../../utils/axios'; +// pages +import { format } from 'date-fns'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import FormGroup from '@mui/material/FormGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; +import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import { fPostFormat } from '@/utils/formatTime'; +import { fDate, fDateTime } from '../../utils/formatTime'; +import ListItemText from '@mui/material/ListItemText'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; + +import { enqueueSnackbar } from 'notistack'; +import BenefitConfigurationList from './components/BenefitConfigurationList'; +import { map } from 'lodash'; + + +import { FormProvider, RHFDatepicker, RHFSelect, RHFTextField } from '@/components/hook-form'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { ClaimHistoryCare } from '@/@types/claims'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { LoadingButton } from '@mui/lab'; +import { Delete, Edit, EditOffOutlined, EditTwoTone, LoopOutlined, RefreshOutlined } from '@mui/icons-material'; +import { fDateOnly, fDateTimeSuffix } from '@/utils/formatTime'; +import Label from '@/components/Label'; +import RHFAutocomplete from '../../components/hook-form/RHFAutocompleteV2'; + +// ---------------------------------------------------------------------- + +export default function Detail() { + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const code = queryParams.get('code'); + + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const [customerData, setCustomerData] = useState(null); + const [documentData, setDocumentData] = useState(null); + const [requestDocumentData, setRequestDocumentData] = useState(null); + const [serviceData, setServiceData] = useState(null); + const [serviceBenefitData, setServiceBenefitData] = useState(null); + const [dataDialog, setDataDialog] = useState(null); + + const { id } = useParams(); + + useEffect(() => { + axios + .get('/claims/detail/'+id) + .then((response) => { + setCustomerData(response.data.data.customer_data); + setDocumentData(response.data.data.documents); + setRequestDocumentData(response.data.data.request_documents); + setServiceData(response.data.data.claim_services); + setServiceBenefitData(response.data.data.claim_service_benefits); + setDataDialog(response.data.data.dialog_submits); + }) + .catch((error) => { + console.error(error); + }); + getService(); + + }, []); + + function toTitleCase(str: string | null) { + return str.replace(/\w\S*/g, function(txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + //Request + const [openDialogRequest, setOpenDialogRequest] = useState(false); + const handleCloseDialogRequest = () => { + setOpenDialogRequest(false); + } + + const [conditionChecked, setConditionChecked] = useState(true); + const [diagnosisChecked, setDiagnosisChecked] = useState(false); + const [supportingResultChecked, setSupportingResultChecked] = useState(false); + + const handleConditionChange = (event) => { + setConditionChecked(event.target.checked); + }; + + const handleDiagnosisChange = (event) => { + setDiagnosisChecked(event.target.checked); + }; + + const handleSupportingResultChange = (event) => { + setSupportingResultChecked(event.target.checked); + }; + + const [noteField, setNoteField] = useState(''); + const [noteFieldError, setNoteFieldError] = useState(''); + const isRequiredFieldsFilled = () => { + return noteField.trim() !== ''; + }; + + const handelRequestDocument = () => { + const dataForm = { + claim_id: id, + condition: conditionChecked, + diagnosis: diagnosisChecked, + result: supportingResultChecked, + note: noteField, + } + axios + .post('/claims/request-documents', dataForm) + .then((response) => { + enqueueSnackbar('Success Request Document', { variant: 'success' }); + setOpenDialogRequest(false); + window.location.reload(); + }) + .catch((error) => { + enqueueSnackbar('Something Went Wrong', { variant: 'error' }); + }) + } + + /*---------------------- Handle History Hospital Care ----------------------------*/ + + interface FormValuesProps extends Partial { + taxes: boolean; + inStock: boolean; + } + + + /**------------- Handle History Hospital Care ---------------------*/ + const [currentClaimHistoryCare, setCurrentClaimHistoryCare] = useState(null); + const [organization, setOrganization] = useState([]); // Untuk Hospital + const [doctor, setDoctor] = useState([]); // Untuk Docter + const [corporate_id, setCorporateId] = useState(null); // Untuk Corporate + const [main_diagnosis, setMainDiagnosis] = useState([]); // Untuk Main diagnosis + const [claimHistoryId,setClaimHistoryId] = useState(null); // Untuk edit Claim History + + const [carehistory, setCarehistory] = useState(null); + const [isEdit,setEdit] = useState(false); + const [service_code, setServiceType] = useState(); + const handleCloseDialogUpdate = () => { + setOpenDialogRequest(false); + reset() + } + + useEffect( () => { + axios + .get('claims/'+id) + .then((response) => { + setCorporateId(response.data.data.corporate_id) + setCurrentClaimHistoryCare(response.data.data.history_hospital_care) + setServiceType(response.data.data.service_code) + + }) + }, [id]) + + useEffect( () => { + // setMainDiagnosis + axios + .get(`corporates/${corporate_id}/diagnosis`) + .then((response) => { + setMainDiagnosis(response.data.data) + }) + + // setOrganization atau hospital atau location + axios + .get(`corporates/${corporate_id}/hospitals`) + .then((response) => { + setOrganization(response.data.data) + }) + + }, [corporate_id]) + + useEffect( () => { + // setCarehistory + if (claimHistoryId != null) { + axios + .get('/claims/carehistory/'+claimHistoryId) + .then((response) => { + reset({ + service_code: response.data.data.service_code, + admission_date: response.data.data.admission_date, + discharge_date: response.data.data.discharge_date, + organization_id: response.data.data.organization_id, + practitioner_id: response.data.data.practitioner_id, + medical_record_number: response.data.data.medical_record_number, + symptoms: response.data.data.symptoms, + sign: response.data.data.sign, + main_diagnosis_id: response.data.data.main_diagnosis_id, + secondary_diagnosis_id: response.data.data.secondary_diagnosis.map((row: any) => ({ + value: { + id: row.id, + name: row.icd.name + } + })) + }); + + setCarehistory(response.data.data); + }) + .catch((error) => { + console.error(error); + }); + // setDoctor atau practioner + axios + .get('/doctors?search=&organization_id='+values.organization_id) + .then((response) => { + setDoctor(response.data.data); + + }) + .catch((error) => { + console.error(error); + }); + + // setMainDiagnosis + axios + .get(`corporates/${corporate_id}/diagnosis`) + .then((response) => { + setMainDiagnosis(response.data.data) + }) + + // setOrganization atau hospital atau location + axios + .get(`corporates/${corporate_id}/hospitals`) + .then((response) => { + setOrganization(response.data.data) + }) + } + + }, [claimHistoryId]) + + useEffect( () => { + reset(defaultValues); + }, [isEdit]) + + + const [openDialogHospitalCare, setOpenHospitalCare] = useState(false); + + const handleCloseDialogHospitalCare = () => { + setEdit(false) + setOpenHospitalCare(false); + setClaimHistoryId(null) + reset(); + } + + const [openDialogApproval, setOpenDialogApproval] = useState(false); + + const handleCloseDialogApprove = () => { + setOpenDialogApproval(false); + setEdit(false) + setClaimHistoryId(null); + reset(); + } + + /* Handle For Approve Claim */ + const handleApproveClaim = (id: number|null, claim_id: number|null) =>{ + // let data = { + // status: 1 + // } + // axios.post(`/claims/carehistory/${id}/approval`, data); + // setOpenDialogApproval(false) + // enqueueSnackbar( + // 'Claim Approve Successfully!', + // { variant: 'success' } + // ); + // window.location.reload(); + + const dataForm = { + status: 1, + claim_id: id + } + axios + .post(`/claims/carehistory/approval`, dataForm) + .then((response) => { + enqueueSnackbar('Claim Approve Successfully!', { variant: 'success' }); + setOpenDialogApproval(false); + window.location.reload(); + }) + .catch((error) => { + enqueueSnackbar('Something Went Wrong', { variant: 'error' }); + }) + + } + + // Handle Location Change + const handleLocationChange = (organization_id:number) => { + // if (newValue) { + const selectedValue = organization_id; + setValue('organization_id', selectedValue); + // let data = { + // ...values, + // practitioner_id: 0 + // } + // reset(data) + + axios + .get('/doctors?search=&organization_id=' + selectedValue) + .then((response) => { + setDoctor(response.data.data); + }) + .catch((error) => { + console.error(error); + }); + // } + } + + const handleDoctorChange = (event, newValue) => { + if (newValue) { + const selectedValue = newValue.id; + setValue('practitioner_id', selectedValue); + } + } + + const handleMainDiagnosisChange = (event, newValue) => { + if (newValue) { + const selectedValue = newValue.id; + setValue('main_diagnosis_id', selectedValue); + } + } + + const defaultValues = useMemo( + () => ({ + service_code: service_code, + secondary_diagnosis_id: [{ + value: { + name: "", + value: 0 + } + }], + admission_date: isEdit ? carehistory?.admission_date : '', + discharge_date: isEdit ? carehistory?.discharge_date : '', + organization_id: isEdit ? carehistory?.organization_id : '', + practitioner_id: isEdit ? carehistory?.practitioner_id : '', + medical_record_number: isEdit ? carehistory?.medical_record_number : '', + symptoms: isEdit ? carehistory?.symptoms : '', + sign: isEdit ? carehistory?.sign : '', + main_diagnosis_id: isEdit ? carehistory?.main_diagnosis_id : 0, + }), + [service_code] + ) + + let NewClaimHistoryCareSchema = Yup.object().shape({ + service_code: Yup.string().required('Name is required'), + // admission_date: Yup.date().required('Admisision Date is required'), + // discharge_date: Yup.date().required('Discharge Date is required'), + // organization_id: Yup.number().required('Location is required'), + // practitioner_id: Yup.number().required('Doctor is required'), + // medical_record_number: Yup.string().required('Medical Record is required'), + // symptoms: Yup.string().required('Symptoms is required'), + // sign: Yup.string().required('Sign is required'), + // main_diagnosis_id: Yup.number().required('Main Diagnosis is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewClaimHistoryCareSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + resetField, + formState: { isSubmitting }, + } = methods; + + const values = watch(); + const valueOfLocation = organization.find((row) => row.organization_id === values.organization_id) + + const {fields, append, remove} = useFieldArray({name: "secondary_diagnosis_id", control}) + + const onSubmit = async (data: FormValuesProps) => { + if (isEdit){ + let newData = { + service_code: data.service_code, + admission_date: data.admission_date ? fDateOnly(data.admission_date) : null, + discharge_date: data.discharge_date ? fDateOnly(data.discharge_date) : null, + organization_id: data.organization_id, + practitioner_id: data.practitioner_id, + medical_record_number: data.medical_record_number, + symptoms: data.symptoms, + sign: data.sign, + secondary_diagnosis_id: data.secondary_diagnosis_id ? data.secondary_diagnosis_id.map((row) => row.value.id) : null, + main_diagnosis_id: data.main_diagnosis_id, + } + + const response:any = await axios.post(`/claims/carehistory/${claimHistoryId}/update`, newData); + // if (response.status == 'success'){ + setOpenHospitalCare(false) + enqueueSnackbar( + 'Claim Update Successfully!', + { variant: 'success' } + ); + navigate('/claims/detail/'+id); + window.location.reload(); + + // } + } else { + let newData = { + service_code: data.service_code, + admission_date: data.admission_date ? fDateOnly(data.admission_date) : null, + discharge_date: data.discharge_date ? fDateOnly(data.discharge_date) : null, + organization_id: data.organization_id, + practitioner_id: data.practitioner_id, + medical_record_number: data.medical_record_number, + symptoms: data.symptoms, + sign: data.sign, + secondary_diagnosis_id: data.secondary_diagnosis_id ? data.secondary_diagnosis_id.map((row) => row.value.id) : null, + main_diagnosis_id: data.main_diagnosis_id, + + } + + + const response:any = await axios.post(`/claims/${id}/carehistory`, newData); + // if (response.status == 'success'){ + setOpenHospitalCare(false) + enqueueSnackbar( + 'Claim Insert Successfully!', + { variant: 'success' } + ); + navigate('/claims/detail/'+id); + window.location.reload(); + // } + + } + + reset(); + } + + function secondaryDiagnosisOption() { + return fields.map((item, index) => { + return ( + + {`#${index+1}`} + + + opt.name} + isOptionEqualToValue={(opt, val) => opt.name === val.name} + label='Comparative Diagnosis (ICD-X)' + /> + + remove(index)}> + + + + + ) + }) + } + + function handleNewHospitalCare() { + setEdit(false); + setOpenHospitalCare(true); + reset(defaultValues); + } + + function handleEditHospitalCare(id: number) { + setClaimHistoryId(id); + setEdit(true); + setOpenHospitalCare(true); + reset(defaultValues); + } + + function handleUpdateHospitalCare(id: number) { + setOpenHospitalCare(false); + setClaimHistoryId(id); + setEdit(false); + setOpenDialogApproval(true); + } + + //Service + const [openDialogService, setOpenDialogService] = useState(false); + const handleCloseDialogService = () => { + setOpenDialogService(false); + } + const handleConditionChangeService = (event) => { + const selectedItem = event.target.value; + + if (valBenefitNames.includes(selectedItem)) { + // Item is already selected, remove it + setValBenefitNames(valBenefitNames.filter(item => item !== selectedItem)); + } else { + // Item is not selected, add it + setValBenefitNames([...valBenefitNames, selectedItem]); + } + }; + + //Data + const [serviceTypeData, setServiceTypeData] = useState(null); + const [benefitNameData, setBenefitNameData] = useState(null); + const [hospitalData, setHospitalData] = useState(null); + //Field + const currentDate = new Date(); + const formattedCurrentDate = format(currentDate, 'dd MMM yyyy'); + //Date Addmissions + const [dateAd, setDateAd] = useState(currentDate); + //Date Discharge + const [dateDis, setDateDis] = useState(currentDate); + //Service Type + const [valServiceType, setValServiceType] = useState(''); + const [valServiceTypeError, setValServiceTypeError] = useState(''); + //Benefit Name + const [valBenefitNames, setValBenefitNames] = useState([]); + const [valBenefitNameError, setValBenefitNameError] = useState(''); + //Hospital + const [valHospital, setValHospital] = useState(''); + const [valHospitalError, setValHospitalError] = useState(''); + //txt name + const [txtName, setTxtName] = useState('Add Service'); + //flag add or edit service + const [flagAddService, setFlagAddService] = useState('add'); + //id claim_services + const [idService, setIdService] = useState(null); + + + const isRequiredFieldsServiceType = () => { + return dateAd !== '' && dateDis !== '' && valServiceType !== '' && valBenefitNames.length > 0 && valHospital !== ''; + }; + + const getService = async () => { + try { + const response = await axios.get('/claims/get-services/' + id); + setServiceTypeData(response.data.data.service_type); + setValServiceType(response.data.data.service_type[0].id); + setBenefitNameData(response.data.data.benefit_name); + setHospitalData(response.data.data.hospital); + await Promise.all([ + setServiceTypeData(response.data.data.service_type), + setBenefitNameData(response.data.data.benefit_name), + setHospitalData(response.data.data.hospital), + ]); + + } catch (error) { + } + } + + + const handleAddService = async () => { + setTxtName('Add Service'); + setFlagAddService('add'); + setOpenDialogService(true); + } + + const handleEditService = async () => { + setDateAd(serviceData.addmission_date); + setDateDis(serviceData.discharge_date); + setIdService(serviceData.id); + + setOpenDialogService(true); + setTxtName('Edit Service'); + setFlagAddService('edit'); + + if (serviceTypeData) { + setValServiceType(serviceData.service_id); + setValHospital(serviceData.hospital_id); + setValBenefitNames(serviceBenefitData.benefit_id); + } + } + + const handelSaveServiceType = () => { + const dateAdd = dateAd ? fPostFormat(dateAd, 'yyyy-MM-dd') : null; + const dateDisc = dateDis ? fPostFormat(dateDis, 'yyyy-MM-dd') : null; + const data = { + flagAddService : flagAddService, + idService: idService, + claim_request_id: id, + dateAdd : dateAdd, + dateDisc : dateDisc, + serviceType : valServiceType, + benefitName : valBenefitNames, + hospital : valHospital + }; + axios + .post('/claims/save-services', data) + .then((response) => { + enqueueSnackbar('Success '+(flagAddService == 'add' ? 'Add' : 'Edit')+' Service', { variant: 'success' }); + handleCloseDialogService(); + window.location.reload(); + }) + .catch((error) => { + enqueueSnackbar('Something Went Wrong', { variant: 'error' }); + }) + } + + const [openDialogSubmit, setOpenDialogSubmit] = useState(false); + const handleCloseDialogSubmit = () => { + setOpenDialogSubmit(false); + } + + const [decline, setDeclaine] = useState(''); + + const handleSubmitData = () => { + //approve or decline + axios + .post('claims/'+id+'/'+decline) + .then((response) => { + enqueueSnackbar('Success '+toTitleCase(decline)+' Claim Request', { variant: 'success' }); + setOpenDialogSubmit(false); + window.location.reload(); + + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + + setTimeout(() => + { + window.location.reload(); + }, 5000); + + }; + + const handelDownloadLog = () => { + axios + .get(`final-log/${id}`, { + responseType: 'blob', + }) + .then((response) => { + window.open(URL.createObjectURL(response.data)); + }) + .catch((response) => { + enqueueSnackbar(response.message, { variant: 'error' }); + }); + } + + return ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + {(customerData && customerData.code ? customerData.code : '')} + {customerData ? ( + + + Status + {(customerData && customerData.status) ? toTitleCase(customerData.status) : ''} + + + Submission Date + {(customerData && customerData.submission_date) ? format(new Date(customerData.submission_date), "d MMM yyyy") : ''} + + + ) : ''} + + + {customerData ? ( + + + Summary of Customer Data + + Full Name + {customerData.name} + + + Policy Number + {customerData.payor_id} + + + Member ID + {customerData.member_id} + + + Claim Type + {toTitleCase(customerData.payment_type)} + + + Corporate Name + {toTitleCase(customerData.coporate_name)} + + + + ) : ''} + {documentData ? ( + + + {customerData?.status === 'received' ? ( + + Additional Documents + + + ) : ''} + + {documentData?.map((documentType, index) => ( + + + {documentType.type === 'claim-diagnosis' ? + 'Diagnosis' + : documentType.type === 'claim-kondisi' ? + 'Condition' + : documentType.type === 'claim-result' ? + 'Supporting Result' + : documentType.type === 'claim-invoice' ? + 'Invoice' + : ''} + + + + + {documentType.original_name ? documentType.original_name : '-'} + + + + ))} + + {requestDocumentData && requestDocumentData.length > 0 ? ( + Request Documents + ) : ''} + + {requestDocumentData?.map((documentType, index) => ( + + + + + + {documentType.type === 'claim-diagnosis' ? + 'Diagnosis' + : documentType.type === 'claim-kondisi' ? + 'Condition' + : documentType.type === 'claim-result' ? + 'Supporting Result' + : documentType.type === 'claim-invoice' ? + 'Invoice' + : ''} + + + + ))} + + {/* Dialog Request Documents */} + + + + + Request Document + + + + + + + + + + } + label="Condition Document" + /> + } + label="Diagnosis Document" + /> + } + label="Supporting Result Document" + /> + + + Notes* + + { + setNoteField(e.target.value); + setNoteFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} + fullWidth + inputProps={{ maxLength: 50 }} + error={!!noteFieldError} + helperText={noteFieldError} + /> + + + + + + + + + + ): ''} + + + + + History of Hospital Care + {customerData?.status === 'received' ? ( + + ) : ''} + + + + {currentClaimHistoryCare?.map((claimHistoryCare, index) => + claimHistoryCare.status === 0 ? ( + {/* Tambahkan key untuk setiap elemen dalam loop */} + + {customerData?.status === 'received' ? ( + + + + handleEditHospitalCare(claimHistoryCare.id)}> + Edit + + handleUpdateHospitalCare(claimHistoryCare.id)}> + Update Status + + + }/> + + ) : ''} + + Admission Date : + { fDate(claimHistoryCare.admission_date)} {/* Perbaikan typo di 'admission_date' */} + + + Discharge Date : + { fDate(claimHistoryCare.discharge_date)} + + + Location : + {toTitleCase(claimHistoryCare.organization?.name)} + + + Doctor : + {toTitleCase(claimHistoryCare.practitioner?.code)} - {claimHistoryCare.person?.name} + + + Status : + {claimHistoryCare.status == 0 ? 'Pending' : 'Approv'} + + + Diagnosis : + #{index+1} {claimHistoryCare.icd?.code} - {claimHistoryCare.icd?.name} + + + + ) : null + )} + + + {/* Dialog for input and update */} + + + + + {isEdit ? 'Update' : 'Add'} History of Hospital Care + + + + + + + + + + + + Service Code + + + + + + + Admission Date* + + + + Discharge Date* + + + {/* Location */} + + Location* + { + return option.name ?? false + }} + isOptionEqualToValue={(option, value) =>{ + return option.organization_id == value.organization_id + }} + + onChange={(e, selectedOption) => { + if (selectedOption) { + const selectedOrganizationId = selectedOption.organization_id; + handleLocationChange(selectedOrganizationId); + } + }} + // value={organization.find(row => row.organization_id == values.organization_id)} + value={valueOfLocation ?? null} + + renderInput={(params) => ( + + )} + /> + + + {/* Dokter */} + + Doctor* + { + return option.name ?? false + }} + isOptionEqualToValue={(option, value) =>{ + return option.id === value.id + }} + + value={doctor.find(row => row.id == values.practitioner_id) ?? null} + + onChange={handleDoctorChange} + renderInput={(params) => ( + + )} + /> + + + + + Medical Record Number* + + + + Symptoms* + + + + Sign* + + + + Diagnosis* + + + {/* + + {/* Main Diagnosis */} + + { + return option.name ?? false + }} + isOptionEqualToValue={(option, value) =>{ + return option.id == value.main_diagnosis_id + }} + value={main_diagnosis.find(row => row.id == values.main_diagnosis_id) ?? null} + onChange={handleMainDiagnosisChange} + renderInput={(params) => ( + + )} + /> + + + + {secondaryDiagnosisOption()} + + + + + + + + + {isEdit ? 'Update' : 'Save'} + + + + + + + + + + + + {/* Dialog for approval */} + + + + + Add History of Hospital Care + + + + + + + + + + Are you sure to approve this hospital care ? + + + + + Admission Date + { carehistory ? fDate(carehistory?.admission_date) : '-'} + + + Discharge Date + {carehistory ? fDate(carehistory.discharge_date) : '-'} + + + Location + { carehistory ? carehistory.organization_name : '-'} + + + Doctor + {carehistory ? carehistory.practitioner_name : '-'} + + + Diagnosis + {carehistory ? carehistory?.main_diagnosis_name : '-'} + + + + + + + + + + + + + + + + + + + + + + + + Diagnostic History + + + {currentClaimHistoryCare?.map((claimHistoryCare, index) => + claimHistoryCare.status === 1 ? ( + {/* Tambahkan key untuk setiap elemen dalam loop */} + + + + + + Admission Date : + { fDate(claimHistoryCare.admission_date)} {/* Perbaikan typo di 'admission_date' */} + + + Discharge Date : + { fDate(claimHistoryCare.discharge_date)} + + + Location : + {toTitleCase(claimHistoryCare.organization?.name)} + + + Doctor : + {toTitleCase(claimHistoryCare.practitioner?.code)} - {claimHistoryCare.person?.name} + + + Status : + {claimHistoryCare.status == 0 ? 'Pending' : 'Approv'} + + + Diagnosis : + #{index+1} {claimHistoryCare.icd?.code} - {claimHistoryCare.icd?.name} + + + + ) : null + )} + + + + + + + Diagnosis Summary + + + {currentClaimHistoryCare?.map((claimHistoryCare, index) => + claimHistoryCare.status === 1 ? ( + {/* Tambahkan key untuk setiap elemen dalam loop */} + + + Symtomps : + { claimHistoryCare.symptoms} {/* Perbaikan typo di 'admission_date' */} + + + Sign : + { claimHistoryCare.sign} + + + Main Diagnosis : + {claimHistoryCare.icd?.name} + + + {/* {claimHistoryCare.comparative_diagnosis?.map((comparativeDiagnosis, i) => + ( + + {i == 0 ? 'Comparative Diagnosis :' : ''} + {comparativeDiagnosis.icd?.name} + + ) + )} */} + + {claimHistoryCare.comparative_diagnosis && claimHistoryCare.comparative_diagnosis.length > 0 && ( + claimHistoryCare.comparative_diagnosis.map((comparativeDiagnosis, i) => ( + + + {i === 0 ? 'Comparative Diagnosis :' : ''} + + + {comparativeDiagnosis.icd?.name} + + + )) + )} + + + + + ) : null + )} + + + + + + + Service + {!serviceData && customerData?.status === 'received' ? ( + + ) : ( + + {customerData?.status === 'received' ? ( + + handleEditService()}> + + Edit + + + } + /> + ) : ''} + + )} + + {serviceData ? ( + <> + + Admission Date + {serviceData && serviceData.addmission_date ? fDateTime(serviceData.addmission_date) : ''} + + + Discharge Date + {serviceData && serviceData.discharge_date ? fDateTime(serviceData.discharge_date) : ''} + + + Serice Type + {serviceData && serviceData.name_services ? serviceData.name_services : ''} + + + Benefit Name + {serviceBenefitData && serviceBenefitData.name_benefits ? serviceBenefitData.name_benefits : ''} + + + Hospital + {serviceData && serviceData.name_hospitals ? serviceData.name_hospitals : ''} + + + ): ''} + + {/* Dialog Service */} + + + + + {txtName} + + + + + + + + + + + + Admission Date* + + + { + setDateAd(newValue); + }} + inputFormat="dd MMM yyyy" + renderInput={(params) => } + /> + + + + + Discharge Date* + + + { + setDateDis(newValue); + }} + inputFormat="dd MMM yyyy" + renderInput={(params) => } + /> + + + + + + Service Type* + + + Service Type + + + {valServiceTypeError} + + + + + + Benefit Name* + + + Benefit Name + + + {valBenefitNameError} + + + + + + Hospital* + + + Hospital + + + {valHospitalError} + + + + + + + + + + + + + + + + {/* title */} + + Client Benefit Configuration + + + {/* no benefit selected */} + { + false + ? + ( + + Tidak ada benefit yang dipilih + + ) + : + ( + + + + ) + } + + + + + + <> + {(customerData && customerData.status === 'received') ? ( + <> + + + + ) : ( + <> + + + + + + ) } + + + {/* Dialog Submits */} + + + + + Confirmation + + + + + + + + {dataDialog ? ( + + Are you sure to {toTitleCase(decline)} this claim ? + + + Code + {dataDialog.code} + + + Name + {dataDialog.name} + + + Date Submission + {fDateTime(dataDialog.submission_date)} + + + Claim Method + Service Type + + + Service Type + + {dataDialog.service_code === 'IP' ? 'Inpatient' : 'Outpatient'} + + + + + ) : ''} + + + + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Claims/Form.tsx b/frontend/dashboard/src/pages/Claims/Form.tsx index a4898695..2f762927 100644 --- a/frontend/dashboard/src/pages/Claims/Form.tsx +++ b/frontend/dashboard/src/pages/Claims/Form.tsx @@ -24,16 +24,18 @@ import { ListItemAvatar, Avatar, ListItemText, + Card, } from '@mui/material'; import Iconify from '../../components/Iconify'; import { LoadingButton } from '@mui/lab'; import { fCurrency } from '../../utils/formatNumber'; import MemberSelectDialog from '../../components/dialogs/MemberSelectDialog'; import { Add, DeleteOutline } from '@mui/icons-material'; +import { ClaimsEdit } from '@/@types/claims'; type Props = { isEdit: boolean; - currentClaim?: any; + currentClaim?: ClaimsEdit; }; export default function ClaimForm({ isEdit, currentClaim }: Props) { @@ -42,18 +44,27 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { const { enqueueSnackbar } = useSnackbar(); const NewCorporateSchema = Yup.object().shape({ - name: Yup.string().required('Name is required'), - code: Yup.string().required('Corporate Code is required'), - active: Yup.boolean().required('Corporate Status is required'), + benefit_desc: Yup.string().required('Benefit Desc is required'), + amount_incurred: Yup.string().required('Amount Incurred is required'), + amount_approved: Yup.number().required('Amount Approved is required'), + amount_not_approved: Yup.number().required('Amount Not Approved is required'), + excess_paid: Yup.number().required('Excess Paid is required'), // file: Yup.boolean().required('Corporate Status is required'), }); const defaultValues = useMemo( () => ({ - member: currentClaim?.member || {}, + plan_id: currentClaim?.plan_id || null, + payor_id: currentClaim?.payor_id || null, + corporate_id: currentClaim?.corporate_id || null, + policy_number: currentClaim?.policy_number || null, member_id: currentClaim?.member_id || null, - diagnosis_id: currentClaim?.diagnosis_id || null, - total_claim: currentClaim?.total_claim || 0, + benefit_code: currentClaim?.benefit_code || '-', + benefit_desc: currentClaim?.benefit_desc || '-', + amount_incurred: currentClaim?.amount_incurred || 0, + amount_approved: currentClaim?.amount_approved || 0, + amount_not_approved: currentClaim?.amount_not_approved || 0, + excess_paid: currentClaim?.excess_paid || 0, }), // eslint-disable-next-line react-hooks/exhaustive-deps [currentClaim] @@ -88,11 +99,11 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { console.log('defaultValues', defaultValues); if (isEdit && currentClaim) { reset(defaultValues); - setMember(defaultValues.member) + // setMember(defaultValues.member) } if (!isEdit) { reset(defaultValues); - setMember(defaultValues.member) + // setMember(defaultValues.member) } }, [isEdit, currentClaim]); @@ -105,13 +116,13 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { console.log('currentFiles', getValues('uploaded_files')); }; - const memberSelected = (member) => { - setMember(member) - }; + // const memberSelected = (member) => { + // setMember(member) + // }; - const checkLimit = async () => { - console.log('CHECKING LIMIT'); - }; + // const checkLimit = async () => { + // console.log('CHECKING LIMIT'); + // }; const onSubmit = async (data: any) => { try { @@ -122,7 +133,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { } reset(); enqueueSnackbar( - !isEdit ? 'Organizations Created Successfully!' : 'Organizations Udpated Successfully!', + !isEdit ? 'Organizations Created Successfully!' : 'Claim Udpated Successfully!', { variant: 'success' } ); navigate('/claims'); @@ -154,443 +165,86 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { const headStyle = {}; return ( - - Member - - - - { - if (!isEdit) setIsMemberDialogOpen(true); - if (isEdit) enqueueSnackbar('Cannot Change Member', { variant: 'error' }); - }} - /> - - {/* - - */} - - - {member?.id && ( - - - -
- - - - Name - - {member?.full_name} - - - - DOB - - - {member?.birth_date} ({member?.age + ' years'}) - - - - - Marital Status - - {member?.marital_status} - - - - Record Type - - {member?.record_type} - - - - Principal ID - - - {member?.principal_id} ( - {member?.relation_with_principal}) - - - -
- - - - - - - Plan - - {member?.current_plan?.code} - - - - Active - - - {member?.current_plan?.start} -{' '} - {member?.current_plan?.end} (Active) - - - - - Corporate Limit - - - {fCurrency(0)} / {fCurrency(member?.current_plan?.limit_rules)} - - - - - Plan Usage - - - {fCurrency(0)} / {fCurrency(member?.current_plan?.limit_rules)} - - - -
-
+ + + {/* Baris ke 1 */} + + Plan ID* + + + + Payor ID* + + + + Corporate ID* + + + + Policy Number* + -
- )} - ( - - option ? `#${option.id} (${option.code}) ${option.description}` : '' - } - value={value || ''} - onChange={(event: any, newValue: any) => { - setValue('benefit_id', newValue?.id); - onChange(newValue); - }} - renderInput={(params) => ( - { - // if (event.key === 'Enter') - // searchDiagnosis(event.target.value) - // }} - /> - )} - /> - )} - /> + {/* Baris ke 2 */} + + Memeber ID* + + + + Benefit Code* + + + + Benefit Desc* + + - ( - (option ? `(${option.code}) ${option.name}` : '')} - value={value || ''} - onChange={(event: any, newValue: any) => { - setValue('diagnosis_id', newValue?.id); - // setValue('diagnosis', newValue) - onChange(newValue); - }} - renderInput={(params) => ( - { - if (event.key === 'Enter') searchDiagnosis(event.target.value); - }} - /> - )} - /> - )} - /> - - {isCheckingLimit && ( - - {/* Checking */} - - - - Please Wait, Checking Eligibilty - - - - )} - {false && isCheckingLimit == false && isEligible == null && ( - - {/* No Data Selected */} - - - - Please Select Diagnosis ! - - - - )} - {!isCheckingLimit && isEligible !== null && isEligible && ( - - {/* Eligible */} - - - - Diagnosis is Eligible - - - - 125.000.000 / 125.000.000 - - - )} - {!isCheckingLimit && isEligible !== null && !isEligible && ( - - {/* Not Eligible */} - {/* - - - Not Eligible - - - - 125.000.000 / 125.000.000 - */} - - )} - - - - {isEdit && ( - - Documents - - - {(getValues('uploaded_files.invoice') && getValues('uploaded_files.invoice').length - ? getValues('uploaded_files.invoice') - : [] - ).map((file, index) => ( - - - - } - > - - - {/* */} - I - - - - - ))} - - - - {(getValues('uploaded_files.prescription') && getValues('uploaded_files.prescription').length - ? getValues('uploaded_files.prescription') - : [] - ).map((file, index) => ( - - - - } - > - - - {/* */} - P - - - - - ))} - - - - - {(getValues('uploaded_files.diagnosis') && getValues('uploaded_files.diagnosis').length - ? getValues('uploaded_files.diagnosis') - : [] - ).map((file, index) => ( - - - - } - > - - - {/* */} - DR - - - - - ))} - - - - )} - - {isEligible === true ? ( - - Create Claim - - ) : ( - - Check Limit - - )} -
- - - + type="submit" + variant="contained" + size="large" + color='inherit' + onClick={() => navigate(`/claims`)} + > + Cancel + + + Save + +
+ + + ); } diff --git a/frontend/dashboard/src/pages/Claims/List.tsx b/frontend/dashboard/src/pages/Claims/List.tsx index cac972bd..5e1d01fd 100644 --- a/frontend/dashboard/src/pages/Claims/List.tsx +++ b/frontend/dashboard/src/pages/Claims/List.tsx @@ -16,13 +16,10 @@ import { Menu, ButtonGroup, Tooltip, + TableHead, } from '@mui/material'; -import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; -import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -import AddIcon from '@mui/icons-material/Add'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; import AssessmentIcon from '@mui/icons-material/Assessment'; -import UploadIcon from '@mui/icons-material/Upload'; -import CancelIcon from '@mui/icons-material/Cancel'; // hooks import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; import { Link, Navigate, useNavigate, useSearchParams } from 'react-router-dom'; @@ -35,6 +32,13 @@ import EditRoundedIcon from '@mui/icons-material/EditRounded'; import { Chip } from '@mui/material'; import Iconify from '@/components/Iconify'; import { enqueueSnackbar } from 'notistack'; +import { fDate } from '../../utils/formatTime'; +import { Claims } from '@/@types/claims'; +import Label from '@/components/Label'; +import { capitalizeFirstLetter } from '@/utils/formatString'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import Edit from '@mui/icons-material/Edit'; +import { Download } from '@mui/icons-material'; export default function List() { const [searchParams, setSearchParams] = useSearchParams(); @@ -83,10 +87,16 @@ export default function List() { fullWidth onChange={handleSearchChange} value={searchText} + placeholder='Search Code or Member ID...' /> - -
); @@ -152,7 +162,7 @@ export default function List() { }; // Called on every row to map the data to the columns - function createData(data: any): any { + function createData(data: Claims): Claims { return { ...data, }; @@ -168,41 +178,44 @@ export default function List() { return ( *': { borderBottom: 'unset' } }}> - + {/* setOpen(!open)}> {open ? : } - - {row.code} - {row.member?.full_name} - {row.plan?.code} - {row.claim_request?.service?.name} - - ({row.diagnoses[0]?.icd?.code}) {row.diagnoses[0]?.icd?.name} - - {fCurrency(row.total_claim)} + */} + {row.claim_request?.code} + {/* {row.code} */} + {row.member?.current_plan?.code} + {row.member?.current_corporate?.payor_id} + {row.member?.current_corporate?.code} + {row.member?.current_corporate?.current_policy?.code} + {row.member?.member_id} + {row.benefit_desc} + - {row.status == 'draft' && ()} - {row.status == 'requested' && ()} - {row.status == 'received' && ()} - {row.status == 'approved' && ()} - {row.status == 'postpone' && ()} - {row.status == 'paid' && ()} - {row.status == 'declined' && ()} + {row.status == 'draft' && ()} + {row.status == 'requested' && ()} + {row.status == 'received' && ()} + {row.status == 'approved' && ()} + {row.status == 'postpone' && ()} + {row.status == 'paid' && ()} + {row.status == 'declined' && ()} - - {['approved', 'paid'].includes(row.status) && ( - { - navigate('/claims/' + row.id); - }}> - )} - {!['approved', 'paid'].includes(row.status) && ( - { - navigate('/claims/' + row.id); - }}> - )} - + + navigate(`/claims/edit/${row.id}`) }> + + Edit + + navigate('/claims/detail/'+row.id+'') }> + + Detail + + + } /> + + {/* COLLAPSIBLE ROW */} @@ -227,35 +240,38 @@ export default function List() { return ( {/* ------------------ TABLE HEADER ------------------ */} - + - + {/* */} Code - Member Name + Plan ID - Plan + Payor ID - Benefit + Corporate ID - Diagnosis + Policy Number - Total Claim + Member ID + + + Benefit Desc Status - - Action + + - + {/* ------------------ END TABLE HEADER ------------------ */} {/* ------------------ TABLE ROW ------------------ */} diff --git a/frontend/dashboard/src/pages/Claims/Model/Functions.tsx b/frontend/dashboard/src/pages/Claims/Model/Functions.tsx new file mode 100644 index 00000000..7577c2a8 --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/Model/Functions.tsx @@ -0,0 +1,58 @@ +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { BenefitConfigurationListType } from "./Types"; + +/** + * Get Benefit Configuration List + */ +export const getBenefitConfigurationList = async ( claim_id: string ): Promise => { + const response = await axios.get(`/claims/${claim_id}/benefit-configuration`) + .then((res) =>{ + return res.data.data.benefit_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Edit Benefit Configuration + */ +export const editBenefitConfiguration = async ( data: BenefitConfigurationListType ): Promise => { + const response = await axios.put(`/claims/benefit-configuration/edit/${data.claim_service_benefits_id}`, { + ...data + }) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + for (const key in arr_message) { + enqueueSnackbar(arr_message[key][0], { + variant: 'warning', + }); + } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +}; diff --git a/frontend/dashboard/src/pages/Claims/Model/Types.tsx b/frontend/dashboard/src/pages/Claims/Model/Types.tsx new file mode 100644 index 00000000..08351c5b --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/Model/Types.tsx @@ -0,0 +1,11 @@ +/** + * Benefit Configuration List Type + */ +export type BenefitConfigurationListType = { + claim_service_benefits_id: number, + benefit_name: string, + amount_incurred: number, + amount_approved: number, + amount_not_approved: number, + excess_paid: number +} diff --git a/frontend/dashboard/src/pages/Claims/Show.tsx b/frontend/dashboard/src/pages/Claims/Show.tsx index 5a7818d2..f8c60efc 100644 --- a/frontend/dashboard/src/pages/Claims/Show.tsx +++ b/frontend/dashboard/src/pages/Claims/Show.tsx @@ -38,6 +38,7 @@ import ClaimDetail from './components/ClaimDetail'; import DialogHistoryPerawatan from './components/DialogHistoryPerawatan'; import { IconButton } from '@mui/material'; import { Tooltip } from '@mui/material'; +import { useSelector } from 'react-redux'; export default function ClaimsCreateUpdate() { const { themeStretch } = useSettings(); @@ -48,6 +49,10 @@ export default function ClaimsCreateUpdate() { const [currentClaim, setCurrentClaim] = useState(); const [documents, setDocuments] = useState([]); + const claimsHistoryData = useSelector((state) => state.claimsHistory) + + console.log(claimsHistoryData) + const Item = styled(Paper)(({ theme }) => ({ backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', ...theme.typography.body2, @@ -66,6 +71,12 @@ export default function ClaimsCreateUpdate() { setClaimItems([...claimItems, ...items]); }; + useEffect(() => { + if(claimsHistoryData) { + setClaimItems(claimsHistoryData) + } + },[claimsHistoryData]) + const handleSaveClaimItems = () => { console.log('Storing ', claimItems); setLoadingClaimItems(true); @@ -305,6 +316,9 @@ export default function ClaimsCreateUpdate() { )} + + Admission Date : {currentClaim?.claim_request?.submission_date} + @@ -347,7 +361,7 @@ export default function ClaimsCreateUpdate() { Nomor Polis - {currentClaim?.member?.full_name} + {currentClaim?.member?.current_policy?.code} diff --git a/frontend/dashboard/src/pages/Claims/components/BenefitConfigurationDialog.tsx b/frontend/dashboard/src/pages/Claims/components/BenefitConfigurationDialog.tsx new file mode 100644 index 00000000..10242067 --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/components/BenefitConfigurationDialog.tsx @@ -0,0 +1,218 @@ +import * as Yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useEffect, useState } from 'react'; +import { Box, Grid } from '@mui/material'; +import { LoadingButton } from '@mui/lab'; +import Button from '@mui/material/Button'; +import { styled } from '@mui/material/styles'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import IconButton from '@mui/material/IconButton'; +import CloseIcon from '@mui/icons-material/Close'; +import Typography from '@mui/material/Typography'; +import { useForm } from 'react-hook-form'; +import { FormProvider } from '@/components/hook-form'; +import RHFTextFieldMoney from '@/components/hook-form/v2/RHFTextFieldMoney'; + +/** + * Custom Style + * ===================================================== + */ +const BootstrapDialog = styled(Dialog)(({ theme }) => ({ + +})); + +/** + * Utils, Types, Functions + * ============================================ + */ +import palette from '@/theme/palette'; +import { BenefitConfigurationListType } from '../Model/Types'; +import { editBenefitConfiguration } from '../Model/Functions'; + +/** + * Props + * ===================================================== + */ +type Props = { + data?: BenefitConfigurationListType, + isOpen: boolean, + handleCancleProp: () => void, + handleSuccessProp: () => void, +}; + +export default function BenefitConfigurationDialog({ ...props }: Props) { + + // setup form + // ==================================== + const defaultValues: BenefitConfigurationListType = { + claim_service_benefits_id: 0, + benefit_name: '', + amount_incurred: 0, + amount_approved: 0, + amount_not_approved: 0, + excess_paid: 0, + }; + + const validationSchema = Yup.object().shape({ + amount_incurred : Yup.string().typeError('').required(''), + amount_approved : Yup.string().typeError('').required(''), + amount_not_approved : Yup.string().typeError('').required(''), + excess_paid : Yup.string().typeError('').required(''), + }); + + const methods = useForm({ + resolver: yupResolver(validationSchema), + defaultValues + }); + + const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods; + + console.log(errors); + console.log(watch()); + + // Submit Form + // ===================================== + const submitHandler = async (data: BenefitConfigurationListType) => { + let response = await editBenefitConfiguration(data); + + if (response == true) { + props.handleSuccessProp() + props.handleCancleProp() + } + } + + // Set Value Form + // ===================================== + useEffect(() => { + setValue('claim_service_benefits_id', props.data?.claim_service_benefits_id) + setValue('amount_incurred', props.data?.amount_incurred) + setValue('amount_approved', props.data?.amount_approved) + setValue('amount_not_approved', props.data?.amount_not_approved) + setValue('excess_paid', props.data?.excess_paid) + }, [props.data]) + + return ( + + + + + Client Benefit Configuration + + + theme.palette.grey[0]}} + > + + + + + + + + + {/* Benefit Name */} + + + {props.data?.benefit_name} + + + + + + + + + + Amount Incurred* + + + + + + + + + + + + + Amount Approved* + + + + + + + + + + + + + Amount Not Approved* + + + + + + + + + + + + + Excess Paid* + + + + + + + + + + + + + + + + + + Save Changes + + + + + ); +} + diff --git a/frontend/dashboard/src/pages/Claims/components/BenefitConfigurationList.tsx b/frontend/dashboard/src/pages/Claims/components/BenefitConfigurationList.tsx new file mode 100644 index 00000000..bb824758 --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/components/BenefitConfigurationList.tsx @@ -0,0 +1,168 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router'; +import { Box, Typography, Grid, MenuItem } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import MoreMenu from '@/components/MoreMenu'; + +/** + * Icon + * ============================================ + */ +import { EditOutlined } from '@mui/icons-material'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { BenefitConfigurationListType } from '../Model/Types'; +import { getBenefitConfigurationList } from '../Model/Functions'; +import palette from '@/theme/palette'; +import BenefitConfigurationDialog from './BenefitConfigurationDialog'; +import { fNumber } from '@/utils/formatNumber'; + +export default function BenefitConfigurationList() { + const { id: claim_id } = useParams(); + + // State + // -------------------- + const [BenefitConfigurationList, setBenefitConfigurationList] = useState(); + const [BenefitConfigurationData, setBenefitConfigurationData] = useState(); + const [isDialogOpen, setIsDialogOpen] = useState(false); + + // Use Effect + // -------------------- + useEffect(() => { + loadDataTableData(); + }, []) + + // Load Data + // ------------------- + const loadDataTableData = async () => { + const response = await getBenefitConfigurationList(claim_id??''); + + setBenefitConfigurationList(response); + } + + return ( + + {/* row list */} + { + BenefitConfigurationList?.map((row, index) => { + return ( + + + + + + + {row.benefit_name} + + + + + { + setIsDialogOpen(true) + setBenefitConfigurationData(row) + }} + > + + Edit + + + } /> + + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {fNumber(row.amount_incurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(row.amount_approved)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(row.amount_not_approved)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid* + + + + + {fNumber(row.excess_paid)} + + + + + + + + + + + ) + }) + } + + {/* Dialog */} + setIsDialogOpen(false)} handleSuccessProp={() => loadDataTableData()} /> + + ); +} diff --git a/frontend/dashboard/src/pages/Claims/components/DialogHistoryPerawatan.tsx b/frontend/dashboard/src/pages/Claims/components/DialogHistoryPerawatan.tsx index ed183def..7bd83e91 100644 --- a/frontend/dashboard/src/pages/Claims/components/DialogHistoryPerawatan.tsx +++ b/frontend/dashboard/src/pages/Claims/components/DialogHistoryPerawatan.tsx @@ -6,6 +6,8 @@ import { Stack } from '@mui/material'; import { enqueueSnackbar } from 'notistack'; import React, { useState } from 'react'; import FormHistoryPerawatan from './FormHistoryPerawatan'; +import { useDispatch } from 'react-redux'; +import { claimsHistoryAction } from '@/store/claimsHistorySlice'; type DialogHistoryPerawatanType = { openDialog: boolean; @@ -18,6 +20,7 @@ type DialogHistoryPerawatanType = { export default function DialogHistoryPerawatan({ openDialog, setOpenDialog, onSubmit, claim, encounter } : DialogHistoryPerawatanType) { const isEdit = encounter?.id != null + const dispatch = useDispatch() // const benefits = member?.current_plan?.benefits ?? []; // const [selectedBenefits, setSelectedBenefits] = useState([]); @@ -38,6 +41,10 @@ export default function DialogHistoryPerawatan({ openDialog, setOpenDialog, onSu .then((res) => { enqueueSnackbar(res.data.message, {variant: 'success'}) setOpenDialog(false); + window.location.reload(); // tolong benerin ya + // axios.get(`claims/${claim.id}`).then((res) => { + // dispatch(claimsHistoryAction.setClaims(res.data.data.encounter)) + // }) }) .catch((err) => { enqueueSnackbar(err.message, {variant: 'error'}) @@ -47,6 +54,10 @@ export default function DialogHistoryPerawatan({ openDialog, setOpenDialog, onSu .then((res) => { enqueueSnackbar(res.data.message, {variant: 'success'}) setOpenDialog(false); + window.location.reload(); // tolong benerin ya + // axios.get(`claims/${claim.id}`).then((res) => { + // dispatch(claimsHistoryAction.setClaims(res.data.data.encounter)) + // }) }) .catch((err) => { enqueueSnackbar(err.message, {variant: 'error'}) diff --git a/frontend/dashboard/src/pages/Claims/components/Documents.tsx b/frontend/dashboard/src/pages/Claims/components/Documents.tsx index 34523f21..4a89781d 100644 --- a/frontend/dashboard/src/pages/Claims/components/Documents.tsx +++ b/frontend/dashboard/src/pages/Claims/components/Documents.tsx @@ -97,9 +97,6 @@ export default function Documents({ files }) { Dokumen Diagnosa - - Dokumen Diagnosa - diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/Create.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/Create.tsx index 5e9fccdf..628f6588 100644 --- a/frontend/dashboard/src/pages/Corporates/Benefit/Create.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/Create.tsx @@ -2,21 +2,43 @@ import * as Yup from 'yup'; import { yupResolver } from "@hookform/resolvers/yup"; import { Card, Collapse, Divider, Grid, Stack, Typography } from "@mui/material"; import { useForm } from "react-hook-form"; -import { useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router-dom"; import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; import { FormProvider, RHFCheckbox, RHFSelect, RHFTextField } from "../../../components/hook-form"; import Page from "../../../components/Page"; import useSettings from "../../../hooks/useSettings"; import CorporateTabNavigations from "../CorporateTabNavigations"; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; import DivisionsList from "./List"; -import { useMemo, useState } from 'react'; +import FormEdit from "./Form"; +import { useEffect, useMemo, useState } from 'react'; +import { Benefit } from '@/@types/corporates'; +import axios from '@/utils/axios'; export default function Divisions() { const { themeStretch } = useSettings(); - const { corporate_id } = useParams(); + const { corporate_id, benefit_id } = useParams(); + const [ currentCorporateBenefit, setCurrentCorporateBenefit ] = useState(); + const navigate = useNavigate(); + const isEdit = !!benefit_id; + useEffect(() => { + console.log(benefit_id); + if (isEdit) { + axios.get('/corporates/'+corporate_id+'/corporate-benefits/'+benefit_id+'/edit') + .then((res) => { + setCurrentCorporateBenefit(res.data); + }) + .catch((err) => { + if (err.response.status === 404) { + navigate('/404'); + } + }) + } + }, [corporate_id, benefit_id]); + const NewDivisionSchema = Yup.object().shape({ name: Yup.string().required('Name is required'), @@ -51,97 +73,12 @@ export default function Divisions() { console.log(data); }; - const [open, setOpen] = useState(false); - const benefits = [ - { - 'category' : 'General Practitioner', - 'childs' : [ - { - 'name' : 'External Doctor Online', - 'code' : 'gp-external-doctor-online' - }, - { - 'name' : 'External Doctor Offline', - 'code' : 'gp-external-doctor-offline' - }, - { - 'name' : 'Internal Doctor Online', - 'code' : 'gp-internal-doctor-online' - }, - { - 'name' : 'Internal Doctor Offline', - 'code' : 'gp-internal-doctor-offline' - }, - ] - }, - { - 'category' : 'Specialist', - 'childs' : [ - { - 'name' : 'External Doctor Online', - 'code' : 'sp-external-doctor-online' - }, - { - 'name' : 'External Doctor Offline', - 'code' : 'sp-external-doctor-offline' - }, - { - 'name' : 'Internal Doctor Online', - 'code' : 'sp-internal-doctor-online' - }, - { - 'name' : 'Internal Doctor Offline', - 'code' : 'sp-internal-doctor-offline' - }, - ] - }, - { - 'category' : 'Medicines', - 'childs' : [ - { - 'name' : 'Vitamins', - 'code' : 'medicines-vitamins' - }, - { - 'name' : 'Delivery Fee', - 'code' : 'medicines-delivery-fee' - }, - ] - }, - ]; - - const products = [ - { - 'name' : 'Inpatient', - 'code' : 'IP', - }, - { - 'name' : 'Outpatient', - 'code' : 'OP', - }, - { - 'name' : 'Dental', - 'code' : 'DT', - }, - { - 'name' : 'Dental', - 'code' : 'DTL', - }, - { - 'name' : 'Matternity', - 'code' : 'MT', - }, - { - 'name' : 'Special Benefit', - 'code' : 'SB', - }, - ]; return ( - + /> */} - +{/* @@ -235,7 +172,17 @@ export default function Divisions() { - + */} + + navigate(`/corporates/${corporate_id}/benefit`)} + sx={{ cursor: 'pointer' }} + /> + + Edit Plan + + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx index 85050511..89317b32 100644 --- a/frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/Form.tsx @@ -1,7 +1,7 @@ import * as Yup from 'yup'; import { LoadingButton } from '@mui/lab'; -import { Box, Card, Grid, Stack, Typography } from '@mui/material'; -import { CorporatePlan } from '../../../@types/corporates'; +import { Box, Button, Card, Grid, Stack, Typography } from '@mui/material'; +import { Benefit } from '../../../@types/corporates'; import { FormProvider, RHFSwitch, RHFTextField } from '../../../components/hook-form'; import { useEffect, useMemo } from 'react'; import { useForm } from 'react-hook-form'; @@ -12,39 +12,36 @@ import axios from '../../../utils/axios'; type Props = { isEdit: boolean; - currentCorporatePlan?: CorporatePlan; + currentCorporateBenefit?: Benefit; }; -export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Props) { +export default function CorporateBenefitForm({ isEdit, currentCorporateBenefit }: Props) { const { enqueueSnackbar } = useSnackbar(); const navigate = useNavigate(); - const { corporate_id } = useParams(); + const { corporate_id, benefit_id } = useParams(); - const NewCorporatePlanSchema = Yup.object().shape({ - name: Yup.string().required('Name is required'), - code: Yup.string().required('Corporate Code is required'), + const NewCorporateBenefitSchema = Yup.object().shape({ + budget: Yup.string().required('Budget is required'), }); const defaultValues = useMemo( () => ({ - name: currentCorporatePlan?.name || '', - code: currentCorporatePlan?.code || '', - active: currentCorporatePlan?.active === 1 ? true : false, + budget: currentCorporateBenefit?.budget || '', }), - [currentCorporatePlan] + [currentCorporateBenefit] ); useEffect(() => { - if (isEdit && currentCorporatePlan) { + if (isEdit && currentCorporateBenefit) { reset(defaultValues); } if (!isEdit) { reset(defaultValues); } - }, [isEdit, currentCorporatePlan]); + }, [isEdit, currentCorporateBenefit]); const methods = useForm({ - resolver: yupResolver(NewCorporatePlanSchema), + resolver: yupResolver(NewCorporateBenefitSchema), defaultValues, }); @@ -81,12 +78,12 @@ export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Prop }); } else { await axios - .put('/corporate/' + corporate_id + '/divisions/' + currentCorporatePlan?.id, data) + .put('/corporates/' + corporate_id + '/corporate-benefits/' + benefit_id, data) .then((res) => { enqueueSnackbar('Division updated successfully', { variant: 'success' }); }) .then((res) => { - navigate('/corporate/' + corporate_id + '/divisions/', { replace: true }); + navigate('/corporates/' + corporate_id + '/benefits', { replace: true }); }) .catch(({ response }) => { enqueueSnackbar('Update Failed : ' + response.data.message, { variant: 'error' }); @@ -95,30 +92,44 @@ export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Prop }; return ( + - + ASO/Budget - - - - - - - - - ASO/Budget - - + + + + + Save + + ); diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/Index.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/Index.tsx index 21e25e16..5070058e 100644 --- a/frontend/dashboard/src/pages/Corporates/Benefit/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/Index.tsx @@ -35,19 +35,19 @@ export default function Divisions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Benefit', - href: '/corporate/' + corporate_id + '/benefits', + href: '/corporates/' + corporate_id + '/benefits', }, ]} /> - + {/* */} - + {/* */} ); } diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx index 46f9c5be..39b286b5 100644 --- a/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/List.tsx @@ -1,4 +1,5 @@ // @mui +import * as Yup from 'yup'; import { Box, Button, @@ -35,11 +36,19 @@ import AddIcon from '@mui/icons-material/Add'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; import HistoryIcon from '@mui/icons-material/History'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import { DialogTitle, DialogContent, DialogActions } from '@mui/material'; + + +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; +import CloseIcon from '@mui/icons-material/Close'; // hooks import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; -import {Link, useParams, useSearchParams } from 'react-router-dom'; +import {Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; // components import { @@ -64,12 +73,22 @@ import BasePagination from '../../../components/BasePagination'; import { enqueueSnackbar } from 'notistack'; import { LoadingButton } from '@mui/lab'; import DialogLog from './sections/DialogLog'; +import Label from '@/components/Label'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import { Edit } from '@mui/icons-material'; +import { fData, fNumber } from '@/utils/formatNumber'; +import DialogUpdateStatus from '@/components/DialogUpdateStatus'; + +import { ro } from 'date-fns/locale'; +import { Dialog } from '@mui/material'; export default function PlanList() { const { themeStretch } = useSettings(); const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); + + const navigate = useNavigate() const [openDialog, setOpenDialog] = useState(false); const [isDialog, setIsDialog] = useState(''); @@ -249,6 +268,7 @@ export default function PlanList() { Import {handleGetTemplate('plan-benefit')}}>Download Template {handleGetData('data-plan-benefit')}}>Download Data Plan & Benefit + {setDialogDeleteOpen(true)}}>Delete All Import )} @@ -302,84 +322,156 @@ export default function PlanList() { }; } + type DataContent = { + service: string; + id: number; + status: number; + plan: string, + benefit_code: string, + customer_benefit_code: string, + }; + + type FormValuesProps = { + value: string; + active: boolean; + }; + // Generate the every row of the table + const [isDialogOpen, setDialogOpen] = useState(false) + let titles = { + name: 'Update Status', + icon: '-' + } + const [dataValue, setDataValue] = useState(''); + const [dataDescription, setDescriptionValue] = useState(''); + const [url, setUrl] = useState(''); + function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); const [openEdit, setOpenEdit] = React.useState(false); - const handleActivate = (model: any, status: string) => { - axios - .put(`/benefits/${row.id}/activation`, { - // service_code: service.service_code, - active: status == 'active', - }) - .then((res) => { - setDataTableData({ - ...dataTableData, - data: dataTableData.data.map((model) => { - let updatedModel = model; - if (row.id == model.id) { - updatedModel.active = res.data.benefit.active; - } - return updatedModel; - }), - }); - }) - .catch((error) => { - // console.log('asdasd', error.response.data.message) - enqueueSnackbar( - error.response.data.message ?? error.message ?? 'Failed Processing Request', - { variant: 'error' } - ); - }); + const handleActivate = (isOpen: boolean, dataValue: DataContent) => { + console.log(dataValue) + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this service ?') + setUrl(url) }; + // const handleActivate = (model: any, status: string) => { + // axios + // .put(`/benefits/${row.id}/activation`, { + // // service_code: service.service_code, + // active: status == 'active', + // }) + // .then((res) => { + // setDataTableData({ + // ...dataTableData, + // data: dataTableData.data.map((model) => { + // let updatedModel = model; + // if (row.id == model.id) { + // updatedModel.active = res.data.benefit.active; + // } + // return updatedModel; + // }), + // }); + // }) + // .catch((error) => { + // // console.log('asdasd', error.response.data.message) + // enqueueSnackbar( + // error.response.data.message ?? error.message ?? 'Failed Processing Request', + // { variant: 'error' } + // ); + // }); + // }; + + let frequency_period_name: string + let limit_frequency: string + switch (row.max_frequency_period) { + case '1' : + frequency_period_name = 'Daily Visit'; + limit_frequency = row.daily_frequency ? row.daily_frequency : '1'; + break; + case '2': + frequency_period_name = 'Weekly'; + limit_frequency = row.weekly_frequency ? row.weekly_frequency : '7'; + break; + case '3': + frequency_period_name = 'Monthly'; + limit_frequency = row.monthly_frequency ? row.monthly_frequency : '30'; + break; + case '4': + frequency_period_name = 'Yearly'; + limit_frequency = row.yearly_frequency ? row.yearly_frequency : '365'; + break; + case '5': + frequency_period_name = 'Disability'; + limit_frequency = row.max_days_for_disability ? row.max_days_for_disability : '-'; + break; + case '6': + frequency_period_name = 'Visit'; + limit_frequency = row.daily_frequency ? row.daily_frequency : '-'; + break; + default: + frequency_period_name = 'Policy Period'; + limit_frequency = row.daily_frequency ? row.daily_frequency : '-'; + } + return ( *': { borderBottom: 'unset' } }}> - + {/* setOpen(!open)}> {open ? : } - + */} {row.plan?.service_code} {row.plan?.code} {row.benefit?.code} {row.corporate_benefit_code} {row.benefit?.description} + { fNumber(row.limit_amount)} + { frequency_period_name} + { limit_frequency} {row.active == 1 && ( - + // )} {row.active != 1 && ( - + )} - + {/* + */} + + + setOpen(!open) }> + + Detail + + navigate(`/corporates/${corporate_id}/benefits/${row.id}/edit`) }> + + Edit + + navigate(`/corporates/${corporate_id}/benefits/${row.id}/history`)}> + + History + + + handleActivate(true, { + service: row.benefit?.service_code, + plan: row.plan?.code, + benefit_code: row.benefit?.code, + customer_benefit_code: row.corporate_benefit_code, + id:row.id, + status: row.active + }) + } + > + + Update Status + + + } /> - + {/* - + */} {/* COLLAPSIBLE ROW */} - {open == true ? ( - openEdit == false ? ( - - - - - - ASO/Budget + + {open == true ? ( + openEdit == false ? ( + + + + + + ASO/Budget + + + : {row.budget ? row.budget : '-'} + + + Budget Condition + + + : {row.budget_conditions ? row.budget_conditions : '-'} + + + Budget Code + + + : {row.budget_code ? row.budget_code : '-'} + + + Primary benefit + + + : {row.primary_benefit_code ? row.primary_benefit_code : '-'} + + + Benefit Mode + + + : {row.benefit_mode ? row.benefit_mode : '-'} + + + Room Class + + + : {row.room_class_coverage ? row.room_class_coverage : '-'} + + + Max Bed + + + : {row.max_bed_coverage ? row.max_bed_coverage : '-'} + + + Tolerance Paramater + + + : {row.tolerance_parameter ? row.tolerance_parameter : '-'} + + + Max. Room Class + + + : {row.max_room_class ? row.max_room_class : '-'} + + + Limit Value + + + : {row.limit_amount ? fNumber(row.limit_amount) : '-'} + + + Area + + + : {row.area_limit ? row.area_limit : '-'} + + + Shared Benefit With + + + : {row.shared_benefit ? row.shared_benefit : '-'} + + + Shared Benefit Type + + + : {row.shared_benefit_type ? row.shared_benefit_type : '-'} + + + MSC + + + : {row.msc ? row.msc : '-'} + + + Gender + + + : {row.genders ? row.genders : '-'} + + + Min Age + + + : {row.min_age ? row.min_age : '-'} + + + Max Age + + + : {row.max_age ? row.max_age : '-'} + + + Freq. Period + + + : {row.max_frequency_period ? frequency_period_name : '-'} + + + Daily Frequency + + + : {row.daily_frequency ? row.daily_frequency : '-'} + + + Weekly Frequency + + + : {row.weekly_frequency ? row.weekly_frequency : '-'} + + + Monthly Frequency + + + : {row.monthly_frequency ? row.monthly_frequency : '-'} + + + Yearly Frequency + + + : {row.yearly_frequency ? row.yearly_frequency : '-'} + + + Custom Duration + + + : {row.custom_frequency_days ? row.custom_frequency_days : '-'} + + + Custom Duration Value + + + : {row.custom_duration_value ? row.custom_duration_value : '-'} + + + Cashless, Reimbursement + + + : {row.allowed_transaction_types ? row.allowed_transaction_types : '-'} + + + High Plan Factor + + + : {row.high_plan_factor ? row.high_plan_factor : '-'} + - - : {row.budget ? row.budget : '-'} - - - Budget Condition - - - : {row.budget_conditions ? row.budget_conditions : '-'} - - - Budget Code - - - : {row.budget_code ? row.budget_code : '-'} - - - Primary benefit - - - : {row.primary_benefit_code ? row.primary_benefit_code : '-'} - - - Benefit Mode - - - : {row.benefit_mode ? row.benefit_mode : '-'} - - - Room Class - - - : {row.room_class_coverage ? row.room_class_coverage : '-'} - - - Max Bed - - - : {row.max_bed_coverage ? row.max_bed_coverage : '-'} - - - Tolerance Paramater - - - : {row.tolerance_parameter ? row.tolerance_parameter : '-'} - - - Max. Room Class - - - : {row.max_room_class ? row.max_room_class : '-'} - - - Limit Value - - - : {row.limit_amount ? row.limit_amount : '-'} - - - Area - - - : {row.area_limit ? row.area_limit : '-'} - - - Shared Benefit With - - - : {row.shared_benefit ? row.shared_benefit : '-'} - - - Shared Benefit Type - - - : {row.shared_benefit_type ? row.shared_benefit_type : '-'} - - - MSC - - - : {row.msc ? row.msc : '-'} - - - Gender - - - : {row.genders ? row.genders : '-'} - - - Min Age - - - : {row.min_age ? row.min_age : '-'} - - - Max Age - - - : {row.max_age ? row.max_age : '-'} - - - Freq. Period - - - : {row.max_frequency_period ? row.max_frequency_period : '-'} - - - Daily Frequency - - - : {row.daily_frequency ? row.daily_frequency : '-'} - - - Weekly Frequency - - - : {row.weekly_frequency ? row.weekly_frequency : '-'} - - - Monthly Frequency - - - : {row.monthly_frequency ? row.monthly_frequency : '-'} - - - Yearly Frequency - - - : {row.yearly_frequency ? row.yearly_frequency : '-'} - - - Custom Duration - - - : {row.custom_frequency_days ? row.custom_frequency_days : '-'} - - - Custom Duration Value - - - : {row.custom_duration_value ? row.custom_duration_value : '-'} - - - Cashless, Reimbursement - - - : {row.allowed_transaction_types ? row.allowed_transaction_types : '-'} - - - High Plan Factor - - - : {row.high_plan_factor ? row.high_plan_factor : '-'} + + + + + Pre Post Treatment + + + : {row.pre_post_treatment ? row.pre_post_treatment : '-'} + + + Pre Treatment + + + : {row.pre_treatment_days ? row.pre_treatment_days : '-'} + + + Post Treatment + + + : {row.post_treatment_days ? row.post_treatment_days : '-'} + + + Layer Type 1 + + + : {row.layer_type_1 ? row.layer_type_1 : '-'} + + + Layer Value 1 + + + : {row.layer_value_1 ? row.layer_value_1 : '-'} + + + Layer Type 2 + + + : {row.layer_type_2 ? row.layer_type_2 : '-'} + + + Layer Value 2 + + + : {row.layer_value_2 ? row.layer_value_2 : '-'} + + + Cashless (%) + + + : {row.cashless_percentage ? row.cashless_percentage : '-'} + + + Reimburse (%) + + + : {row.reimbursement_percentage ? row.reimbursement_percentage : '-'} + + + Digital (%) + + + : {row.digital_percentage ? row.digital_percentage : '-'} + + + CoShareM (%) + + + : {row.co_share_m_percentage ? row.co_share_m_percentage : '-'} + + + CoShareS (%) + + + : {row.co_share_s_percentage ? row.co_share_s_percentage : '-'} + + + CoShareC (%) + + + : {row.co_share_c_percentage ? row.co_share_c_percentage : '-'} + + + Cashless Deductible + + + : {row.cashless_deductible ? row.cashless_deductible : '-'} + + + Reimbursement Deductible + + + : {row.reimbursement_deductible ? row.reimbursement_deductible : '-'} + + + Digital Deductible + + + : {row.digital_deductible ? row.digital_deductible : '-'} + + + DeductibleM + + + : {row.co_share_m_deductible ? row.co_share_m_deductible : '-'} + + + DeductibleS + + + : {row.co_share_s_deductible ? row.co_share_s_deductible : '-'} + + + DeductibleC + + + : {row.co_share_c_deductible ? row.co_share_c_deductible : '-'} + + + Prorate Type + + + : {row.prorate_type ? row.prorate_type : '-'} + + + Prorate Lookup + + + : {row.prorate_lookup ? row.prorate_lookup : '-'} + + + Max Days for Disability + + + : {row.max_days_for_disability ? row.max_days_for_disability : '-'} + + + Max Periode of Disability + + + : {row.max_period_for_disability ? row.max_period_for_disability : '-'} + + + Limit Free TC + + + : {row.limit_free_tc ? row.limit_free_tc : '-'} + + + Currency + + + : {row.currency ? row.currency : '-'} + + + Show Benefit Item + + + : {row.show_benefit_item ? row.show_benefit_item : '-'} + + + Show Benefit Value + + + : {row.show_benefit_value ? row.show_benefit_value : '-'} + - - - - Pre Post Treatment - - - : {row.pre_post_treatment ? row.pre_post_treatment : '-'} - - - Pre Treatment - - - : {row.pre_treatment_days ? row.pre_treatment_days : '-'} - - - Post Treatment - - - : {row.post_treatment_days ? row.post_treatment_days : '-'} - - - Layer Type 1 - - - : {row.layer_type_1 ? row.layer_type_1 : '-'} - - - Layer Value 1 - - - : {row.layer_value_1 ? row.layer_value_1 : '-'} - - - Layer Type 2 - - - : {row.layer_type_2 ? row.layer_type_2 : '-'} - - - Layer Value 2 - - - : {row.layer_value_2 ? row.layer_value_2 : '-'} - - - Cashless (%) - - - : {row.cashless_percentage ? row.cashless_percentage : '-'} - - - Reimburse (%) - - - : {row.reimbursement_percentage ? row.reimbursement_percentage : '-'} - - - Digital (%) - - - : {row.digital_percentage ? row.digital_percentage : '-'} - - - CoShareM (%) - - - : {row.co_share_m_percentage ? row.co_share_m_percentage : '-'} - - - CoShareS (%) - - - : {row.co_share_s_percentage ? row.co_share_s_percentage : '-'} - - - CoShareC (%) - - - : {row.co_share_c_percentage ? row.co_share_c_percentage : '-'} - - - Cashless Deductible - - - : {row.cashless_deductible ? row.cashless_deductible : '-'} - - - Reimbursement Deductible - - - : {row.reimbursement_deductible ? row.reimbursement_deductible : '-'} - - - Digital Deductible - - - : {row.digital_deductible ? row.digital_deductible : '-'} - - - DeductibleM - - - : {row.co_share_m_deductible ? row.co_share_m_deductible : '-'} - - - DeductibleS - - - : {row.co_share_s_deductible ? row.co_share_s_deductible : '-'} - - - DeductibleC - - - : {row.co_share_c_deductible ? row.co_share_c_deductible : '-'} - - - Prorate Type - - - : {row.prorate_type ? row.prorate_type : '-'} - - - Prorate Lookup - - - : {row.prorate_lookup ? row.prorate_lookup : '-'} - - - Max Days for Disability - - - : {row.max_days_for_disability ? row.max_days_for_disability : '-'} - - - Max Periode of Disability - - - : {row.max_period_for_disability ? row.max_period_for_disability : '-'} - - - Limit Free TC - - - : {row.limit_free_tc ? row.limit_free_tc : '-'} - - - Currency - - - : {row.currency ? row.currency : '-'} - - - Show Benefit Item - - - : {row.show_benefit_item ? row.show_benefit_item : '-'} - - - Show Benefit Value - - - : {row.show_benefit_value ? row.show_benefit_value : '-'} - - - - - - ) : ( -
- ) - ) : null} +
+ ) : ( + + ) + ) : null} +
{/* @@ -775,7 +902,7 @@ export default function PlanList() { const loadDataTableData = async (appliedFilter = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/corporates/' + corporate_id + '/benefits', { + const response = await axios.get('/corporates/' + corporate_id + '/corporate-benefits', { params: filter, }); // console.log(response.data); @@ -788,6 +915,19 @@ export default function PlanList() { fontWeight: 'bold', }; + const onSubmit = async (row : any) => { + try { + handleUpdate(dataValue.status, dataValue.id, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + const applyFilter = async (searchFilter: string) => { await loadDataTableData({ search: searchFilter }); setSearchParams({ search: searchFilter }); @@ -803,17 +943,157 @@ export default function PlanList() { loadDataTableData(); }, []); + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const handleUpdate = (active: number, id: number, reason:string) => { + axios + .put(`/benefits/${id}/activation`, { + active: active, + reason: reason + }) + .then((res) => { + window.location.reload(); + }); + } + + + const handleDeleteAllImport = () => { + axios + .post(`/corporates/${corporate_id}/delete-import-plan-benefit`) + .then((res) => { + window.location.reload(); + }); + } + const [isOpenDialogDelete, setDialogDeleteOpen] = useState(false); + const handleCloseDialogDelete = () => { + setDialogDeleteOpen(false); + }; + + + const getContent = () => ( + <> + + Are you sure to {dataValue?.status == 1 ? 'inactive' : 'active'} this benefit ? + + + + + Service + + + {dataValue?.service} + + + Plan + + + {dataValue?.plan} + + + Code + + + {dataValue?.benefit_code} + + + Customer Benefit Code + + + {dataValue?.customer_benefit_code} + + + + + + Reason for update* + + + + + + + + + + + + + + {dataValue?.status == 1? + + Inactive + + : + + Active + + + + } + + + + + + ); + return ( - - {/* The Main Table */} -
- +
+ - + {/* */} Service @@ -829,15 +1109,23 @@ export default function PlanList() { Detail Benefit - + + Limit Benefit + + + Freq. Period + + + Limit Frequency + Status - Action + - + {dataTableIsLoading ? ( @@ -864,8 +1152,7 @@ export default function PlanList() {
- - + {isDialog === 'edit' && ( )} + + + + + + Delete Import Benefit + + + + + + + + + Are you sure delete all data benefit and plan? + + + + + + +
); } diff --git a/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx b/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx index fd329b53..0a2b9a3f 100644 --- a/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx +++ b/frontend/dashboard/src/pages/Corporates/Benefit/sections/History.tsx @@ -85,7 +85,7 @@ export default function CustomizedAccordions() { (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { setExpanded(newExpanded ? panel : false); }; - const pageTitle = 'Audittrail Corporate'; + const pageTitle = 'Corporate Dashboard'; const { themeStretch } = useSettings(); @@ -121,11 +121,11 @@ export default function CustomizedAccordions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id + '/plans', + href: '/corporates/' + corporate_id + '/benefits', }, { - name: 'Audittrail Corporate', - href: '/corporate/' + corporate_id + '/plans', + name: 'Benefit', + href: '/corporates/' + corporate_id + '/benefits', }, ]} /> @@ -155,6 +155,7 @@ export default function CustomizedAccordions() { if (key !== 'reason') { return null; // Melewati iterasi saat key adalah 'deleted_by' } + renderedValue = item.new_values[key]; const field = key.charAt(0).toUpperCase() + key.slice(1); diff --git a/frontend/dashboard/src/pages/Corporates/ClaimHistory/Index.tsx b/frontend/dashboard/src/pages/Corporates/ClaimHistory/Index.tsx index 6fe66cdf..e30db1cd 100644 --- a/frontend/dashboard/src/pages/Corporates/ClaimHistory/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/ClaimHistory/Index.tsx @@ -33,11 +33,11 @@ export default function Divisions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Claim History', - href: '/corporate/' + corporate_id + '/claim-histories', + href: '/corporates/' + corporate_id + '/claim-histories', }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/CorporatePlan/CreateUpdate.tsx b/frontend/dashboard/src/pages/Corporates/CorporatePlan/CreateUpdate.tsx index 8768616f..a063274d 100644 --- a/frontend/dashboard/src/pages/Corporates/CorporatePlan/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/Corporates/CorporatePlan/CreateUpdate.tsx @@ -8,6 +8,9 @@ import axios from '../../../utils/axios'; import { useSnackbar } from 'notistack'; import CorporatePlanForm from './Form'; import { CorporatePlan } from '../../../@types/corporates'; +import { Stack } from "@mui/system"; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import { Typography } from "@mui/material"; @@ -36,8 +39,8 @@ export default function PlanCreate() { return ( - + /> */} + + navigate(`/corporates/${corporate_id}/plans`)} + sx={{ cursor: 'pointer' }} + /> + + Edit Plan + + diff --git a/frontend/dashboard/src/pages/Corporates/CorporatePlan/Form.tsx b/frontend/dashboard/src/pages/Corporates/CorporatePlan/Form.tsx index 145980be..da07687f 100644 --- a/frontend/dashboard/src/pages/Corporates/CorporatePlan/Form.tsx +++ b/frontend/dashboard/src/pages/Corporates/CorporatePlan/Form.tsx @@ -1,6 +1,6 @@ import * as Yup from 'yup'; import { LoadingButton } from '@mui/lab'; -import { Card, Grid, Stack, Typography } from '@mui/material'; +import { Card, Grid, Stack, Typography, Button } from '@mui/material'; import { CorporatePlan } from '../../../@types/corporates'; import { FormProvider, RHFEditor, RHFSwitch, RHFTextField } from '../../../components/hook-form'; import { useEffect, useMemo, useState } from 'react'; @@ -22,16 +22,22 @@ export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Prop const { corporate_id } = useParams(); const NewCorporatePlanSchema = Yup.object().shape({ - name: Yup.string().required('Name is required'), code: Yup.string().required('Corporate Code is required'), + service: Yup.string().required('Corporate Service is required'), + plan: Yup.string().required('Corporate Plan is required'), + type: Yup.string().required('Corporate Type is required'), + limit: Yup.string().required('Corporate Limit is required'), }); const defaultValues = useMemo( () => ({ - name: currentCorporatePlan?.name || '', + // name: currentCorporatePlan?.name || '', code: currentCorporatePlan?.code || '', - active: currentCorporatePlan?.active || true, - description: currentCorporatePlan?.description || '', + // active: currentCorporatePlan?.active || true, + type: currentCorporatePlan?.type || '', + limit: currentCorporatePlan?.limit_rules || '', + service: currentCorporatePlan?.service_code || '', + plan: currentCorporatePlan?.corporate_plan_id || '', }), [currentCorporatePlan] ); @@ -62,14 +68,15 @@ export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Prop } = methods; const onSubmit = async (data: any) => { + console.log(data); if (!isEdit) { await axios - .post('/corporate/' + corporate_id + '/corporate-plans', data) + .post('/corporates/' + corporate_id + '/corporate-plans', data) .then((res) => { enqueueSnackbar('Corporate Plan created successfully', { variant: 'success' }); }) .then((res) => { - navigate('/corporate/' + corporate_id + '/corporate-plans', { replace: true }); + navigate(`/corporates/${corporate_id}/plans`, { replace: true }); }) .catch(({ response }) => { if (response.status === 422) { @@ -83,12 +90,12 @@ export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Prop }); } else { await axios - .put('/corporate/' + corporate_id + '/corporate-plans/' + currentCorporatePlan?.id, data) + .put('/corporates/' + corporate_id + '/corporate-plans/' + currentCorporatePlan?.id, data) .then((res) => { enqueueSnackbar('Corporate Plan updated successfully', { variant: 'success' }); }) .then((res) => { - navigate('/corporate/' + corporate_id + '/corporate-plans/', { replace: true }); + navigate('/corporates/' + corporate_id + '/plans', { replace: true }); }) .catch(({ response }) => { enqueueSnackbar('Update Failed : ' + response.data.message, { variant: 'error' }); @@ -98,12 +105,34 @@ export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Prop return ( - - - + + + + Service* + + + + Plan* + + + + Code* + + + + Type* + + + + Plan Limit* + + + + {/* Corporate Plan Detail + @@ -122,17 +151,35 @@ export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Prop fullWidth={true} loading={isSubmitting} > - Create Corporate Plan + { isEdit ? 'Update' : 'Create'} Corporate Plan - + */} - - - - - - + + + + + Save + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/CorporatePlan/Index.tsx b/frontend/dashboard/src/pages/Corporates/CorporatePlan/Index.tsx index ddc01dbd..247d941e 100644 --- a/frontend/dashboard/src/pages/Corporates/CorporatePlan/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/CorporatePlan/Index.tsx @@ -32,11 +32,11 @@ export default function Divisions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Corporate Plan', - href: '/corporate/' + corporate_id + '/corporate-plans', + href: '/corporates/' + corporate_id + '/corporate-plans', }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx b/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx index 2b1d4860..afa66101 100644 --- a/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx +++ b/frontend/dashboard/src/pages/Corporates/CorporateTabNavigations.tsx @@ -44,10 +44,10 @@ export default function CorporateTabNavigations({ position }: Props) { path: 'benefits', label: 'Benefit', }, - { - path: 'divisions', - label: 'Division', - }, + // { + // path: 'divisions', + // label: 'Division', + // }, { path: 'members', label: 'Member List', @@ -61,15 +61,16 @@ export default function CorporateTabNavigations({ position }: Props) { label: 'Hospital', }, { - path: 'formularium', + path: 'formulariums', label: 'Formularium', }, - { - path: 'claim-history', - label: 'Claim History', - }, + // { + // path: 'claim-history', + // label: 'Claim History', + // }, ]; useEffect(() => { + console.log(position); let currentIndex = mainTabItems.findIndex((item) => item.path === position); setCurrentTab(currentIndex); }, []); @@ -89,7 +90,7 @@ export default function CorporateTabNavigations({ position }: Props) { { - navigate('/corporate/' + corporate_id + '/' + mainTabItems[index].path); + navigate('/corporates/' + corporate_id + '/' + mainTabItems[index].path); }} label={tabItem.label} /> diff --git a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Edit.tsx b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Edit.tsx new file mode 100644 index 00000000..5065a27a --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Edit.tsx @@ -0,0 +1,273 @@ +/** + * Core + * ============================================ + */ +import axios from '@/utils/axios'; +import { useForm } from 'react-hook-form'; +import { useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, IconButton, Typography, Grid, Card, TextField, Autocomplete, Button } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +import Page from '../../../components/Page'; +import { LoadingButton } from "@mui/lab"; +import { FormProvider, RHFCustomMultiCheckbox, RHFTextField } from '@/components/hook-form'; +import { enqueueSnackbar } from 'notistack'; + +/** + * Icon + * ============================================ + */ +import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; + +export default function Divisions() { + const pageTitle = 'Edit Exclusion'; + const navigate = useNavigate() + const { corporate_id, exclusion_id } = useParams(); // id di url + const [ plans, setPlans ] = useState([]); // option untuk field plans + + // checkbox option + // ==================================== + const msc_checkbox_option = [ + { + value: 'm', + label: 'Member', + }, + { + value: 's', + label: 'Spouse', + }, + { + value: 'c', + label: 'Child', + }, + ] + + const gender_checkbox_option = [ + { + value: 'male', + label: 'Male', + }, + { + value: 'female', + label: 'Female', + }, + ] + + // setup form + // ==================================== + const defaultValues: any = { + msc: [], + gender: [], + min_age: '', + max_age: '', + plans: [], + }; + + const methods = useForm({ + defaultValues + }); + + const { setValue, handleSubmit, reset, watch, formState: { isDirty, isSubmitting } } = methods; + const formValues = watch(); + + // set form value + // ===================================== + useEffect(() => { + axios.get(`corporates/${corporate_id}/diagnosis-exclusions/${exclusion_id}`) + .then((res) => { + // plan option + setPlans(res.data.data.plans); + + // set value + let res_plan = res.data.data.exclusion.rules.plan; + + if (res_plan.length == 1 && res_plan[0] == '') { + res_plan = []; + } + + reset({ + msc : res.data.data.exclusion.rules.msc[0].split(','), + gender : res.data.data.exclusion.rules.gender[0].split(','), + min_age : res.data.data.exclusion.value_rules.min_age, + max_age : res.data.data.exclusion.value_rules.max_age, + plans : res_plan, + }) + }) + }, [exclusion_id]); + + // Submit Form + // ===================================== + const submitHandler = async (data: any) => { + let one_row = { + msc: { + m: data.msc.includes('m'), + s: data.msc.includes('s'), + c: data.msc.includes('c'), + }, + gender : { + male : data.gender.includes('male') == true ? 1 : 0, + female: data.gender.includes('female') == true ? 1 : 0, + }, + min_age: data.min_age, + max_age: data.max_age, + plan : data.plans.join(','), + icd_id : exclusion_id, + } + + return axios + .post(`/corporates/${corporate_id}/diagnosis-exclusions/store`, { + type: 'one_row', + icd_id: exclusion_id, + one_row + }) + .then((res) => { + enqueueSnackbar('Exclusion Updated', { + variant: 'success', + }); + + reset({ + msc : data.msc, + gender : data.gender, + min_age : data.min_age, + max_age : data.max_age, + plans : data.plans, + }) + + return true; + }) + .catch((res) => { + enqueueSnackbar('Terjadi kesalahan pada server', { + variant: 'error', + }); + + return true; + }) + } + + return ( + + + navigate(`/corporates/${corporate_id}/diagnosis-exclusions`)} > + + + + + {pageTitle} + + + + + + + + {/* MSC row */} + + + + + MSC* : + + + + + + + + + {/* Gender row */} + + + + + Gender* : + + + + + + + + + {/* Age row */} + + + + + Age* : + + + + + + + + + + + + + + + + {/* Plan Section */} + + + + + Plan* : + + + + { + return option ?? false + }} + value={formValues.plans} + isOptionEqualToValue={(option, value) =>{ + return option === value + }} + renderInput={(params) => ( + + )} + onChange={(event,value) => { + setValue('plans', value, {shouldDirty: true}); + }} + /> + + + + + {/* Button Cancle & Save */} + + + + + + Save Changes + + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/History.tsx b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/History.tsx new file mode 100644 index 00000000..e75653e5 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/History.tsx @@ -0,0 +1,211 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + Container, + FormControl, + Grid, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Stack, +} from '@mui/material'; +import * as React from 'react'; +import { useParams } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; +import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; +import { useContext, useEffect, useState } from 'react'; +import MuiAccordionSummary, { + AccordionSummaryProps, +} from '@mui/material/AccordionSummary'; +import useSettings from '../../../hooks/useSettings'; +import axios from '../../../utils/axios'; +import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import MuiAccordionDetails from '@mui/material/AccordionDetails'; +import HeaderBreadcrumbs from '../../../components/HeaderBreadcrumbs'; +import { Corporate } from '@/@types/corporates'; +import { fDate, fDateTime } from '@/utils/formatTime'; + +const Accordion = styled((props: AccordionProps) => ( + +))(({ theme }) => ({ + border: `1px solid ${theme.palette.divider}`, + '&:not(:last-child)': { + borderBottom: 0, + }, + '&:before': { + display: 'none', + }, +})); + +const AccordionSummary = styled((props: AccordionSummaryProps) => ( + } + {...props} + /> +))(({ theme }) => ({ + backgroundColor: + theme.palette.mode === 'dark' + ? 'rgba(255, 255, 255, .05)' + : 'rgba(0, 0, 0, .03)', + flexDirection: 'row-reverse', + '& .MuiAccordionSummary-expandIconWrapper.Mui-expanded': { + transform: 'rotate(90deg)', + }, + '& .MuiAccordionSummary-content': { + marginLeft: theme.spacing(1), + }, +})); + +const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ + padding: theme.spacing(2), + borderTop: '1px solid rgba(0, 0, 0, .125)', +})); + +export default function CustomizedAccordions() { + const [expanded, setExpanded] = React.useState('panel1'); + + const handleChange = + (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + const pageTitle = 'History Corporate Exclusions'; + + const { themeStretch } = useSettings(); + + const { corporate_id, id } = useParams(); + + const [corporate, setCorporate] = useState(); + const [ currentCorporate, setCurrentCorporate ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\ExclusionImport'; + const url = `/audittrail/${corporate_id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentCorporate(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + + }, [configuredCorporateContext]); + + return ( +
+ + {currentCorporate?.data.map((item, index) => ( + + + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + + + + + Field + Old Value + New Values + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'deleted_by' || key === 'created_by' || key === 'updated_by' || key === 'file_path') { + return null; // Melewati iterasi saat key adalah 'deleted_by' + } + switch (key) { + case 'welcome_message': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'help_text': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'active': + renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; + value = value == 1 ? 'Active' : 'Inactive'; + break; + case 'created_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'delete_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + + const field = key.charAt(0).toUpperCase() + key.slice(1); + if (value != renderedValue){ + return ( + + {`${field}`} + {`${value}`} + {renderedValue} + + ); + } + })} + + + + + ))} +
+ ); +} diff --git a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Index.tsx b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Index.tsx index f07e76ff..05a3808b 100644 --- a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/Index.tsx @@ -36,11 +36,11 @@ export default function Divisions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Diagnosis Exclusion', - href: '/corporate/' + corporate_id + '/diagnosis-exclusions', + href: '/corporates/' + corporate_id + '/diagnosis-exclusions', }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx index 541c7bac..8f6b4c03 100644 --- a/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/DiagnosisExclusion/List.tsx @@ -1,4 +1,5 @@ // @mui +import * as Yup from 'yup'; import { Autocomplete, Box, @@ -38,14 +39,17 @@ import { } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -import AddIcon from '@mui/icons-material/Add'; +import GetApp from '@mui/icons-material/GetApp'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; // hooks import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; -import { useParams, useSearchParams } from 'react-router-dom'; +import { Link, useParams, useSearchParams, useNavigate } from 'react-router-dom'; // components +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; + import axios from '../../../utils/axios'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; import { Icd } from '../../../@types/diagnosis'; @@ -53,6 +57,14 @@ import BasePagination from '../../../components/BasePagination'; import { enqueueSnackbar } from 'notistack'; import { Icon } from '@iconify/react'; import { LoadingButton } from '@mui/lab'; +import HistoryIcon from '@mui/icons-material/History'; +import CachedIcon from '@mui/icons-material/Cached'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import { EditOutlined, FindInPageOutlined } from '@mui/icons-material'; +import Label from '@/components/Label'; +import { display } from '@mui/system'; +import DialogUpdateStatus from '@/components/DialogUpdateStatus' +import { FormProvider, RHFSelect } from '@/components/hook-form'; export default function List(props: any) { const { themeStretch } = useSettings(); @@ -81,7 +93,7 @@ export default function List(props: any) { }, [searchParams]); return ( - + { axios.get('corporates/import-document-example/' + type) .then((response) => { @@ -190,17 +202,19 @@ export default function List(props: any) { {/*

kjasndkjandskjasndkjansdkjansd

*/} + { return { value: plan.code, @@ -297,6 +319,16 @@ export default function List(props: any) { const { row, index, data } = props; } + const [isDialogOpen, setDialogOpen] = useState(false) + let titles = { + name: 'Update Status', + icon: '-' + } + const [dataValue, setDataValue] = useState(''); + const [dataDescription, setDescriptionValue] = useState(''); + const [url, setUrl] = useState(''); + + function Row(props: { row: ReturnType; data: any; @@ -329,9 +361,6 @@ export default function List(props: any) { const [openEdit, setOpenEdit] = React.useState(false); - console.log('open', open); - console.log('openEdit', openEdit); - // const [plans, setPlans] = useState([]); const plans = data; @@ -461,290 +490,217 @@ export default function List(props: any) { console.log('exclusions', exclusions); + // const handleActivate = (row: any) => { + + // axios + // .put(`/corporates/diagnosis-exclusions/update_activation`, { + // id: row.id, + // active: row.active == 1 ? 0 : 1, + // }) + // .then((res) => { + // setDataTableData({ + // ...dataTableData, + // data: dataTableData.data.map((model) => { + // let updatedModel = model; + + // if (model.id == row.id) { + // updatedModel.active = row.active == 1 ? 0 : 1; + // } + + // return updatedModel; + // }), + // }); + // }) + // .catch((error) => { + // if (error.response.status == 400) { + // let data = error.response.data.messages; + + // for (const key in data) { + // enqueueSnackbar( + // data[key][0], + // { variant: 'error' } + // ); + // } + // } + // else { + // enqueueSnackbar( + // error.response.data.message ?? error.message ?? 'Failed Processing Request', + // { variant: 'error' } + // ); + // } + // }); + // }; + + const handleActivate = (isOpen: boolean, dataValue: DataContent) => { + console.log(dataValue) + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this service ?') + setUrl(url) + }; + return ( *': { borderBottom: 'unset' } }}> - - setOpen(!open)}> - {open ? : } - - - {row.service_code} - {row.code} - {row.name} - {Object.keys(row.rules).length ? 'With Rules' : 'All'} + {if(open==true) setOpen(!open)}}/> + {if(open==true) setOpen(!open)}}> + {row.service_code} + + {if(open==true) setOpen(!open)}}> + {row.code} + + {if(open==true) setOpen(!open)}}> + {row.name} + + {if(open==true) setOpen(!open)}}> + {Object.keys(row.rules).length ? 'With Rules' : 'All'} + + {if(open==true) setOpen(!open)}}> + {row.active == 1 && ( + + )} + {row.active != 1 && ( + + )} + - - {openEdit ? ( - - ) : ( - - )} - - + + + setOpen(!open)}> + + Detail + + navigate(`/corporates/${corporate_id}/diagnosis-exclusions/${row.id}/edit`)} > + + Edit + + handleActivate(true, { + code: row.code, + name: row.name, + rules: Object.keys(row.rules).length ? 'With Rules' : 'All', + id:row.id, + status: row.active, + service: row.service_code + }) + } > + + Update Status + + + } /> + {/* COLLAPSIBLE ROW */} - {open == true ? ( - openEdit == false ? ( - - {Object.keys(row.rules).length ? ( -
- - Excluded Only for : - - - {row.rules.msc && ( - - MSC : {row.rules.msc.join(', ') ?? '-'} - - )} - {row.rules.gender && ( - - Gender : {row.rules.gender.join(', ') ?? '-'} - - )} - {(row.rules.min_age || row.rules.max_age) && ( - - Age : {row.rules.min_age ?? '-'} - {row.rules.max_age ?? '-'} - - )} - {row.rules.plan && ( - - Plan : {row.rules.plan.join(', ') ?? '-'} - - )} -
- ) : ( - - Excluded for All - - )} -
- ) : ( - // - - - Edit Exclusion : - - - - - - - MSC - - - - - - { - // handleConfigExclusion(event, row, 'm', 'msc'); - handleChange(index, event, 'msc', row.id, 'm'); - }} - /> - } - label="Member" - /> - - - { - // handleConfigExclusion(event, row, 's', 'msc'); - handleChange(index, event, 'msc', row.id, 's'); - }} - /> - } - label="Spouse" - /> - - - { - // handleConfigExclusion(event, row, 'c', 'msc'); - handleChange(index, event, 'msc', row.id, 'c'); - }} - /> - } - label="Child" - /> - - - - - - - - - - Gender - - - - - { - // handleConfigExclusion(event, row, 'male', 'gender'); - handleChange(index, event, 'gender', row.id, 'male'); - }} - /> - } - label="Male" - /> - - - { - // handleConfigExclusion(event, row, 'female', 'gender'); - handleChange(index, event, 'gender', row.id, 'female'); - }} - /> - } - label="Female" - /> - - - - - - - - - Age - - - - - { - handleMinAge(event); - handleChange(index, event, 'min_age', row.id); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion(event, row, minAge, 'min_age'); - } - }} - /> - - - { - handleMaxAge(event); - handleChange(index, event, 'max_age', row.id); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion(event, row, maxAge, 'max_age'); - } - }} - /> - - - - - - - - - Plan - - - - - option.label} - defaultValue={converToArray(row.value_rules.plan) || []} - isOptionEqualToValue={(option, value) => - option.value === value.value - } - onChange={(event, value) => { - handlePlanChange(event, value); - handleChange(index, event, 'plan', row.id, value); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion(event, row, valuePlan, 'plan'); - } - }} - renderInput={(params) => ( - - )} - /> - - - - - - - - ) - ) : null} + {open == true ? ( + + + + + + Excluded Only for : + + + + + + + MSC : + + + + {row?.rules?.msc && row?.rules?.msc[0] ? ( + row?.rules?.msc[0].split(',').map((text, i) => { + let labelMSC: string = text; + switch (labelMSC) { + case 'm': + labelMSC = 'Member'; + break; + case 'c': + labelMSC = 'Child'; + break; + case 's': + labelMSC = 'Spouse'; + break; + default: + labelMSC = 'Member'; + } + return ( + + + + ); + }) + ) : '-'} + + + + Gender : + + + + {row?.rules?.gender && row?.rules?.gender[0] ? ( + row?.rules?.gender[0].split(',').map((text,i) => { + const capitalizedText = text.charAt(0).toUpperCase() + text.slice(1); + return ( + + + + ) + }) + ) : '-'} + + + + Min Age : + + + + + {row?.rules?.min_age && row?.rules?.min_age[0] ? row?.rules?.min_age[0] : '-'} + + + + + Max Age : + + + + + {row?.rules?.max_age && row?.rules?.max_age[0] ? row?.rules?.max_age[0] : '-'} + + + + + Plan : + + + + + {row?.rules?.plan && row?.rules?.plan[0] ? row?.rules?.plan[0] : '-'} + + + + + + + + ) : null }
@@ -843,6 +799,18 @@ export default function List(props: any) { fontWeight: 'bold', }; + const onSubmit = async (row : any) => { + try { + handleUpdate(dataValue.status, dataValue.id, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; const applyFilter = async (searchFilter: any) => { await loadDataTableData({ search: searchFilter }); setSearchParams({ search: searchFilter }); @@ -858,6 +826,138 @@ export default function List(props: any) { loadDataTableData(); }, []); + const navigate = useNavigate() + + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const handleUpdate = (active: number, id: number, reason:string) => { + console.log(active) + axios + .put(`/corporates/diagnosis-exclusions/update_activation`, { + id: id, + active: active, + reason: reason + }) + .then((res) => { + window.location.reload(); + }); + } + + const getContent = () => ( + <> + + Are you sure to {dataValue?.status == 1 ? 'inactive' : 'active'} this benefit ? + + + + + Service + + + {dataValue?.service} + + + Code + + + {dataValue?.code} + + + Name + + + {dataValue?.name} + + + Rules + + + {dataValue?.rules} + + + + + + Reason for update* + + + + + + + + + + + + + + {dataValue?.status == 1? + + Inactive + + : + + Active + + + + } + + + + + + ); + return ( @@ -866,9 +966,9 @@ export default function List(props: any) { {/* The Main Table */} - + - + Service @@ -881,15 +981,25 @@ export default function List(props: any) { Rules - - Action + + Status + + + + navigate(`/corporates/${corporate_id}/diagnosis-exclusions/history`)}> + + History + + + } /> - + {dataTableIsLoading ? ( - + Loading @@ -897,7 +1007,7 @@ export default function List(props: any) { ) : dataTableData.data.length == 0 ? ( - + No Data @@ -920,6 +1030,16 @@ export default function List(props: any) { + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/DialogUpdateStatus.tsx b/frontend/dashboard/src/pages/Corporates/DialogUpdateStatus.tsx new file mode 100644 index 00000000..2a1bd19d --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/DialogUpdateStatus.tsx @@ -0,0 +1,189 @@ +import * as Yup from 'yup'; +import { enqueueSnackbar, useSnackbar } from 'notistack'; +import { useNavigate } from 'react-router-dom'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +// @mui +import { styled } from '@mui/material/styles'; +import { LoadingButton } from '@mui/lab'; +import { Box, Button, Grid, Stack, Typography, Chip, Autocomplete } from '@mui/material'; +import { CorporateService } from '../../@types/corporates'; +// components +import { FormProvider, RHFTextField, RHFSwitch, RHFSelect } from '../../components/hook-form'; +import axios from '../../utils/axios'; +import { LaravelPaginatedData } from '../../@types/paginated-data'; + +// import { Contact } from '../../../../@types/contact'; +import { Link, useParams, useSearchParams } from 'react-router-dom'; + +// @mui +// components +import MuiDialog from '../../components/MuiDialog'; +// React +import { ReactElement } from 'react'; + +// ---------------------------------------------------------------------- + +const HeaderStyle = styled('header')(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + padding: theme.spacing(2), + justifyContent: 'space-between', +})); + +type DataContent = { + info: string; + date: string; + time: string; +}; + +type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + id: number; +}; + +type FormValuesProps = { + value: string; + active: boolean; +}; + +// ---------------------------------------------------------------------- + +// ---------------------------------------------------------------------- + +const DialogUpdateStatus = ({ title, openDialog, setOpenDialog, id }: MuiDialogProps) => { + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Corporate Status is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + + useEffect(() => { + if (openDialog === false) { + reset(); + } + }, [openDialog, reset]); + + const handleActivate = (id: number, status: string) => { + axios + .put(`/corporates/${id}/activation`, { + active: status == 'active', + }) + .then((res) => { + console.log(res) + enqueueSnackbar( + 'Succes', + { variant: 'success' } + ); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + }; + + const onSubmit = async (row : ReturnType) => { + try { + handleActivate(1, 'active') + } catch (error: any) { + + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + + function createData(corporateService: CorporateService): CorporateService { + return { + ...corporateService, + }; + } + + const getContent = (props: { row: ReturnType }) => ( + + + + + + + + + + + + + + + + + + + Save + + + + + + + + ); + + return ( + + ); +}; + +export default DialogUpdateStatus; \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx b/frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx index d4ad3ea9..31ed9c23 100644 --- a/frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/Corporates/Division/CreateUpdate.tsx @@ -3,18 +3,29 @@ import { useNavigate, useParams } from "react-router-dom"; import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; import Page from "../../../components/Page"; import useSettings from "../../../hooks/useSettings"; -import { useEffect, useMemo, useState } from 'react'; +import {useContext, useEffect, useMemo, useState } from 'react'; import axios from '../../../utils/axios'; import { useSnackbar } from 'notistack'; import CorporatePlanForm from './Form'; import { CorporatePlan } from '../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; export default function PlanCreate() { const { themeStretch } = useSettings(); const { corporate_id, id } = useParams(); + const [corporate, setCorporate] = useState(); + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + }, [configuredCorporateContext]) + const [ currentCorporatePlan, setCurrentCorporatePlan ] = useState(); + + const navigate = useNavigate(); const isEdit = !!id; @@ -44,16 +55,16 @@ export default function PlanCreate() { href: '/corporates', }, { - name: 'Corporate Name', - href: '/corporates/'+corporate_id, + name: corporate?.name ?? '-', + href: '/corporate/'+corporate_id, }, { name: 'Division', - href: '/corporates/'+corporate_id+'/divisions', + href: '/corporate/'+corporate_id+'/divisions', }, { name: !isEdit ? 'Create' : 'Edit', - href: '/corporates/'+corporate_id+'/divisions/'+id, + href: '/corporate/'+corporate_id+'/divisions/'+id, }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/Division/Index.tsx b/frontend/dashboard/src/pages/Corporates/Division/Index.tsx index 84aa6e6e..5de7ce4e 100644 --- a/frontend/dashboard/src/pages/Corporates/Division/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Division/Index.tsx @@ -36,11 +36,11 @@ export default function Divisions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Division', - href: '/corporate/' + corporate_id + '/divisions', + href: '/corporates/' + corporate_id + '/divisions', }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/Division/List.tsx b/frontend/dashboard/src/pages/Corporates/Division/List.tsx index 123a603f..46e183ae 100644 --- a/frontend/dashboard/src/pages/Corporates/Division/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Division/List.tsx @@ -41,6 +41,14 @@ import axios from '../../../utils/axios'; import { CorporatePlan } from '../../../@types/corporates'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; import BasePagination from '../../../components/BasePagination'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import { enqueueSnackbar } from 'notistack'; export default function PlanList() { const { themeStretch } = useSettings(); @@ -97,74 +105,33 @@ export default function PlanList() { return ( - *': { borderBottom: 'unset' } }}> - - setOpen(!open)}> - {open ? : } - - - {row.id} - {row.code} - {row.name} - {row.description} - - - - - - - - - - {/* COLLAPSIBLE ROW */} - - - - - No Extra Data - - - {false && ( - - - Rules - -
- - - Date - Customer - Amount - Total price ($) - - - - {/* {row.history ? row.history.map((historyRow) => ( */} - - - {row.start} - {row.end} - - {row.start} - {row.start} - {row.start} - - {/* )) - : ( - - No Data - - ) - } */} - -
- - )} - + {row.id ? row.id : '-'} + {row.code ? row.code : '-'} + {row.name ? row.name : '-'} + {row.description ? row.description : '-'} + + + navigate ('')}> + + Details + + handleEditData(row)}> + + Edit + + handleEditDataStatus(row)}> + + Update Status + + navigate ('')}> + + History + + + } + />
@@ -194,7 +161,6 @@ export default function PlanList() { const response = await axios.get('/corporates/' + corporate_id + '/divisions', { params: filter, }); - // console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); @@ -219,48 +185,147 @@ export default function PlanList() { loadDataTableData(); }, []); + // Dialog for devisions + const [openDialog, setOpenDialog] = useState(false); + //validation dialog + const [nameField, setNameField] = useState(''); + const [nameFieldError, setNameFieldError] = useState(''); + const [codeField, setCodeField] = useState(''); + const [codeFieldError, setCodeFieldError] = useState(''); + const [descriptionField, setDescriptionField] = useState(''); + // ID for edit data + const [idField, setIdField] = useState(''); + + const isRequiredFieldsFilled = () => { + return nameField.trim() !== '' && codeField.trim() !== ''; + }; + + const handleAddData = () => { + setOpenDialog(true); + } + + const handleCloseDialog = () => { + setOpenDialog(false); + setNameField(''); + setCodeField(''); + setDescriptionField(''); + setIdField(''); + } + + const handleSaveData = () => { + const addData = { + code: codeField, + name: nameField, + description: descriptionField, + }; + // Check conditions add or update data + if(idField) + { + // Update data + axios + .put('/corporates/'+corporate_id+'/divisions/'+idField+'', addData) + .then((response) => { + enqueueSnackbar('Data saved successfully', { variant: 'success' }); + loadDataTableData(); + handleCloseDialog(); + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + else{ + // Save data + axios + .post('/corporates/'+corporate_id+'/divisions', addData) + .then((response) => { + enqueueSnackbar('Data saved successfully', { variant: 'success' }); + loadDataTableData(); + handleCloseDialog(); + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + } + //Edit data + const handleEditData = (data) => { + setIdField(data.id) + setNameField(data.name); + setCodeField(data.code); + setDescriptionField(data.description); + setOpenDialog(true); + } + // End dialog for devisions + + // Dialog for update status devisions + const [openDialogStatus, setOpenDialogStatus] = useState(false); + // Active for update status + const [activeField, setActiveField] = useState(''); + const handleCloseDialogStatus = () => { + setOpenDialogStatus(false); + setNameField(''); + setCodeField(''); + setDescriptionField(''); + setIdField(''); + setActiveField(''); + } + + const handleSaveDataStatus = () => { + + } + + const handleEditDataStatus = (data) => { + setIdField(data.id) + setNameField(data.name); + setCodeField(data.code); + setDescriptionField(data.description); + setActiveField(data.active); + setOpenDialogStatus(true); + } + // End dialog for update status devisions + + + return ( - - - + - {/* The Main Table */} - + - - - ID + + ID - - Code + + Code - - Name + + Name - - Description + + Description + + - + {dataTableIsLoading ? ( - + Loading @@ -268,7 +333,7 @@ export default function PlanList() { ) : dataTableData.data.length == 0 ? ( - + No Data @@ -284,6 +349,101 @@ export default function PlanList() { + {/* Dialog */} + + + + + {idField ? ( + <> + Edit Data + + ): ( + <> + Create Data + + )} + + + + + + + + + + { + setCodeField(e.target.value); + setCodeFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} + fullWidth + inputProps={{ maxLength: 50 }} + error={!!codeFieldError} + helperText={codeFieldError} + /> + { + setNameField(e.target.value); + setNameFieldError(e.target.value.trim() === '' ? 'This field is required' : ''); + }} + fullWidth + inputProps={{ maxLength: 50 }} + error={!!nameFieldError} + helperText={nameFieldError} + /> + { + setDescriptionField(e.target.value); + }} + fullWidth + inputProps={{ maxLength: 255 }} + /> + + + + + + + + + {/* Dialog Update Status */} + + + + + Update Status + + + + + + + + + Are you sure to inactive this division ? + + + Code + {codeField} + + + + + + + + + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Form.tsx b/frontend/dashboard/src/pages/Corporates/Form.tsx index 37e18366..d349d07f 100644 --- a/frontend/dashboard/src/pages/Corporates/Form.tsx +++ b/frontend/dashboard/src/pages/Corporates/Form.tsx @@ -10,14 +10,19 @@ import { styled } from '@mui/material/styles'; import { LoadingButton } from '@mui/lab'; import { Box, + Button, Card, FormControl, + FormControlLabel, FormHelperText, + FormLabel, Grid, InputLabel, Menu, MenuItem, OutlinedInput, + Radio, + RadioGroup, Select, SelectChangeEvent, Stack, @@ -44,6 +49,8 @@ import { fCurrency } from '../../utils/formatNumber'; import RHFAutocomplete from '../../components/hook-form/RHFAutocomplete'; import UploadImage from '../../components/UploadImage'; import { fPostFormat } from '@/utils/formatTime'; +import AddIcon from '@mui/icons-material/Add'; +import Link from '@/theme/overrides/Link'; const LabelStyle = styled(Typography)(({ theme }) => ({ ...theme.typography.subtitle2, @@ -117,12 +124,14 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { NewCorporateSchema = Yup.object().shape({ isEdited: Yup.boolean(), name: Yup.string().required('Name is required'), + code: Yup.string() .required('Corporate Code is required') .test('unique-code', 'Code must be unique', async function (value) { const existingCodes = await getExistingCodes(); return !existingCodes.includes(value); - }), + }), + // payor_id: Yup.string().required('Payor is required'), active: Yup.boolean().required('Corporate Status is required'), type: Yup.string().required('Type is required'), welcome_message: Yup.string().required('Welcome Message is required'), @@ -487,9 +496,10 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { - Corporate Profile + Corporate Profile + Corporate Profile* )} + Corporate Code* + Corporate Name* + Payor ID* {isEdit && ( @@ -534,15 +547,15 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { )} - - Welcome Message + + Welcome Message * - + - - Help Text + + Help Text * @@ -614,27 +627,30 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { {/* Policy Detail */} - Policy Detail + Policy Detail + Policy Number* {!currentCorporate?.id && ( Will be generated if empty )} - {/* Minimal Deposit Policy Level */} - + Tanggal Mulai Kerjasama* + - + Tanggal Akhir Kerjasama* + + Deposit Intial Fund* - + Minimal Deposit Policy Level @@ -667,7 +683,7 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { - + Minimal Alert Level @@ -691,7 +707,7 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { - + Stop Service Level @@ -716,16 +732,106 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) { )} - - - {!isEdit ? 'Save New Corporate' : 'Save Corporate'} - + {/* Type contrack */} + {/* + + + + Tipe Pembayaran + + + + + + + + #1 + + + + + Tanggal Mulai Kontrak* + + + Tanggal Akhir Kontrak* + + + + + + + + + + + + + Tipe Pembayaran + + } label="Deposit" /> + } label="Hutang" /> + } label="Penagihan Hutang" /> + + + + + + + + Save + + + + + */} + + + + + + Save + + diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/Index.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/Index.tsx index c07b5233..7ac21a45 100644 --- a/frontend/dashboard/src/pages/Corporates/Formularium/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Formularium/Index.tsx @@ -1,10 +1,10 @@ -import { Card, Grid } from '@mui/material'; +import { Card, Grid, Container } from '@mui/material'; import { useParams } from 'react-router-dom'; import HeaderBreadcrumbs from '../../../components/HeaderBreadcrumbs'; import Page from '../../../components/Page'; import useSettings from '../../../hooks/useSettings'; import CorporateTabNavigations from '../CorporateTabNavigations'; -import List from './List'; +import List from './New/List'; import { useContext, useEffect, useState } from 'react'; import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; @@ -24,9 +24,9 @@ export default function CorporateFormularium() { }, [configuredCorporateContext]); return ( - + - + diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/List-old.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/List-old.tsx new file mode 100644 index 00000000..d50912fc --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/List-old.tsx @@ -0,0 +1,355 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Input, Grid } from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; +// hooks +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../hooks/useSettings'; +import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; +// components +import axios from '../../../utils/axios'; +import { CorporatePlan } from '../../../@types/corporates'; +import { LaravelPaginatedData } from '../../../@types/paginated-data'; +import BasePagination from '../../../components/BasePagination'; +import { enqueueSnackbar } from 'notistack'; + + +export default function PlanList() { + const { themeStretch } = useSettings(); + const { corporate_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const navigate = useNavigate(); + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState({ + current_page: 1, + data: [], + path: "", + first_page_url: "", + last_page: 1, + last_page_url: "", + next_page_url: "", + prev_page_url: "", + per_page: 10, + from: 0, + to: 0, + total: 0 + }); + + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + // const filterForm = useRef(); + const [searchText, setSearchText] = useState(""); + const [searchStatus, setSearchStatus] = useState("active"); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? '' + setSearchText(newSearchText); + } + + const handleStatusChange = (event: any) => { + const newSearchStatus = event.target.value ?? '' + console.log('changing to', newSearchStatus) + setSearchStatus(newSearchStatus) + // console.log(searchStatus); + + const searchFilter = { + "search" : searchText, + "status" : newSearchStatus + }; + + props.onSearch(searchFilter); + } + + const handleSubmit = (event?: any) => { + event?.preventDefault(); + const searchFilter = { + "search" : searchText, + "status" : searchStatus + }; + + props.onSearch(searchFilter); // Trigger to Parent + } + + useEffect(() => { + setSearchText(searchParams.get('search') ?? ''); + setSearchStatus(searchParams.get('status') ?? searchStatus ?? 'active'); + }, [searchParams]) + + return ( + + + + + + + + + + {/* ITS FUCKING MAGIC, SUBMIT BY ENTER WORKING IF THIS BUTTON IS AVAILABLE */} + + + + ); + } + + // Called on every row to map the data to the columns + function createData( plan: CorporatePlan ): CorporatePlan { + return { + ...plan, + } + } + + const handleInactiveAction = (formularium : any) => { + enqueueSnackbar('Fuck yuo'), { variant: 'error' }; + axios + .put('/corporates/'+corporate_id+'/formulariums/'+formularium.id+'/activate') + .then(() => { + setDataTableData( + { + ...dataTableData, + data: dataTableData.data.map((item: any) => { + if (item.id === formularium.id) { + return { + ...item, + status: 'active' + } + } + + return item; + }) + }) + }) + .catch((error) => { + console.log(error) + enqueueSnackbar(error.data?.message ?? (error.message ?? 'Failed Processing Request'), { variant: 'error' }); + }) + } + + const handleActiveAction = (formularium : any) => { + axios + .put('/corporates/'+corporate_id+'/formulariums/'+formularium.id+'/deactivate') + .then(() => { + setDataTableData( + { + ...dataTableData, + data: dataTableData.data.map((item: any) => { + if (item.id === formularium.id) { + return { + ...item, + status: 'inactive' + } + } + + return item; + }) + }) + }) + .catch((error) => { + enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); + }) + } + + // Generate the every row of the table + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + + return ( + + *': { borderBottom: 'unset' } }}> + + setOpen(!open)} + > + {open ? : } + + + {row.code} + {row.atc_code} + {row.name} + {row.category_name} + {row.uom} + {/* {row.items_count} */} + {( row.status == 'active' ? + : + + )} + + {/* COLLAPSIBLE ROW */} + + + + + + Detail + + + + + Description + + + : {row.description ?? '-'} + + + General Indication + + + : {row.general_indication ?? '-'} + + + Composition + + + : {row.composition ?? '-'} + + + + + + + Kategori Obat + + + : {row.kategori_obat ?? '-'} + + + BPOM Registration + + + : {row.bpom_registration ?? '-'} + + + Classifications + + + : {row.classifications ?? '-'} + + + Cat For + + + : {row.cat_for ?? '-'} + + + Class + + + : {row.class ?? '-'} + + + Manufacturer + + + : {row.manufacturer ?? '-'} + + + + + + + + + + ); + } + + const loadDataTableData = async (appliedFilter : any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/corporates/'+corporate_id+'/formulariums', { params: filter }); + // console.log(response.data); + setDataTableLoading(false); + + setDataTableData(response.data); + } + + const headStyle = { + fontWeight: 'bold', + }; + + const applyFilter = async (searchFilter: any) => { + await loadDataTableData(searchFilter); + setSearchParams(searchFilter); + } + + const handlePageChange = (event : ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); + loadDataTableData(filter); + setSearchParams(filter); + } + + + useEffect(() => { + loadDataTableData(); + }, []) + + return ( + + + + + + + {/* The Main Table */} + +
+ + + + Code + ATC Code + Name + Category Name + UOM + Status + + + {dataTableIsLoading ? + ( + + + Loading + + + ) : ( + dataTableData.data.length == 0 ? + ( + + + No Data + + + ) : ( + + {dataTableData.data.map(row => ( + + ))} + + ) + )} +
+
+ +
+
+ ); +} diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/List.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/List.tsx index 64bc80c2..9326d0bb 100644 --- a/frontend/dashboard/src/pages/Corporates/Formularium/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Formularium/List.tsx @@ -1,5 +1,5 @@ // @mui -import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Input, Grid } from '@mui/material'; +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Grid, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; @@ -8,23 +8,307 @@ import CancelIcon from '@mui/icons-material/Cancel'; // hooks import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; -import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; // components import axios from '../../../utils/axios'; -import { CorporatePlan } from '../../../@types/corporates'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; +import { Icd } from '../../../@types/diagnosis'; import BasePagination from '../../../components/BasePagination'; -import { enqueueSnackbar } from 'notistack'; - -export default function PlanList() { +export default function List() { + const navigate = useNavigate(); const { themeStretch } = useSettings(); const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); - const navigate = useNavigate(); + const [importResult, setImportResult] = useState(null); + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? '' + setSearchText(newSearchText); + } + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch(searchText); // Trigger to Parent + } + + useEffect(() => { // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null) + const [currentImportFileName, setCurrentImportFileName] = useState(null) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected') + } + } + + const handleCancelImportButton = () => { + importForm.current.value = ""; + importForm.current.dispatchEvent(new Event("change", { bubbles: true })); + } + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name) + } else { + setCurrentImportFileName(null); + } + } + + const handleFormulariumList = async (appliedFilter = null) => { + axios.get(`corporates/${corporate_id}/formulariums/list`).then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + enqueueSnackbar('Download Success', { variant: 'succes' }) + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + ; + } + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append("file", importForm.current?.files[0]) + axios.post(`corporates/${corporate_id}/formulariums/import`, formData ) + .then(response => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data) + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }) + } + } + + return ( +
+ + {( !currentImportFileName && + + {/*

kjasndkjandskjasndkjansdkjansd

*/} + + + {/* {navigate(`/master/formularium/create/${formularium_template_id}`)} }>Create */} + Import + {handleGetTemplate('master-formularium-corporate')}}>Download Template + Download Formularium + +
+ )} + + {( currentImportFileName && + + + + + + + + )} + {( importResult && + + Last Import Result Report : {importResult.result_file?.name ?? "-"} + + )} +
+ ); + } + + // Called on every row to map the data to the columns + function createData( icd: Icd ): Icd { + return { + ...icd, + } + } + + // Generate the every row of the table + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + + return ( + + *': { borderBottom: 'unset' } }}> + + setOpen(!open)} + > + {open ? : } + + + {row.code} + {row.atc_code} + {row.name} + {row.category_name} + {row.uom} + {row.active} + + {/* + */} + + {/* COLLAPSIBLE ROW */} + + + + + + Detail + + + + + Description + + + : {row.description ?? '-'} + + + General Indication + + + : {row.general_indication ?? '-'} + + + Composition + + + : {row.composition ?? '-'} + + + + + + + Kategori Obat + + + : {row.kategori_obat ?? '-'} + + + BPOM Registration + + + : {row.bpom_registration ?? '-'} + + + Classifications + + + : {row.classifications ?? '-'} + + + Cat For + + + : {row.cat_for ?? '-'} + + + Class + + + : {row.class ?? '-'} + + + Manufacturer + + + : {row.manufacturer ?? '-'} + + + + + + + + + + ); + } // Dummy Default Data const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableLastRequest, setDataTableLastRequest] = useState(0); + const [dataTableResponseState, setDataTableResponseState] = useState('idle'); const [dataTableData, setDataTableData] = useState({ current_page: 1, data: [], @@ -39,169 +323,12 @@ export default function PlanList() { to: 0, total: 0 }); - - - function SearchInput(props: any) { - // SEARCH - const searchInput = useRef(null); - // const filterForm = useRef(); - const [searchText, setSearchText] = useState(""); - const [searchStatus, setSearchStatus] = useState("active"); - - const handleSearchChange = (event: any) => { - const newSearchText = event.target.value ?? '' - setSearchText(newSearchText); - } - - const handleStatusChange = (event: any) => { - const newSearchStatus = event.target.value ?? '' - console.log('changing to', newSearchStatus) - setSearchStatus(newSearchStatus) - // console.log(searchStatus); - - const searchFilter = { - "search" : searchText, - "status" : newSearchStatus - }; - - props.onSearch(searchFilter); - } - - const handleSubmit = (event?: any) => { - event?.preventDefault(); - const searchFilter = { - "search" : searchText, - "status" : searchStatus - }; - - props.onSearch(searchFilter); // Trigger to Parent - } - - useEffect(() => { - setSearchText(searchParams.get('search') ?? ''); - setSearchStatus(searchParams.get('status') ?? searchStatus ?? 'active'); - }, [searchParams]) - - return ( -
- - - - - - - - - {/* ITS FUCKING MAGIC, SUBMIT BY ENTER WORKING IF THIS BUTTON IS AVAILABLE */} - - -
- ); - } - - // Called on every row to map the data to the columns - function createData( plan: CorporatePlan ): CorporatePlan { - return { - ...plan, - } - } - - const handleInactiveAction = (formularium : any) => { - enqueueSnackbar('Fuck yuo'), { variant: 'error' }; - axios - .put('/corporates/'+corporate_id+'/formulariums/'+formularium.id+'/activate') - .then(() => { - setDataTableData( - { - ...dataTableData, - data: dataTableData.data.map((item: any) => { - if (item.id === formularium.id) { - return { - ...item, - status: 'active' - } - } - - return item; - }) - }) - }) - .catch((error) => { - console.log(error) - enqueueSnackbar(error.data?.message ?? (error.message ?? 'Failed Processing Request'), { variant: 'error' }); - }) - } - - const handleActiveAction = (formularium : any) => { - axios - .put('/corporates/'+corporate_id+'/formulariums/'+formularium.id+'/deactivate') - .then(() => { - setDataTableData( - { - ...dataTableData, - data: dataTableData.data.map((item: any) => { - if (item.id === formularium.id) { - return { - ...item, - status: 'inactive' - } - } - - return item; - }) - }) - }) - .catch((error) => { - enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); - }) - } - - // Generate the every row of the table - function Row(props: { row: ReturnType }) { - const { row } = props; - const [open, setOpen] = React.useState(false); - - return ( - - *': { borderBottom: 'unset' } }}> - {row.id} - {row.code} - {row.name} - {row.items_count} - {( row.status == 'active' ? - : - - )} - - {/* COLLAPSIBLE ROW */} - - - - - - No Extra Data - - - - - - - ); - } + const [dataTablePage, setDataTablePage] = useState(5); const loadDataTableData = async (appliedFilter : any | null = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/corporates/'+corporate_id+'/formulariums', { params: filter }); + const response = await axios.get(`corporates/${corporate_id}/formulariums`, { params: filter }); // console.log(response.data); setDataTableLoading(false); @@ -212,9 +339,9 @@ export default function PlanList() { fontWeight: 'bold', }; - const applyFilter = async (searchFilter: any) => { - await loadDataTableData(searchFilter); - setSearchParams(searchFilter); + const applyFilter = async (searchFilter: string) => { + await loadDataTableData({ "search" : searchFilter }); + setSearchParams({ "search" : searchFilter }); } const handlePageChange = (event : ChangeEvent, value: number) => { @@ -223,28 +350,26 @@ export default function PlanList() { setSearchParams(filter); } - useEffect(() => { loadDataTableData(); }, []) return ( - - - - + {/* The Main Table */} - # + Code + ATC Code Name - Total Item - Status + Category Name + UOM + Status {dataTableIsLoading ? @@ -265,13 +390,14 @@ export default function PlanList() { ) : ( {dataTableData.data.map(row => ( - + ))} ) )}
+
diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/CategoryDetail.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/CategoryDetail.tsx new file mode 100644 index 00000000..8e2d1dd4 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/CategoryDetail.tsx @@ -0,0 +1,229 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Grid, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import { LoadingButton } from "@mui/lab"; +import { CachedOutlined, FindInPageOutlined } from '@mui/icons-material'; +// hooks +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../../hooks/useSettings'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +// components +import axios from '../../../../utils/axios'; +import Label from '@/components/Label'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import InfoDetail from "./InfoDetail"; +import { DetailCorpFormularium } from "./Types"; +import DialogUpdateStatus from '@/components/DialogUpdateStatus' +import { RHFSelect, FormProvider } from '@/components/hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; +import * as Yup from 'yup'; +import { CorporateFormulariumList } from "./Types"; + +type ParamsDetail = { + props: DetailCorpFormularium, + formularium: CorporateFormulariumList, +} + +export default function CategoryDetail({props, formularium} : ParamsDetail) { + + type FormValuesProps = { + value: string; + active: boolean; + }; + const { corporate_id } = useParams(); + const [open, setOpen] = React.useState(false); + const [isDialogOpen, setDialogOpen] = useState(false) + let titles = { + name: 'Update Status', + icon: '-' + } + const [dataValue, setDataValue] = useState(null); + const [dataDescription, setDescriptionValue] = useState(''); + const [url, setUrl] = useState(''); + + const handleActivate = (isOpen: boolean, dataValue: CorporateFormulariumList) => { + console.log(dataValue) + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this formularium ?') + setUrl(url) + }; + + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema) + }) + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const onSubmit = async (row : any) => { + try { + handleUpdate(dataValue?.active, dataValue?.id, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + + const handleUpdate = (active: string, id: number, reason: string) => { + if (active == "Active") { + active = "0" + } else { + active = "1" + } + axios + .put(`/corporates/${corporate_id}/formulariums-update-status/${id}`, { + active: active, + }) + .then((res) => { + console.log(res.data.message) + window.location.reload(); + }); + } + + const getContent = () => ( + <> + + Are you sure to {dataValue?.active === "Active" ? 'inactive' : 'active'} this Formularium ? + + + + + Formularium Name + + + {dataValue?.category} + + + + + Reason for Update + + + + + + + + + + + + {dataValue?.active == "Active" ? + + Inactive + : + + Active + + } + + + + + + + ); + + return ( + + + + + {props.code} + {props.name} + + {formularium.active == "Active" ? ( + + ): ( + + )} + + + + setOpen(!open)}> + + Detail + + handleActivate(true, { + id: formularium.id, + formulaurium_category_id: formularium.formulaurium_category_id, + category: formularium.category, + description: formularium.description, + active: formularium.active + }) + }> + + Update Status + + + } /> + + + + + + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/CategoryRow.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/CategoryRow.tsx new file mode 100644 index 00000000..d18d77d2 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/CategoryRow.tsx @@ -0,0 +1,82 @@ +import TableMoreMenu from "@/components/table/TableMoreMenu" +import { FindInPageOutlined } from "@mui/icons-material" +import HistoryIcon from '@mui/icons-material/History'; +import { Collapse, Grid, MenuItem, Paper, Table, TableCell, TableContainer, TableHead, TableRow } from "@mui/material" +import React, { useEffect } from "react"; +import CategoryDetail from "./CategoryDetail"; +import { CorporateFormulariumList, DetailCorpFormularium, RespDetailFormularium } from "./Types"; +import axios from "@/utils/axios"; +import { useNavigate, useParams } from "react-router-dom"; + +const CategoryRow: React.FC = (props) => { + const [open, setOpen] = React.useState(false); + const { corporate_id } = useParams(); + const navigate = useNavigate(); + + const [dataTableIsLoading, setDataTableLoading] = React.useState(true); + const [dataTableData, setDataTableData] = React.useState(null) + const [dataRow, setDataRow] = React.useState(null) + + const loadDataTableData = async (formulaurium_category_id: number) => { + setDataTableLoading(true); + const resp = await axios.get(`/corporates/${corporate_id}/formulariums/${formulaurium_category_id}`); + console.log(resp.data); + setDataTableLoading(false); + setDataTableData(resp.data); + setDataRow(resp.data.data); + } + + return ( + + + + {props.category} + {props.description} + + + { loadDataTableData(props.formulaurium_category_id); setOpen(!open)}}> + + Detail + + navigate(`/corporates/${corporate_id}/formulariums/${props.id}/history`)}> + + History + + + } /> + + + + + + + + + + + Code + Name + Status + + + + {dataTableIsLoading ? ( + Loading + ) : dataTableData?.data.length == 0 ? ( + No Data + ) : ( + dataRow?.map(item => ( + + )) + )} +
+
+
+
+
+
+ ) +} + +export default CategoryRow \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/CreateForm.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/CreateForm.tsx new file mode 100644 index 00000000..28199ab3 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/CreateForm.tsx @@ -0,0 +1,54 @@ +import { Card, Grid } from '@mui/material'; +import { useParams } from 'react-router-dom'; +import HeaderBreadcrumbs from '../../../../components/HeaderBreadcrumbs'; +import Page from '../../../../components/Page'; +import useSettings from '../../../../hooks/useSettings'; +import CorporateTabNavigations from '../../CorporateTabNavigations'; + +import { useContext, useEffect, useState } from 'react'; +import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import { Corporate } from '@/@types/corporates'; +import CorporateFormulariumCreateForm from "./Form" + + +export default function CorporateFormulariumCreate() { + const { themeStretch } = useSettings(); + + const { corporate_id } = useParams(); + + const [corporate, setCorporate] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + }, [configuredCorporateContext]); + + return( + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/Form.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/Form.tsx new file mode 100644 index 00000000..b7f067c2 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/Form.tsx @@ -0,0 +1,130 @@ +import * as Yup from 'yup'; +import { useForm } from "react-hook-form"; +import { FormProvider, RHFSelect } from "../../../../components/hook-form"; +import { Button, Card, Grid, Typography } from "@mui/material"; +import { Stack, fontWeight } from "@mui/system"; +import { useNavigate, useParams } from "react-router"; +import React, { useEffect, useMemo } from "react"; +import { DetailCorpFormularium } from "./Types"; +import axios from "@/utils/axios"; +import { LoadingButton } from "@mui/lab"; +import { enqueueSnackbar } from "notistack"; +import { yupResolver } from '@hookform/resolvers/yup'; + + +export default function CorporateFormulariumCreateForm() { + const navigate = useNavigate(); + const { corporate_id } = useParams(); + + const NewCorporaeFormulariumSchema = Yup.object().shape({ + id: Yup.string().required('required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporaeFormulariumSchema), + }); + + const onSubmit = async (data: any) => { + await axios + .post(`/corporates/${corporate_id}/formulariums`, data) + .then((res) => { + console.log(res.data.message) + enqueueSnackbar('Formularium created successfully', { variant: 'success'}) + }) + .then((res) => { + navigate(`/corporates/${corporate_id}/formulariums/`, { replace: true }) + }) + .catch(({ response }) => { + if (response.status === 422) { + for (const [key, value] of Object.entries(response.data.errors)) { + setError(key, {message: value[0]}); + enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); + } + } + else { + enqueueSnackbar('Create Failed: '+ response.data.message, { variant: "error"}) + } + }); + }; + + const { + setError, + handleSubmit, + formState: { isSubmitting } + } = methods; + + // Data Dummy + const options = ["Dummy 1", "Dummy 2", "Dummy 3"]; + + const [dataDropdownIsLoading, setDataDropdownLoading] = React.useState(true); + const [dataDropdownData, setDataDropdownData] = React.useState(null) + const loadDataDropdown = async () => { + setDataDropdownLoading(true); + const resp = await axios.get(`corporates/${corporate_id}/formulariums-create`); + console.log(resp.data); + setDataDropdownLoading(false); + + setDataDropdownData(resp.data.data) + }; + + useEffect(() => { + loadDataDropdown(); + }, []) + + return ( + + + + + Formularium Name* + + + ))} + + + + + + + + + Create + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/History.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/History.tsx new file mode 100644 index 00000000..95f83d2c --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/History.tsx @@ -0,0 +1,218 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + Container, + FormControl, + Grid, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Stack, + } from '@mui/material'; + import * as React from 'react'; + import { useParams } from 'react-router-dom'; + import { styled } from '@mui/material/styles'; + import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; + import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; + import { useContext, useEffect, useState } from 'react'; + import MuiAccordionSummary, { + AccordionSummaryProps, + } from '@mui/material/AccordionSummary'; + import useSettings from '../../../../hooks/useSettings'; + import axios from '../../../../utils/axios'; + import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; + import MuiAccordionDetails from '@mui/material/AccordionDetails'; + import HeaderBreadcrumbs from '../../../../components/HeaderBreadcrumbs'; + import { Corporate } from '@/@types/corporates'; + import { fDate, fDateTime } from '@/utils/formatTime'; + + const Accordion = styled((props: AccordionProps) => ( + + ))(({ theme }) => ({ + border: `1px solid ${theme.palette.divider}`, + '&:not(:last-child)': { + borderBottom: 0, + }, + '7:before': { + display: 'none', + }, + })); + + const AccordionSummary = styled((props: AccordionSummaryProps) => ( + } + {...props} + /> + ))(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' + ? 'rgba(255,255,255, .85)' + : 'rgba(0,0,0, .03)', + flexDirection: 'row-reverse', + '& .MuiAccordionSummary-expandIconWrapper.Mui-expanded' : { + transform: 'rotate(90deg)', + }, + '& .MuiAccordionSummary-content': { + marginLeft: theme.spacing(1), + }, + })); + + const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ + padding: theme.spacing(2), + borderTop: '1px solid rgba(0, 0, 0, .125)', + })); + + export default function CustomizedAccordions() { + const [expanded, setExpanded] = React.useState('panel1'); + + const handleChange = (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + + const pageTitle = 'Corporate Formularium History' + const { id } = useParams(); + const { corporate_id } = useParams(); + const [corporate, setCorporate] = useState(); + const [currentCorporate, setCurrentCorporate] = useState(); + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\CorporateFormularium'; + const url = `/audittrail/${id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentCorporate(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan', error) + }); + }, [configuredCorporateContext]); + + return ( +
+ + {currentCorporate?.data.map((item, index) => ( + + + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + + + + + + + Field + Old Value + New Value + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'deleted_by' || + key === 'deleted_at' || + key === 'created_by' || + key === 'created_at' || + key === 'updated_by' || + key === 'description' + ) { + return null; // Melewati iterasi saat key adalah 'deleted_by' + } + switch (key) { + case 'welcome_message': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'help_text': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'active': + renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; + value = value == 1 ? 'Active' : 'Inactive'; + break; + case 'created_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'delete_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + + const field = key.charAt(0).toUpperCase() + key.slice(1); + if (value == renderedValue) { + return null + } else { + return ( + + {`${field}`} + {`${value}`} + {renderedValue} + + ); + } + })} + +
+
+
+
+ ))} +
+ ); + } \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/InfoDetail.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/InfoDetail.tsx new file mode 100644 index 00000000..78b0325a --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/InfoDetail.tsx @@ -0,0 +1,48 @@ +import { Collapse, TableCell, TableRow, Card, Box, Grid, Typography } from "@mui/material"; +import { DetailCorpFormularium } from "./Types"; + + + +export default function InfoDetail(props: DetailCorpFormularium) { + + + return( + + + + + Detail + + Description + : {props.description} + + General Indication + : {props.general_indication} + + Composition + : {props.composition} + + Kategori Obat + : {props.kategori_obat} + + BPOM Registration + : {props.bpom_registration} + + Classification + : {props.classifications} + + Cat For + : {props.cat_for} + + Class + : {props.class} + + Manufacturer + : {props.manufacturer} + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/List.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/List.tsx new file mode 100644 index 00000000..0e880864 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/List.tsx @@ -0,0 +1,179 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Grid, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +// hooks +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../../hooks/useSettings'; +import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; +// components +import axiosInstance from '../../../../utils/axios'; +import axios from '../../../../utils/axios'; +import { LaravelPaginatedData } from '../../../../@types/paginated-data'; +import BasePagination from '../../../../components/BasePagination'; +import CategoryRow from './CategoryRow' +import {CorporateFormulariumList} from "./Types"; + + +export default function List() { + const navigate = useNavigate(); + const { corporate_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const [dataRow, setDataRow] = useState(null); + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = React.useState(true); + const [dataTableData, setDataTableData] = React.useState({ + current_page: 1, + data: [], + path: '', + first_page_url: '', + last_page: 1, + last_page_url: '', + next_page_url: '', + prev_page_url: '', + per_page: 10, + from: 0, + to: 0, + total: 0, + }); + + // Load Data + const loadDataTableData = async (appliedFilter: any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const resp = await axios.get(`/corporates/${corporate_id}/formulariums`, {params: filter}); + setDataTableLoading(false); + setDataTableData(resp.data); + setDataRow(resp.data.data); + } + + const applyFilter = async (searchFilter: any) => { + await loadDataTableData({ search: searchFilter }); + setSearchParams({ search: searchFilter }); + console.log("here") + }; + + const handlePageChange = (event: ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + } + + useEffect(() => { + loadDataTableData(); + console.log(dataTableData); + console.log(dataRow); + }, []); + + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? '' + setSearchText(newSearchText); + } + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch(searchText); // Trigger to Parent + } + + useEffect(() => { // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } + + function SearchCreate(props: any) { + return ( +
+ + + + +
+ ) + } + + const headStyle = { + fontWeight: 'bold', + }; + + return( + + + + + {/* The Main Table */} + + + + + + Formularium Name + Description + + + + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length == 0 ? ( + + + + No Data + + + + ) : ( + + {dataRow?.map(item => ( + + ))} + + )} +
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/StatusUpdateDialog.tsx b/frontend/dashboard/src/pages/Corporates/Formularium/New/StatusUpdateDialog.tsx new file mode 100644 index 00000000..e69de29b diff --git a/frontend/dashboard/src/pages/Corporates/Formularium/New/Types.ts b/frontend/dashboard/src/pages/Corporates/Formularium/New/Types.ts new file mode 100644 index 00000000..6ff00159 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Formularium/New/Types.ts @@ -0,0 +1,57 @@ +export type CorporateFormularium = { + current_page: number + data: CorporateFormulariumList[] + first_page_url: string + from: number + last_page: number + last_page_url: string + links: CorporateFormulariumPaginationLinks[] + next_page_url: any + per_page: number + total: number +} + +export type CorporateFormulariumList = { + id: number + formulaurium_category_id: number + category: string + description: string + active: string +}; + +export type CorporateFormulariumPaginationLinks = { + url?: string + label: string + active: boolean +} + +export type RespDetailFormularium = { + status: number + message: string + data: DetailCorpFormularium[] +} + +export type DetailCorpFormularium = { + id: number + code: string + name: string + description: string + manufacturer: string + category_name: string + kategori_obat: string + uom: string + general_indication: string + composition: string + atc_code: string + class: string + bpom_registration: string + classifications: string + cat_for: string + created_at: string + updated_at: string + deleted_at: any + created_by: number + updated_by: number + deleted_by: any + formularium_template_id: number +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/History.tsx b/frontend/dashboard/src/pages/Corporates/History.tsx index f657b5ab..777d52e8 100644 --- a/frontend/dashboard/src/pages/Corporates/History.tsx +++ b/frontend/dashboard/src/pages/Corporates/History.tsx @@ -121,11 +121,11 @@ export default function CustomizedAccordions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Audittrail Corporate', - href: '/corporate/' + corporate_id + '/plans', + href: '/corporates/' + corporate_id + '/plans', }, ]} /> @@ -139,7 +139,7 @@ export default function CustomizedAccordions() { aria-controls={`panel${index}d-content`} id={`panel${index}d-header`} > - {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} @@ -157,12 +157,13 @@ export default function CustomizedAccordions() { } switch (key) { case 'welcome_message': - renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); - value = value.replace(/<[^>]*>/g, ''); + // renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + renderedValue = item.new_values[key]; + value = value; break; case 'help_text': - renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); - value = value.replace(/<[^>]*>/g, ''); + renderedValue = item.new_values[key]; + value = value; break; case 'active': renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx index d4ad3ea9..b975c1ca 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/CreateUpdate.tsx @@ -1,64 +1,63 @@ - import { useNavigate, useParams } from "react-router-dom"; import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; import Page from "../../../components/Page"; import useSettings from "../../../hooks/useSettings"; -import { useEffect, useMemo, useState } from 'react'; -import axios from '../../../utils/axios'; -import { useSnackbar } from 'notistack'; -import CorporatePlanForm from './Form'; -import { CorporatePlan } from '../../../@types/corporates'; +import { useContext, useEffect, useMemo, useState } from 'react'; +import CorporateHospitalForm from './Form'; +import { Hospital } from '../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { Stack, Typography } from '@mui/material'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; -export default function PlanCreate() { - const { themeStretch } = useSettings(); +export default function HospitalCreate() { const { corporate_id, id } = useParams(); - const [ currentCorporatePlan, setCurrentCorporatePlan ] = useState(); const navigate = useNavigate(); + const [corporate, setCorporate] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + const isEdit = !!id; useEffect(() => { - if (isEdit) { - axios.get('/corporates/'+corporate_id+'/divisions/'+id+'/edit') - .then((res) => { - setCurrentCorporatePlan(res.data); - }) - .catch((err) => { - if (err.response.status === 404) { - navigate('/404'); - } - }) - } - }, [corporate_id, id]); + setCorporate(configuredCorporateContext.currentCorporate); + }, [corporate_id, id, configuredCorporateContext]); return ( - - - - + + {isEdit ? ( + + navigate(-1)}/> + Edit Hospital + + ) : ( + + )} + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx index 2e088d92..b0d708bf 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/Form.tsx @@ -1,129 +1,171 @@ -import * as Yup from 'yup'; -import { LoadingButton } from "@mui/lab"; -import { Card, Grid, Stack, Typography } from "@mui/material"; -import { CorporatePlan } from "../../../@types/corporates"; -import { FormProvider, RHFSwitch, RHFTextField } from "../../../components/hook-form"; -import { useEffect, useMemo } from 'react'; -import { useForm } from 'react-hook-form'; -import { yupResolver } from '@hookform/resolvers/yup'; +import { Button, Card, Grid, Stack, Typography, FormControl, InputLabel, Select, FormHelperText, MenuItem } from "@mui/material"; +import { useEffect, useMemo, useState } from 'react'; import { useSnackbar } from 'notistack'; import { useNavigate, useParams } from 'react-router-dom'; import axios from '../../../utils/axios'; type Props = { isEdit: boolean; - currentCorporatePlan?: CorporatePlan; }; -export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Props) { +export default function CorporateHospitalForm({ isEdit }: Props) { const { enqueueSnackbar } = useSnackbar(); const navigate = useNavigate(); - const { corporate_id } = useParams(); - - const NewCorporatePlanSchema = Yup.object().shape({ - name: Yup.string().required('Name is required'), - code: Yup.string().required('Corporate Code is required'), - }); - - const defaultValues = useMemo( - () => ({ - name: currentCorporatePlan?.name || '', - code: currentCorporatePlan?.code || '', - active: currentCorporatePlan?.active === 1 ? true : false, - }), - [currentCorporatePlan] - ); + const { corporate_id, id, organization_id } = useParams(); + const [dataHospital, setDataHospital] = useState(null); + let idHospital = organization_id && isEdit ? organization_id : 0; + const [indexData, setIndexData] = useState(idHospital); + const [updateData, setUpdateData] = useState(null); + const [dataDefault, setDataDefault] = useState(null); useEffect(() => { - if (isEdit && currentCorporatePlan) { - reset(defaultValues); + axios.get('/corporates/' + corporate_id + '/hospitals/data') + .then((res) => { + setDataHospital(res.data); + const data = { + corporate_id : corporate_id ? corporate_id : null, + organization_id : res.data[0] ? res.data[0].id : null, + code : res.data[0] ? res.data[0].code : null, + name : res.data[0] ? res.data[0].name : null, + } + setDataDefault(data); + }) + + }, [isEdit]); + + const [addData, setAddData] = useState(dataDefault); + + const handlePageChange = (index:any) => { + setIndexData(index); + const data = { + corporate_id : corporate_id ? corporate_id : null, + organization_id : dataHospital ? dataHospital[index].id : null, + code : dataHospital ? dataHospital[index].code : null, + name : dataHospital ? dataHospital[index].name : null, } - if (!isEdit) { - reset(defaultValues); + setAddData(data); + + } + const handleSaveData = () => { + //Save data + axios + .post('/corporates/'+corporate_id+'/hospitals/save', (addData ? addData : dataDefault)) + .then((response) => { + if(response.data) + { + enqueueSnackbar('Data saved successfully', { variant: 'success' }); + } + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + + const handlePageChangeUpdate = (id: any) => { + setIndexData(id); + const foundData = dataHospital?.find(item => item.id === id); + const dataUpdate = { + corporate_id : corporate_id ? corporate_id : null, + organization_id : dataHospital ? foundData.id : null, + code : dataHospital ? foundData.code : null, + name : dataHospital ? foundData.name : null, } - }, [isEdit, currentCorporatePlan]); + setUpdateData(dataUpdate); + } - const methods = useForm({ - resolver: yupResolver(NewCorporatePlanSchema), - defaultValues, - }); - - const { - reset, - watch, - control, - setValue, - getValues, - setError, - handleSubmit, - formState: { isSubmitting }, - } = methods; - - - const onSubmit = async (data: any) => { - if (!isEdit) { - await axios - .post('/corporate/' + corporate_id + '/divisions', data) - .then((res) => { - enqueueSnackbar('Division created successfully', { variant: 'success' }); - }) - .then((res) => { - navigate('/corporate/' + corporate_id + '/divisions', { replace: true }); - }) - .catch(({ response }) => { - if (response.status === 422) { - for (const [key, value] of Object.entries(response.data.errors)) { - setError(key, { message: value[0] }); - enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); - } - } - else { - enqueueSnackbar('Create Failed : '+ response.data.message, { variant: 'error' }); + const handleUpdateData = () => { + //Update data + if(updateData) + { + axios + .put('/corporates/'+corporate_id+'/hospitals/'+id+'/edit', updateData) + .then((response) => { + if(response.data) + { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + navigate(-1); + window.history.replaceState(null, '', '/corporates/'+corporate_id+'/hospitals'); } + }) + .catch((error) => { + enqueueSnackbar('Failed to update data', { variant: 'error' }); }); - } else { - await axios - .put('/corporate/' + corporate_id + '/divisions/' + currentCorporatePlan?.id , data) - .then((res) => { - enqueueSnackbar('Division updated successfully', { variant: 'success' }); - }) - .then((res) => { - navigate('/corporate/' + corporate_id + '/divisions/' , { replace: true }); - }) - .catch(({ response }) => { - enqueueSnackbar('Update Failed : '+ response.data.message, { variant: 'error' }); - }); } - }; + else + { + enqueueSnackbar('Data has not changed.', { variant: 'error' }); + } + + } return ( - - - - - + + + + Hospital * + {dataHospital && dataHospital.length > 0 ? ( + isEdit ? ( + + + Hospital + + + + + ) : ( + + + Hospital + + + + + ) + ) : ( + + Loading + - Division Detail - - - - - - - { isEdit? 'Update' : 'Create' } - - - - - - - - - - - - - + )} + + + + {isEdit ? ( + + ):( + + )} + + + + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/History.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/History.tsx new file mode 100644 index 00000000..457a21c3 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Hospital/History.tsx @@ -0,0 +1,158 @@ +import { useNavigate, useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import { useContext, useEffect, useState } from 'react'; +import { Hospital } from '../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { + Stack, + Typography, + Card, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Collapse, + Box, + Tab, +} from '@mui/material'; +import axios from '@/utils/axios'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import { fDate, fDateTime } from '@/utils/formatTime'; + + + +export default function HospitalHistory() { + const { corporate_id, id } = useParams(); + const navigate = useNavigate(); + + const [corporate, setCorporate] = useState(); + + const [ currentHospital, setCurrentHospital ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\CorporateHospital'; + const url = `/audittrail/${id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentHospital(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + }, [corporate_id, id, configuredCorporateContext]); + + const [openRows, setOpenRows] = useState({}); + + const handleRowToggle = (index) => { + setOpenRows((prevOpenRows) => ({ + ...prevOpenRows, + [index]: !prevOpenRows[index], + })); + }; + + return ( + + + + + + {/* Condition Table Body */} + {currentHospital?.data.map((item, index) => ( + + + Data has {item.action} by {item.user_id} on {fDateTime(item.updated_at)} + + {openRows[index] ? ( + handleRowToggle(index)} /> + ) : ( + handleRowToggle(index)} /> + )} + + + + + {/* COLLAPSIBLE ROW */} + + +
+ + + + Field + + + Old Value + + + New Value + + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'code' || key === 'name') { + renderedValue = item.new_values[key]; + const field = key.charAt(0).toUpperCase() + key.slice(1); + return ( + + + {field ? field : '-'} + + + {value ? value : '-'} + + + {renderedValue ? renderedValue : ''} + + + ); + } + else + { + return null; + } + })} + +
+
+ + + + + ))} + + +
+
+ ); +} diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/Index.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/Index.tsx index ecea90a4..bbd1aa3f 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/Index.tsx @@ -1,32 +1,33 @@ -import { Card, Grid, Typography } from '@mui/material'; -import { useParams } from 'react-router-dom'; -import HeaderBreadcrumbs from '../../../components/HeaderBreadcrumbs'; -import Page from '../../../components/Page'; -import useSettings from '../../../hooks/useSettings'; -import CorporateTabNavigations from '../CorporateTabNavigations'; -import DivisionsList from './List'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { Card } from "@mui/material"; +import { useContext, useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import useSettings from "../../../hooks/useSettings"; +import CorporateTabNavigations from "../CorporateTabNavigations"; +import List from "./List"; -import { useContext, useEffect, useState } from 'react'; -import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; -import { Corporate } from '@/@types/corporates'; -export default function Divisions() { - const { themeStretch } = useSettings(); + +export default function hospitals() { const { corporate_id } = useParams(); - - const [corporate, setCorporate] = useState(); + + const [corporate, setCorporate] = useState(); const configuredCorporateContext = useContext(ConfiguredCorporateContext); useEffect(() => { setCorporate(configuredCorporateContext.currentCorporate); - }, [configuredCorporateContext]); + }, [configuredCorporateContext]) return ( - + + - Feature Not Implemented Yet + ); diff --git a/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx b/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx index fb019971..081c2c4b 100644 --- a/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Hospital/List.tsx @@ -1,124 +1,164 @@ // @mui -import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup } from '@mui/material'; -import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; -import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import { + Button, + Card, + IconButton, + MenuItem, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Stack, + Collapse, + Box, + FormControl, + InputLabel, + Select, + FormHelperText, + Menu, + ButtonGroup +} from '@mui/material'; import AddIcon from '@mui/icons-material/Add'; -import UploadIcon from '@mui/icons-material/Upload'; -import CancelIcon from '@mui/icons-material/Cancel'; // hooks -import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; -import useSettings from '../../../hooks/useSettings'; -import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; // components import axios from '../../../utils/axios'; -import { CorporatePlan } from '../../../@types/corporates'; +import { Hospital } from '../../../@types/corporates'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; import BasePagination from '../../../components/BasePagination'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; +import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import { enqueueSnackbar } from 'notistack'; +import Label from '../../../components/Label'; +import DownloadIcon from '@mui/icons-material/Download'; +import { LoadingButton } from '@mui/lab'; +import CancelIcon from '@mui/icons-material/Cancel'; +import UploadIcon from '@mui/icons-material/Upload'; -export default function PlanList() { - const { themeStretch } = useSettings(); +export default function HospitalList() { const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const navigate = useNavigate(); - + function SearchInput(props: any) { - // SEARCH + // SEARCH const searchInput = useRef(null); - const [searchText, setSearchText] = useState(""); + const [searchText, setSearchText] = useState(''); const handleSearchChange = (event: any) => { - const newSearchText = event.target.value ?? '' + const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); - } + }; const handleSubmit = (event: any) => { event.preventDefault(); props.onSearch(searchText); // Trigger to Parent - } + }; - useEffect(() => { - // console.log('Search Input: useEffect') + useEffect(() => { setSearchText(searchParams.get('search') ?? ''); - }, [searchParams]) + }, [searchParams]); return (
- + ); } // Called on every row to map the data to the columns - function createData( plan: CorporatePlan ): CorporatePlan { + function createData(hospital: Hospital): Hospital { return { - ...plan, - } + ...hospital, + }; } // Generate the every row of the table function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); + const style1 = { + color: '#637381' + } return ( - *': { borderBottom: 'unset' } }}> - - setOpen(!open)} - > - {open ? : } - + *': open ? {borderBottom: 'unset'} : {}, cursor: open ? 'pointer' : '' }} onClick={() => {if(open==true) setOpen(!open)}}> + {row.code ? row.code : '-'} + {row.name ? row.name : '-'} + + {row.active === 1 ? ( + + ) : ( + + )} + + + + setOpen(!open)}> + + Details + + handleEditData(row)}> + + Edit + + handleEditDataStatus(row)}> + + Update Status + + navigate ('/corporates/'+corporate_id+'/hospitals/'+row.id+'/history')}> + + History + + + } + /> - {row.id} - {row.code} - {row.name} - {row.description} - - {/* COLLAPSIBLE ROW */} - - + {if(open==true) setOpen(!open)}}> + - - - No Extra Data - - - {false && - - Rules - - - - - Date - Customer - Amount - Total price ($) - - - - {/* {row.history ? row.history.map((historyRow) => ( */} - - {row.start} - {row.end} - {row.start} - {row.start} - {row.start} - - {/* )) - : ( - - No Data - - ) - } */} - -
-
} + + + Detail + + + Code: + {row.code ? row.code : '-'} + + + Hospital Name: + {row.name ? row.name : '-'} + + + +
@@ -131,104 +171,390 @@ export default function PlanList() { const [dataTableData, setDataTableData] = React.useState({ current_page: 1, data: [], - path: "", - first_page_url: "", + path: '', + first_page_url: '', last_page: 1, - last_page_url: "", - next_page_url: "", - prev_page_url: "", + last_page_url: '', + next_page_url: '', + prev_page_url: '', per_page: 10, from: 0, to: 0, - total: 0 + total: 0, }); - const loadDataTableData = async (appliedFilter : any | null = null) => { + const loadDataTableData = async (appliedFilter: any | null = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/corporates/'+corporate_id+'/divisions', { params: filter }); - // console.log(response.data); + // Get Data Hospitals + const response = await axios.get('/corporates/' + corporate_id + '/hospitals', { + params: filter, + }); setDataTableLoading(false); - setDataTableData(response.data); - } - - const headStyle = { - fontWeight: 'bold', }; const applyFilter = async (searchFilter: any) => { - await loadDataTableData({ "search" : searchFilter }); - setSearchParams({ "search" : searchFilter }); - } + await loadDataTableData({ search: searchFilter }); + setSearchParams({ search: searchFilter }); + }; - const handlePageChange = (event : ChangeEvent, value: number) => { - const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); + const handlePageChange = (event: ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); loadDataTableData(filter); setSearchParams(filter); - } - + }; useEffect(() => { loadDataTableData(); - }, []) + }, []); + + //validation dialog + const [nameField, setNameField] = useState(''); + const [codeField, setCodeField] = useState(''); + // ID for edit data + const [idField, setIdField] = useState(''); + + const handleAddData = () => { + navigate('/corporates/'+corporate_id+'/hospitals/create'); + } + //Edit data + const handleEditData = (data : any) => { + navigate('/corporates/'+corporate_id+'/hospitals/edit/'+data.id+'/'+data.organization_id); + } + // End dialog for hospitals + + // Dialog for update status hospitals + const [openDialogStatus, setOpenDialogStatus] = useState(false); + const [activeField, setActiveField] = useState(0); + const [reasonUpdate,setReasonUpdate] = useState('Agreement changed'); + + const handleCloseDialogUpdate = () => { + setOpenDialogStatus(false); + setNameField(''); + setCodeField(''); + setIdField(''); + setActiveField(activeField); + } + + const handleSaveUpdateData = () => { + let activeValue = 0; + if(activeField === 1) + { + activeValue = 0; + } + else + { + activeValue = 1; + } + const updateData = { + reason: reasonUpdate, + active : activeValue, + id: idField, + }; + axios + .put('/hospitals/'+idField+'/activation', updateData) + .then((response) => { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + loadDataTableData(); + handleCloseDialogUpdate(); + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + + const handleEditDataStatus = (data: any) => { + setIdField(data.id); + setNameField(data.name); + setCodeField(data.code); + setActiveField(data.active); + setOpenDialogStatus(true); + } + // End dialog for update status devisions + + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importHospital = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); + const [importLoading, setImportLoading] = useState(false); + const [importResult, setImportResult] = useState(null); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + const handleImportButton = () => { + if (importHospital?.current) { + handleClose(); + importHospital.current ? importHospital.current.click() : console.log('No File selected'); + } else { + alert('No file selected'); + } + }; + const handleCancelImportButton = () => { + if(importHospital.current) + { + importHospital.current.value = ''; + importHospital.current.dispatchEvent(new Event('change', { bubbles: true })); + } +}; + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name); + } else { + setCurrentImportFileName(null); + } + }; + const handleUpload = () => { + if(importHospital.current && importHospital.current.files) + { + if (importHospital.current?.files.length) { + const formData = new FormData(); + formData.append('file', importHospital.current?.files[0]); + setImportLoading(true); + axios + .post('corporates/'+corporate_id+'/hospitals/import', formData) + .then((response) => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + setImportLoading(false); + enqueueSnackbar('Success Import Hospitals', { variant: 'success' }); + }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + setImportLoading(false); + }); + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }); + } + } +}; + const handleGetTemplate = () => { + axios.get('corporates/hospitals/download-template').then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }); + +}; + + + return ( + + {!currentImportFileName && ( - - - - + + + + + Create + + + Import + + { + handleGetTemplate(); + }} + > + Download Template + + {/* + Download ICD + */} + + )} + {currentImportFileName && ( + + + + + - + } + sx={{ p: 1.8 }} + onClick={handleUpload} + loading={importLoading} + > + Upload + + + )} + {importResult && ( + + + Last Import Result :{' '} + + {importResult.data.total_success_row ?? 0} + {' '} + Row Processed,{' '} + + {importResult.data.total_failed_row} + {' '} + Failed + {importResult.data.failed_rows.map((row, index) => ( + [Code={row.code ? row.code : 'Required'},Name={row.name ? row.name : 'Required'}] + ))} + + + )} + {/* The Main Table */} - + {/* Table Head */} + - - ID - Code - Name - Description + + Code + + + Hospital + + + Status + + + - - {dataTableIsLoading ? - ( - - - Loading - - - ) : ( - dataTableData.data.length == 0 ? - ( - - - No Data - - - ) : ( - - {dataTableData.data.map(row => ( - - ))} - - ) + + {/* Condition Table Body */} + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length == 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableData.data.map((row) => ( + + ))} + )}
- -
+ {/* Paginations */} + + + {/* Dialog Update Status */} + + + + + Update Status + + + + + + + + + Are you sure to {activeField == 1 ? 'Inactive' : 'Active'} this hospital ? + + + Code + {codeField} + + + Hospital Name + {nameField} + + + + + Reason for update* + + + Reason for update + + + + + + + + + + + +
); -} +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Corporates/Index.tsx b/frontend/dashboard/src/pages/Corporates/Index.tsx index 580600c5..d5c86350 100644 --- a/frontend/dashboard/src/pages/Corporates/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Index.tsx @@ -24,21 +24,33 @@ import { Typography, Badge, Stack, + Dialog, } from '@mui/material'; +import * as Yup from 'yup'; + + +// icon import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import PublishIcon from '@mui/icons-material/Publish'; import AddIcon from '@mui/icons-material/Add'; import HistoryIcon from '@mui/icons-material/History'; +import MoreVertIcon from '@mui/icons-material/MoreVert'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; // hooks import useSettings from '../../hooks/useSettings'; // components import Page from '../../components/Page'; +import DialogUpdateStatus from '../../components/DialogUpdateStatus'; import axios from '../../utils/axios'; import useAuth from '../../hooks/useAuth'; -import { Link, NavLink as RouterLink, useSearchParams } from 'react-router-dom'; -import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import { useForm } from 'react-hook-form' +import { Link, NavLink as RouterLink, useNavigate, useSearchParams } from 'react-router-dom'; +import React, { ChangeEvent, ReactElement, useEffect, useRef, useState } from 'react'; import { Theme, useTheme } from '@mui/material/styles'; import { Corporate } from '../../@types/corporates'; import { LaravelPaginatedData } from '../../@types/paginated-data'; @@ -47,10 +59,45 @@ import BasePagination from '../../components/BasePagination'; import { fCurrency } from '../../utils/formatNumber'; import { enqueueSnackbar } from 'notistack'; import { fDate } from '@/utils/formatTime'; +import Popover from '@mui/material/Popover'; + +import ButtonStyles from '../../theme/overrides/Button'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import Iconify from '@/components/Iconify'; +import Label from '@/components/Label'; +import { FormProvider, RHFSelect } from '@/components/hook-form'; +import { LoadingButton } from '@mui/lab'; +import { yupResolver } from '@hookform/resolvers/yup'; + export default function Corporates() { const { themeStretch } = useSettings(); const [searchParams, setSearchParams] = useSearchParams(); + const navigate = useNavigate() + + // Type + type DataContent = { + code: string; + name: string; + id: string; + status: string|number; + }; + + type MuiDialogProps = { + title?: { + name?: string; + icon?: string; + }; + openDialog: boolean; + setOpenDialog: Function; + content?: ReactElement; + data?: DataContent[]; + }; + + type FormValuesProps = { + value: string; + active: boolean; + }; // Called on every row to map the data to the columns function createData(corporate: Corporate): Corporate { @@ -58,6 +105,7 @@ export default function Corporates() { ...corporate, }; } + // Dummy Default Data const [dataTableIsLoading, setDataTableLoading] = React.useState(true); @@ -80,7 +128,7 @@ export default function Corporates() { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); const response = await axios.get('/corporates', { params: filter }); - // console.log(response.data); + console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); @@ -150,6 +198,8 @@ export default function Corporates() { typeof value === 'string' ? value.split(',') : value ); }; + + // END FILTER SELECT // Component Search Input @@ -181,7 +231,8 @@ export default function Corporates() { ref={searchInput} label="Search" variant="outlined" - fullWidth + // fullWidth + style={{ width: '85%' }} onChange={handleSearchChange} value={searchText} /> @@ -246,8 +297,8 @@ export default function Corporates() { Import */} - {/* */} @@ -262,75 +313,200 @@ export default function Corporates() { // Component Row // Generate the every row of the table + const [isDialogOpen, setDialogOpen] = useState(false) + let titles = { + name: 'Update Status', + icon: '-' + } + const [dataValue, setDataValue] = useState(); + const [dataDescription, setDescriptionValue] = useState(''); + + + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const onSubmit = async (row : any) => { + try { + console.log(dataValue) + handleUpdate(dataValue.id, dataValue.status, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + + const handleUpdate = (id: string, active: number, reason: string) => { + axios + .put(`/corporates/${id}/activation`, { + active: active, + reason: reason + }) + .then((res) => { + window.location.reload(); + }); + } + + + const getContent = () => ( + <> + + Are you sure to {dataValue?.status == 1 ? 'inactive' : 'active'} this service ? + + + + + Code + + + {dataValue?.code} + + + Corporate Name + + + {dataValue?.name} + + + + + + Reason for update* + + + + + + + + + + + + + + {dataValue?.status == 1 ? + + Inactive + + : + + Active + + + + } + + + + + + ); + function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); + const navigate = useNavigate() - const handleActivate = (model: any, status: string) => { - axios - .put(`/corporates/${row.id}/activation`, { - // service_code: service.service_code, - active: status == 'active', - }) - .then((res) => { - setDataTableData({ - ...dataTableData, - data: dataTableData.data.map((model) => { - let updatedModel = model; - if (row.id == model.id) { - updatedModel.active = res.data.corporate.active; - } - return updatedModel; - }), - }); - }) - .catch((error) => { - // console.log('asdasd', error.response.data.message) - enqueueSnackbar( - error.response.data.message ?? error.message ?? 'Failed Processing Request', - { variant: 'error' } - ); - }); + + const handleActivate = (isOpen: boolean, dataValue: DataContent) => { + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this coporate ?') }; return ( - *': { borderBottom: 'unset' } }}> + - setOpen(!open)}> + {/* setOpen(!open)}> {open ? : } - + */} {row.code} {row.name} {row.active == 1 && ( - + + // )} {row.active != 1 && ( - + + // )} - - + + {/*
)} @@ -412,17 +425,14 @@ export default function CorporatePlanList({handleSubmitSuccess}) { } const [columns, setColumns] = React.useState([ - { id: 'member_id', label: 'MemberID', minWidth: 100, align: 'left' }, - // { id: 'principal_id', label: 'Mapping ID', minWidth: 100, align: 'left' }, - // { id: 'nik', label: 'NIK', minWidth: 100, align: 'left' }, - // { id: 'current_policy.policy_number', label: 'Policy Number', minWidth: 100, align: 'left' }, - { id: 'effective_date', label: 'Effective Date', minWidth: 100, align: 'left' }, - { id: 'name', label: 'Name', minWidth: 100, align: 'left' }, - // { id: 'nric', label: 'NRIC', minWidth: 100, align: 'left' }, - // { id: 'email', label: 'E-mail', minWidth: 100, align: 'left' }, - { id: 'plan_id', label: 'PlanID', minWidth: 100, align: 'left' }, - { id: 'activation_date', label: 'Activation Date', minWidth: 100, align: 'left' }, - { id: 'termination_date', label: 'Termination Date', minWidth: 100, align: 'left' }, + { id: 'member_id', label: 'Member ID', minWidth: 100, align: 'left', width: '15%' }, + { id: 'effective_date', label: 'Effective Date', minWidth: 100, align: 'left', width: '15%' }, + { id: 'name', label: 'Name', minWidth: 100, align: 'left', width: '20%' }, + { id: 'plan_id', label: 'Plan', minWidth: 100, align: 'left', width: '10%' }, + { id: 'activation_date', label: 'Activation Date', minWidth: 100, align: 'left', width: '15%' }, + { id: 'termination_date', label: 'Termination Date', minWidth: 100, align: 'left', width: '15%' }, + {id: 'status', label: 'Status', minWidth: 100, align: 'left', width: '5%' }, + {id: 'action', label: '', minWidth: 100, align: 'left', width: '5%' }, ]); // Generate the every row of the table @@ -432,17 +442,9 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const [loadingLog, setLoadingLog] = React.useState(false); const [dialogLogOpen, setDialogLogOpen] = React.useState(false); - // useEffect(function () { - // if (row.full_name == 'Pajri') { - // setDialogLogOpen(true); - // console.log('fuck'); - // } - // }, []); - const handleActivate = (model: any, status: string) => { axios .put(`/members/${row.id}/activation`, { - // service_code: service.service_code, active: status == 'active', }) .then((res) => { @@ -458,284 +460,227 @@ export default function CorporatePlanList({handleSubmitSuccess}) { }); }) .catch((error) => { - // console.log('asdasd', error.response.data.message) enqueueSnackbar( error.response.data.message ?? error.message ?? 'Failed Processing Request', { variant: 'error' } ); }); }; + + const style1 = { + color: '#637381' + } return ( - *': { borderBottom: 'unset' } }}> - - setOpen(!open)}> - {open ? : } - + *': open ? {borderBottom: 'unset'} : {}, cursor: open ? 'pointer' : '' }} onClick={() => {if(open==true) setOpen(!open)}}> + + {row.member_id ? row.member_id : '-'} - - {row.member_id} - {row.members_effective_date} - {row.name} - {row.current_plan?.code} - {row.activation_date} - {row.terminated_date} - - {row.active == 1 && ( - - )} - {row.active != 1 && ( - + )} + - - - - - - + + + setOpen(!open)}> + + Details + + handleEditDataStatus(row)}> + + Update Status + + navigate ('/corporates/'+corporate_id+'/members/'+row.id+'/history')}> + + History + + + } + /> {/* COLLAPSIBLE ROW */} - - - + {if(open==true) setOpen(!open)}}> + - - Detail - - - - - Mapping ID - - - : {row.principal_id ?? '-'} - - - Policy Number - - - : {row.current_policy?.code ?? '-'} - - - NRIC - - - : {row.nric ?? '-'} - - - - NIK - - - : {row.employeds[0]?.nik ?? '-'} - - - Email - - - : {row.email ?? '-'} - - - Phone - - - : {row.person?.phone ?? '-'} - - - - - - - Birth Date - - - : {row.birth_date ?? '-'} - - - Gender - - - : {row.gender ?? '-'} - - - Marital Status - - - : {row.marital_status ?? '-'} - - - Language - - - : {row.language ?? '-'} - - - Race - - - : {row.race ?? '-'} - - - Relationship - - - : {row.relation_with_principal ?? '-'} - - - - - Claim History - - - - - Requested - - - : {row.total_claims?.requested} - - - - Pending - - - : {row.total_claims?.received} - - - - Approved - - - : {row.total_claims?.approved} - - - - Declined - - - : {row.total_claims?.declined} - - - - Paid - - - : {row.total_claims?.paid} - - - - - File History - - - - - {row.file_mcu_names - ? row.file_mcu_names.split(',').map((fileName, index) => ( -
{fileName}
- )) - : '-'} -
-
-
-
- - - - } - // sx={{ p: 1.8 }} - // onClick={() => {handleDownloadLog(row)}} - onClick={() => { - setDialogLogOpen(true); - }} - loading={loadingLog} - > - Download LOG - + + + Detail + + + Mapping ID: + {row.principal_id ? row.principal_id : '-'} + Birth Date: + {row.birth_date ? row.birth_date : '-'} - {/* -------------------------------Upload Dokumen MCU------------------------------- */} - - {/*} - spacing={1} - sx={{ marginY: 2}} - > - {fileMcus && - fileMcus - .filter((datas) => datas.id === row.id) - .map((datas, index) => ( - - {datas.file.name} - { - removeMcuFiles(datas.id, index); - }} - sx={{ cursor: 'pointer' }} - > - - ))} - */} - { - handleMcuInputChange(row.id, row.member_id)(event); - }} - accept="application/pdf" - /> - { - fileMcuInput.current.click(); - }} - > - - Add Result - + + Policy Number: + {row.current_policy?.code ? row.current_policy?.code : '-'} + Gender: + {row.gender ? row.gender : '-'} - + + NRIC: + {row.nric ? row.nric : '-'} + Marital Status: + {row.marital_status ? row.marital_status : '-'} + + + NIK: + {row.employeds[0]?.nik ? row.employeds[0]?.nik : '-'} + Language: + {row.language ? row.language : '-'} + + + Email: + {row.email ? row.email : '-'} + Race: + {row.race ? row.race : '-'} + + + Phone Number: + {row.person?.phone ? row.person?.phone : '-'} + Relationship: + {row.relation_with_principal ? row.relation_with_principal : '-'} + +
+ Claim History + + + Requested: + {row.total_claims?.requested ? row.total_claims?.requested : '-'} + + + Pending: + {row.total_claims?.received ? row.total_claims?.received : '-'} + + + Approved: + {row.total_claims?.approved ? row.total_claims?.approved : '-'} + + + Declined: + {row.total_claims?.declined ? row.total_claims?.declined : '-'} + + + Paid: + {row.total_claims?.paid ? row.total_claims?.paid : '-'} + + + Files History + + + {row.file_mcu_names + ? row.file_mcu_names.split(',').map((fileName, index) => ( + <> + + + {fileName} + + + )) + : '-'} + + + + fileMcuInput.current?.click()}> + + + + Upload Result + + + { + handleMcuInputChange(row.id, row.member_id)(event); + }} + accept="application/pdf" + /> + + + + + + + + } + // sx={{ p: 1.8 }} + // onClick={() => {handleDownloadLog(row)}} + onClick={() => { + setDialogLogOpen(true); + }} + loading={loadingLog} + > + Download LOG + + + + + - - @@ -746,33 +691,73 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const headStyle = { fontWeight: 'bold', }; + const [reasonUpdate,setReasonUpdate] = useState('Agreement changed'); + const [nameUpdate, setNameUpdate] = useState(''); + const [memberIdUpdate, setMemberIdUpdate] = useState(''); + const [activeUpdate, setActiveUpdate] = useState(0); + const [idUpdate, setIdUpdate] = useState(''); + + const [openDialogStatus, setOpenDialogStatus] = useState(false); + + const handleCloseDialogUpdate = () => { + setNameUpdate(''); + setMemberIdUpdate(''); + setActiveUpdate(activeUpdate); + setIdUpdate(''); + setOpenDialogStatus(false); + } + + const handleSaveUpdateData = () => { + let activeValue = 0; + if(activeUpdate === 1) + { + activeValue = 0; + } + else + { + activeValue = 1; + } + const updateData = { + reason: reasonUpdate, + active : activeValue, + id: idUpdate, + }; + axios + .put('/members/'+idUpdate+'/activation', updateData) + .then((response) => { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + loadDataTableData(); + handleCloseDialogUpdate(); + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + + const handleEditDataStatus = (data:any) => { + setNameUpdate(data.name); + setMemberIdUpdate(data.member_id); + setActiveUpdate(data.active); + setIdUpdate(data.id); + setOpenDialogStatus(true); + } return ( - {/* The Main Table */} - + - {columns.map((column, index) => ( - - {column.label} + + {column.label} ))} - - Status - - - Action - - {/* - Action - */} + - + {dataTableIsLoading ? ( @@ -801,6 +786,62 @@ export default function CorporatePlanList({handleSubmitSuccess}) { + {/* Dialog Update Status */} + + + + + Update Status + + + + + + + + + Are you sure to {activeUpdate == 1 ? 'Inactive' : 'Active'} this member ? + + + Member ID + {memberIdUpdate} + + + Name + {nameUpdate} + + + + + Reason for update* + + + Reason for update + + + + + + + + + + + {isDialog === 'edit' && ( { axios - .put(`/members/${id}/activation`, { + .put(`/members/${memberId}/activation`, { // service_code: service.service_code, active: status == 'active', - reason: model.reason + reason: model.reason, + id: memberId, }) .then((res) => { // Memuat ulang halaman saat ini @@ -133,7 +136,7 @@ const DialogTopUpLimit = ({ title, openDialog, setOpenDialog, data }: MuiDialogP const data = { service_code : service_code, reason : row.reason, - id : id, + id : memberId, } handleActivate(data, status) } catch (error: any) { @@ -157,18 +160,18 @@ const DialogTopUpLimit = ({ title, openDialog, setOpenDialog, data }: MuiDialogP + Reason for update* - - - - - - + name="reason" + label="Reason for update" + > + + + + + + - diff --git a/frontend/dashboard/src/pages/Corporates/Plan/List.tsx b/frontend/dashboard/src/pages/Corporates/Plan/List.tsx index 01c015ca..2e3a8813 100644 --- a/frontend/dashboard/src/pages/Corporates/Plan/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Plan/List.tsx @@ -1,4 +1,5 @@ // @mui +import * as Yup from 'yup'; import { Box, Button, @@ -28,17 +29,22 @@ import { ButtonGroup, Grid, Tooltip, + Autocomplete, } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; +import SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; +import { Controller, useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; import HistoryIcon from '@mui/icons-material/History'; // hooks import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; -import { Link, useParams, useSearchParams } from 'react-router-dom'; +import { Form, useNavigate, Link, useParams, useSearchParams } from 'react-router-dom'; // components import axios from '../../../utils/axios'; import { Plan } from '../../../@types/corporates'; @@ -47,6 +53,14 @@ import BasePagination from '../../../components/BasePagination'; import { enqueueSnackbar } from 'notistack'; import { LoadingButton } from '@mui/lab'; import DialogLog from './sections/DialogLog'; +import { FormProvider, RHFSelect } from '@/components/hook-form'; +import { Download, Edit } from '@mui/icons-material'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import Label from '@/components/Label'; +import DialogUpdateStatus from '@/components/DialogUpdateStatus'; +import {Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; + export default function CorporatePlanList() { const { themeStretch } = useSettings(); @@ -54,6 +68,7 @@ export default function CorporatePlanList() { const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); + const navigate = useNavigate() const [openDialog, setOpenDialog] = useState(false); const [dialogTitle, setDialogTitle] = useState(''); const [isDialog, setIsDialog] = useState(''); @@ -69,6 +84,19 @@ export default function CorporatePlanList() { } }; + // filter + const defaultValue = [ + { + value: '-', + label: '-' + } + ]; + + const [serviceCode, setServiceCode] = useState(defaultValue); + const [type, setType] = useState(defaultValue); + const [code, setCode] = useState(defaultValue); + const [codePlan, setCodePlan] = useState(defaultValue); + function SearchInput(props: any) { // SEARCH const searchInput = useRef(null); @@ -85,7 +113,6 @@ export default function CorporatePlanList() { }; useEffect(() => { - // console.log('Search Input: useEffect') setSearchText(searchParams.get('search') ?? ''); }, [searchParams]); @@ -113,6 +140,8 @@ export default function CorporatePlanList() { const [currentImportFileName, setCurrentImportFileName] = useState(null); const [importLoading, setImportLoading] = useState(false); + const { control } = useForm(); + const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; @@ -195,6 +224,40 @@ export default function CorporatePlanList() { }) } + const handleFilter = (event: React.SyntheticEvent, newValue: { value: string, label: string }[], name:string) => { // + const serviceCodeArray :string[] = []; + const codeArray :string[] = []; + const typeArray :string[] = []; + const planArray :string[] = []; + if (name == 'service_code'){ + newValue.map(row => { + serviceCodeArray.push(row.value); + }) + } + if (name == 'code'){ + newValue.map(row => { + codeArray.push(row.value); + }) + } + if (name == 'type'){ + newValue.map(row => { + typeArray.push(row.value); + }) + } + if (name == 'plan'){ + newValue.map(row => { + planArray.push(row.value); + }) + } + let data = { + service_code : serviceCodeArray, + code : codeArray, + type : typeArray, + plan : planArray, + } + loadDataTableDataFilter(data) + } + return (
{!currentImportFileName && ( - + + + + + + + handleFilter(event, newValue, 'service_code')} + fullWidth + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => + option.value === value.value + } + + renderInput={(params) => ( + + )} + /> + + + handleFilter(event, newValue, 'plan')} + multiple + limitTags={1} + fullWidth + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => + option.value === value.value + } + renderInput={(params) => ( + + )} + /> + + + handleFilter(event, newValue, 'code')} + multiple + limitTags={1} + fullWidth + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => + option.value === value.value + } + renderInput={(params) => ( + + )} + /> + + + option.label} + isOptionEqualToValue={(option, value) => + option.value === value.value + } + onChange={(event, newValue) => handleFilter(event, newValue, 'type')} + renderInput={(params) => ( + + )} + /> + + + + + Import + {handleGetTemplate('plan-benefit')}}>Download Template + {handleGetData('data-plan-benefit')}}>Download Plans & Benefit + {setDialogDeleteOpen(true)}}>Delete All Import + + + + {/*

kjasndkjandskjasndkjansdkjansd

*/} - - - Import - {handleGetTemplate('plan-benefit')}}>Download Template - {handleGetData('data-plan-benefit')}}>Download Plans & Benefit - +
)} @@ -286,47 +429,51 @@ export default function CorporatePlanList() { }; } + type DataContent = { + code: string; + name: string; + id: number; + status: string|number; + }; + + type FormValuesProps = { + value: string; + active: boolean; + }; + // Generate the every row of the table + const [isDialogOpen, setDialogOpen] = useState(false) + let titles = { + name: 'Update Status', + icon: '-' + } + const [dataValue, setDataValue] = useState(''); + const [dataDescription, setDescriptionValue] = useState(''); + const [url, setUrl] = useState(''); + function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); - const handleActivate = (model: any, status: string) => { - axios - .put(`/plans/${row.id}/activation`, { - // service_code: service.service_code, - active: status == 'active', - }) - .then((res) => { - setDataTableData({ - ...dataTableData, - data: dataTableData.data.map((model) => { - let updatedModel = model; - if (row.id == model.id) { - updatedModel.active = res.data.plan.active; - } - return updatedModel; - }), - }); - }) - .catch((error) => { - // console.log('asdasd', error.response.data.message) - enqueueSnackbar( - error.response.data.message ?? error.message ?? 'Failed Processing Request', - { variant: 'error' } - ); - }); + const handleActivate = (isOpen: boolean, dataValue: DataContent) => { + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this service ?') + setUrl(url) }; - + return ( - *': { borderBottom: 'unset' } }}> - - setOpen(!open)}> + + {/* */} + {/* setOpen(!open)}> {open ? : } - + */} + {/* */} + + {row.service_code} - {row.service_code} + {row.corporate_plan_id} {row.code} {row.type} @@ -334,41 +481,27 @@ export default function CorporatePlanList() { {row.limit_rules} - {row.active == 1 && ( - - )} - {row.active != 1 && ( - - )} + {row.active == 1 ? + : + } - - - - - + + navigate(`/corporates/${corporate_id}/corporate-plans/${row.id}/edit`)}> + + Edit + + navigate(`/corporates/${corporate_id}/plans/${row.id}/history`)}> + + History + + handleActivate(true, {code: row.code, name: row.service_code, id:row.id, status: row.active})}> + + Update Status + + + } /> {/* COLLAPSIBLE ROW */} @@ -679,16 +812,153 @@ export default function CorporatePlanList() { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); const response = await axios.get('/corporates/' + corporate_id + '/plans', { params: filter }); - // console.log(response.data); + setDataTableLoading(false); setDataTableData(response.data); + + const data = response.data.data; + const serviceCodeArray :string[] = []; + const codeArray :string[] = []; + const typeArray :string[] = []; + const planArray :string[] = []; + + data.forEach((row: any) => { + if (!serviceCodeArray.includes(row.service_code)) { + serviceCodeArray.push(row.service_code); + } + + if (!codeArray.includes(row.code)) { + codeArray.push(row.code); + } + + if (!typeArray.includes(row.type)) { + typeArray.push(row.type); + } + + if (!planArray.includes(row.corporate_plan_id)) { + planArray.push(row.corporate_plan_id); + } + + }); + + const optionServiceCode = serviceCodeArray.map((value) => { + return { + value: value, + label: value + }; + }); + const optionCode = codeArray.map((value) => { + return { + value: value, + label: value + }; + }); + const optionType = typeArray.map((value) => { + return { + value: value, + label: value + }; + }); + const optionPlan = planArray.map((value) => { + return { + value: value, + label: value + }; + }); + + setServiceCode(optionServiceCode) + setType(optionType) + setCode(optionCode) + setCodePlan(optionPlan) + + }; + + const loadDataTableDataFilter = async (appliedFilter = null) => { + setDataTableLoading(true); + let filter = appliedFilter + + const response = await axios.post('/corporates/' + corporate_id + '/corporate-plans/filter',filter); + + setDataTableLoading(false); + + setDataTableData(response.data); + + const data = response.data.data; + const serviceCodeArray :string[] = []; + const codeArray :string[] = []; + const typeArray :string[] = []; + const planArray :string[] = []; + + // data.forEach((row: any) => { + // if (!serviceCodeArray.includes(row.service_code)) { + // serviceCodeArray.push(row.service_code); + // } + + // if (!codeArray.includes(row.code)) { + // codeArray.push(row.code); + // } + + // if (!typeArray.includes(row.type)) { + // typeArray.push(row.type); + // } + + // if (!planArray.includes(row.corporate_plan_id)) { + // planArray.push(row.corporate_plan_id); + // } + + // }); + + // const optionServiceCode = serviceCodeArray.map((value) => { + // return { + // value: value, + // label: value + // }; + // }); + // const optionCode = codeArray.map((value) => { + // return { + // value: value, + // label: value + // }; + // }); + // const optionType = typeArray.map((value) => { + // return { + // value: value, + // label: value + // }; + // }); + // const optionPlan = planArray.map((value) => { + // return { + // value: value, + // label: value + // }; + // }); + + // setServiceCode(optionServiceCode) + // setType(optionType) + // setCode(optionCode) + // setCodePlan(optionPlan) + }; const headStyle = { fontWeight: 'bold', }; + + const onSubmit = async (row : any) => { + try { + handleUpdate(dataValue.status, dataValue.id, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + const applyFilter = async (searchFilter: string) => { await loadDataTableData({ search: searchFilter }); setSearchParams({ search: searchFilter }); @@ -704,17 +974,146 @@ export default function CorporatePlanList() { loadDataTableData(); }, []); + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const handleUpdate = (active: number, id: number, reason:string) => { + console.log(active) + axios + .put(`/plans/${id}/activation`, { + active: active, + reason: reason + }) + .then((res) => { + window.location.reload(); + }); + } + + const handleDeleteAllImport = () => { + axios + .post(`/corporates/${corporate_id}/delete-import-plan-benefit`) + .then((res) => { + window.location.reload(); + }); + } + const [isOpenDialogDelete, setDialogDeleteOpen] = useState(false); + const handleCloseDialogDelete = () => { + setDialogDeleteOpen(false); + }; + + const getContent = () => ( + <> + + Are you sure to {dataValue?.status == 1 ? 'inactive' : 'active'} this service ? + + + + + Code + + + {dataValue?.code} + + + Service Name + + + {dataValue?.name} + + + + + + Reason for update* + + + + + + + + + + + + + + {dataValue?.status == 1? + + Inactive + + : + + Active + + + + } + + + + + + ); + return ( - + {/* */} {/* The Main Table */} - +
- + - + {/* */} Service @@ -737,7 +1136,7 @@ export default function CorporatePlanList() { Action - + {dataTableIsLoading ? ( @@ -765,7 +1164,7 @@ export default function CorporatePlanList() { - + {/* */} {isDialog === 'edit' && ( )} + + + + + + + + Delete Import Benefit + + + + + + + + + Are you sure delete all data benefit and plan? + + + + + + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Plan/sections/History.tsx b/frontend/dashboard/src/pages/Corporates/Plan/sections/History.tsx index c1f372cf..03f6d685 100644 --- a/frontend/dashboard/src/pages/Corporates/Plan/sections/History.tsx +++ b/frontend/dashboard/src/pages/Corporates/Plan/sections/History.tsx @@ -121,11 +121,11 @@ export default function CustomizedAccordions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id + '/plans', + href: '/corporates/' + corporate_id + '/plans', }, { - name: 'Audittrail Corporate', - href: '/corporate/' + corporate_id + '/plans', + name: 'Corporate Dashboard', + href: '/corporates/' + corporate_id + '/plans', }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/Services/Create.tsx b/frontend/dashboard/src/pages/Corporates/Services/Create.tsx index 26f21c96..3b5d9345 100644 --- a/frontend/dashboard/src/pages/Corporates/Services/Create.tsx +++ b/frontend/dashboard/src/pages/Corporates/Services/Create.tsx @@ -44,7 +44,7 @@ import { RHFCustomMultiCheckbox, } from '../../../components/hook-form'; import { Controller, useForm } from 'react-hook-form'; -import { useParams } from 'react-router-dom'; +import { useParams, useNavigate } from 'react-router-dom'; import HeaderBreadcrumbs from '../../../components/HeaderBreadcrumbs'; import Page from '../../../components/Page'; import useSettings from '../../../hooks/useSettings'; @@ -150,6 +150,8 @@ export default function Divisions() { }); }; + const navigate = useNavigate(); + const handleConfigExclusion = ( event: ChangeEvent, service: any, @@ -228,9 +230,46 @@ export default function Divisions() { } }; + const handleToggleSpecialityAll = ( + event: ChangeEvent, + service: any, + specialityAll: boolean + ) => { + console.log('Changing Service ', service, 'and', specialityAll); + try { + axios + .post(`/corporates/${corporate_id}/services/${service_code}/specialities-all`, { + active: specialityAll, + }) + .then((res) => { + setService({ + ...service, + selected_specialities: res.data?.selected_specialities, + exclusions: res.data?.service?.exclusions, + }); + // let newConfigurations = service.configurations + // newConfigurations[res.data.name] = res.data.value == true + + // setService({ + // ...service, + // configurations: { ...newConfigurations } + // }) + enqueueSnackbar('Speciality Updated', { + variant: 'success', + }); + }); + } catch (error) { + console.log(error); + enqueueSnackbar('Speciality Update Failed', { + variant: 'error', + }); + } + }; + const [minAge, setMinAge] = useState(''); const [maxAge, setMaxAge] = useState(''); const [valuePlan, setValuePlan] = useState([]); + const [checkAll, setCheckAll] = useState(false); const [exclusion, setExclusion] = useState([ { @@ -261,6 +300,11 @@ export default function Divisions() { } }; + const handleCheckAll = (event, checkAll) => { + setCheckAll(!checkAll); // Membalik nilai checkAll saat checkbox di klik + handleToggleSpecialityAll(event, service, !checkAll) + }; + // const handleSubmit = (event: any, service: any, row: any) => { // const allData = exclusion.find((item: any) => item.speciality_id === row.id); @@ -378,580 +422,588 @@ export default function Divisions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Services', - href: '/corporate/' + corporate_id + '/services', + href: '/corporates/' + corporate_id + '/services', }, { name: service_code ?? '-', - href: '/corporate/' + corporate_id + '/services/' + service_code, + href: '/corporates/' + corporate_id + '/services/' + service_code, }, ]} /> - - {/* */} - - - -
- - - - General Practitioner - - - - - - External Doctor - Internal Doctor - - - - { - handleConfigChange(event, service); - }} - name="gp_external_doctor_online" - /> - } - label="Online" - /> - - - { - handleConfigChange(event, service); - }} - name="gp_external_doctor_offline" - /> - } - label="Offline" - /> - - - { - handleConfigChange(event, service); - }} - name="gp_internal_doctor_online" - /> - } - label="Online" - /> - - - { - handleConfigChange(event, service); - }} - name="gp_internal_doctor_offline" - /> - } - label="Offline" - /> - - - -
-
+ + + + General Practitioner* + + + External Doctor + - - - - - - Specialist Practitioner - - - - - - External Doctor - Internal Doctor - - - - { - handleConfigChange(event, service); - }} - name="sp_external_doctor_online" - /> - } - label="Online" - /> - - - { - handleConfigChange(event, service); - }} - name="sp_external_doctor_offline" - /> - } - label="Offline" - /> - - - { - handleConfigChange(event, service); - }} - name="sp_internal_doctor_online" - /> - } - label="Online" - /> - - - { - handleConfigChange(event, service); - }} - name="sp_internal_doctor_offline" - /> - } - label="Offline" - /> - - - - - { - setSpecialityModal(true); - }} - > - - - - {(service.selected_specialities && service.selected_specialities != '') - ? Object.keys(service.selected_specialities).length + ' Spesialis Diijinkan : {' + Object.values(service.selected_specialities).join(', ') + '}' - : 'Tidak Ada Spesialis yang diijinkan'} - - - - -
-
+ + Internal Doctor + - { - setSpecialityModal(false); - }} - sx={{ - '& .MuiDialog-paper': { - width: '100%', - maxWidth: 1500, - maxHeight: 750, - bgcolor: 'background.paper', - boxShadow: 24, - }, - }} - aria-labelledby="modal-modal-title" - aria-describedby="modal-modal-description" - > - - - - Specialities - - - - - - - - - - - Covered - Nama Spesialisasi - MSC - Gender - - Min Age - - - Max Age - - Plan - - - - - {specialities.map((row: any, index: any) => ( - - - { - handleToggleSpeciality(event, service, row); - }} - /> - - - {row.name} - - - - - item.speciality_id == row.id && item.msc?.m == '1' - )} - onChange={(event) => { - handleConfigExclusion(event, service, row, 'm', 'msc'); - }} - /> - } - label="Member" - /> - - item.speciality_id == row.id && item.msc?.s == '1' - )} - onChange={(event) => { - handleConfigExclusion(event, service, row, 's', 'msc'); - }} - /> - } - label="Spouse" - /> - - item.speciality_id == row.id && item.msc?.c == '1' - )} - onChange={(event) => { - handleConfigExclusion(event, service, row, 'c', 'msc'); - }} - /> - } - label="Child" - /> - - - - - - item.speciality_id == row.id && - item.gender?.male == '1' - )} - onChange={(event) => { - handleConfigExclusion( - event, - service, - row, - 'male', - 'gender' - ); - }} - /> - } - label="Male" - /> - - item.speciality_id == row.id && - item.gender?.female == '1' - )} - onChange={(event) => { - handleConfigExclusion( - event, - service, - row, - 'female', - 'gender' - ); - }} - /> - } - label="Female" - /> - - + {/* Dokter external online */} + + { + handleConfigChange(event, service); + }} + name="gp_external_doctor_online" + /> + } + label="Online" + /> + + {/* Dokter internal online */} + + { + handleConfigChange(event, service); + }} + name="gp_internal_doctor_online" + /> + } + label="Online" + /> + + {/* Dokter internal offline */} + + { + handleConfigChange(event, service); + }} + name="gp_internal_doctor_offline" + /> + } + label="Offline" + /> + - - - item.speciality_id == row.id - )?.min_age - } - onChange={(event) => { - handleMinAge(event); - handleChange(index, event, 'min_age', row.id); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion( - event, - service, - row, - minAge, - 'min_age' - ); - } - }} - /> - - - - item.speciality_id == row.id - )?.max_age - } - onChange={(event) => { - handleMaxAge(event); - handleChange(index, event, 'max_age', row.id); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion( - event, - service, - row, - maxAge, - 'max_age' - ); - } - }} - /> - - - option.label} - defaultValue={ - convertToArray( - service.exclusions.find( - (item: { speciality_id: any }) => - item.speciality_id == row.id - )?.plan - ) || [] - } - isOptionEqualToValue={(option, value) => - option.value === value.value - } - onChange={(event, value) => { - handlePlanChange(event, value); - handleChange(index, event, 'plan', row.id, value); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - handleConfigExclusion( - event, - service, - row, - valuePlan, - 'plan' - ); - } - }} - renderInput={(params) => ( - - )} - /> - - - - - - ))} - -
-
-
-
-
- - - - - - - Medicine - - - - - - - { - handleConfigChange(event, service); - }} - name="vitamins" - /> - } - label="Vitamins" - /> - - - { - handleConfigChange(event, service); - }} - name="delivery_fee" - /> - } - label="Delivery Fee" - /> - - - - - -
-
- - - - - - - Free Admin Fee - - - - - - - { - handleConfigChange(event, service); - }} - name="general_practitioner_fee" - /> - } - label="General Practitioner" - /> - - - { - handleConfigChange(event, service); - }} - name="specialist_practitioner_fee" - /> - } - label="Specialist Practitioner" - /> - - - - - -
-
-
- - {/* */} + {/* Dokter external offline */} + + { + handleConfigChange(event, service); + }} + name="gp_external_doctor_offline" + /> + } + label="Offline" + /> + + + + {/* Specialist Practitioner* */} + + + + Specialist Practitioner* + + + + + + External Doctor + + + + Internal Doctor + + + {/* Dokter external online */} + + { + handleConfigChange(event, service); + }} + name="sp_external_doctor_online" + /> + } + label="Online" + /> + + {/* Dokter internal online */} + + { + handleConfigChange(event, service); + }} + name="sp_internal_doctor_online" + /> + } + label="Online" + /> + + {/* Dokter internal offline */} + + { + handleConfigChange(event, service); + }} + name="sp_internal_doctor_offline" + /> + } + label="Offline" + /> + + + {/* Dokter external offline */} + + { + handleConfigChange(event, service); + }} + name="sp_external_doctor_offline" + /> + } + label="Offline" + /> + + + + + {/* Medicine */} + + + + Medicine* + + {/* Medicine */} + + { + handleConfigChange(event, service); + }} + name="vitamins" + /> + } + label="Suplemen" + /> + + {/* Dokter internal online */} + + { + handleConfigChange(event, service); + }} + name="delivery_fee" + /> + } + label="Delivery Fee" + /> + + + + + {/* Free Admin Fee* */} + + + + Admin Fee* + + + { + handleConfigChange(event, service); + }} + name="general_practitioner_fee" + /> + } + label="General Practitioner" + /> + + + { + handleConfigChange(event, service); + }} + name="specialist_practitioner_fee" + /> + } + label="Specialist Practitioner" + /> + + + + + {/* */} + + + { + setSpecialityModal(false); + }} + sx={{ + '& .MuiDialog-paper': { + width: '100%', + maxWidth: '90%', + maxHeight: '90%', + bgcolor: 'background.paper', + boxShadow: 24, + }, + }} + aria-labelledby="modal-modal-title" + aria-describedby="modal-modal-description" + > + + + + Specialities Exclusion + + + + + + + + + + + + handleCheckAll(event, checkAll)} + checked={checkAll} // Ini penting untuk memastikan status checkbox sesuai dengan state checkAll + /> + + Specialitation + MSC + Gender + + Min Age + + + Max Age + + Plan + + + + + {specialities.map((row: any, index: any) => ( + + + { + handleToggleSpeciality(event, service, row); + }} + /> + + + {row.name} + + + + + item.speciality_id == row.id && item.msc?.m == '1' + )} + // checked={true} + onChange={(event) => { + handleConfigExclusion(event, service, row, 'm', 'msc'); + }} + /> + } + label="Member" + /> + + item.speciality_id == row.id && item.msc?.s == '1' + )} + // checked={true} + onChange={(event) => { + handleConfigExclusion(event, service, row, 's', 'msc'); + }} + /> + } + label="Spouse" + /> + + item.speciality_id == row.id && item.msc?.c == '1' + )} + onChange={(event) => { + handleConfigExclusion(event, service, row, 'c', 'msc'); + }} + /> + } + label="Child" + /> + + + + + + item.speciality_id == row.id && + item.gender?.male == '1' + )} + // checked={true} + onChange={(event) => { + handleConfigExclusion( + event, + service, + row, + 'male', + 'gender' + ); + }} + /> + } + label="Male" + /> + + item.speciality_id == row.id && + item.gender?.female == '1' + )} + onChange={(event) => { + handleConfigExclusion( + event, + service, + row, + 'female', + 'gender' + ); + }} + /> + } + label="Female" + /> + + + + + + item.speciality_id == row.id + )?.min_age + } + onChange={(event) => { + handleMinAge(event); + handleChange(index, event, 'min_age', row.id); + }} + onKeyDown={(event) => { + if (event.key === 'Enter') { + handleConfigExclusion( + event, + service, + row, + minAge, + 'min_age' + ); + } + }} + /> + + + + item.speciality_id == row.id + )?.max_age + } + onChange={(event) => { + handleMaxAge(event); + handleChange(index, event, 'max_age', row.id); + }} + onKeyDown={(event) => { + if (event.key === 'Enter') { + handleConfigExclusion( + event, + service, + row, + maxAge, + 'max_age' + ); + } + }} + /> + + + option.label} + defaultValue={ + convertToArray( + service.exclusions.find( + (item: { speciality_id: any }) => + item.speciality_id == row.id + )?.plan + ) || [] + } + isOptionEqualToValue={(option, value) => + option.value === value.value + } + onChange={(event, value) => { + handlePlanChange(event, value); + handleChange(index, event, 'plan', row.id, value); + }} + onKeyDown={(event) => { + if (event.key === 'Enter') { + handleConfigExclusion( + event, + service, + row, + valuePlan, + 'plan' + ); + } + }} + renderInput={(params) => ( + + )} + /> + + + + + + ))} + +
+
+
+
+
+
+
+ {/*
*/} + + + + + + + diff --git a/frontend/dashboard/src/pages/Corporates/Services/Index.tsx b/frontend/dashboard/src/pages/Corporates/Services/Index.tsx index 7ea2576b..ca793fcb 100644 --- a/frontend/dashboard/src/pages/Corporates/Services/Index.tsx +++ b/frontend/dashboard/src/pages/Corporates/Services/Index.tsx @@ -34,11 +34,11 @@ export default function Divisions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id, + href: '/corporates/' + corporate_id, }, { name: 'Services', - href: '/corporate/' + corporate_id + '/services', + href: '/corporates/' + corporate_id + '/services', }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/Services/List.tsx b/frontend/dashboard/src/pages/Corporates/Services/List.tsx index 55d2c285..5a7bc9e4 100644 --- a/frontend/dashboard/src/pages/Corporates/Services/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Services/List.tsx @@ -30,17 +30,21 @@ import { Checkbox, FormControlLabel, Tooltip, + Divider, + Grid, } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; +import SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; import HistoryIcon from '@mui/icons-material/History'; // hooks import React, { ChangeEvent, Component, useEffect, useMemo, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; -import { Link, useParams, useSearchParams } from 'react-router-dom'; +import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; // components import axios from '../../../utils/axios'; import { LaravelPaginatedData } from '../../../@types/paginated-data'; @@ -48,11 +52,17 @@ import { Icd } from '../../../@types/diagnosis'; import BasePagination from '../../../components/BasePagination'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; -import { RHFCheckbox } from '../../../components/hook-form'; -import { CheckBox } from '@mui/icons-material'; +import { FormProvider, RHFTextField, RHFSwitch, RHFSelect } from '../../../components/hook-form'; +import { Add, CheckBox } from '@mui/icons-material'; import { CorporateService } from '../../../@types/corporates'; import { number } from 'yup/lib/locale'; import DialogLog from './sections/DialogLog'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import Label from '@/components/Label'; +import DialogUpdateStatus from '@/components/DialogUpdateStatus'; +import palette from '@/theme/palette'; +import { enqueueSnackbar } from 'notistack'; +import { LoadingButton } from '@mui/lab'; export default function List() { const { themeStretch } = useSettings(); @@ -154,9 +164,39 @@ export default function List() { } // Generate the every row of the table + type DataContent = { + code: string; + name: string; + id: string; + status: string|number; + }; + + type DataType = { + code: string; + name: string; + id: string; + } + + type FormValuesProps = { + value: string; + active: boolean; + }; + + const [isDialogOpen, setDialogOpen] = useState(false) + let titles = { + name: 'Update Status', + icon: '-' + } + const [dataValue, setDataValue] = useState(''); + const [dataDescription, setDescriptionValue] = useState(''); + const [url, setUrl] = useState(''); + + // const { id, service_code, status } = data; + function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); + const navigate = useNavigate() const handleConfigChange = (event: ChangeEvent, service: any) => { console.log(event.target.name, event.target.checked, service); @@ -168,85 +208,67 @@ export default function List() { }); }; - const handleActivate = (service: any, status: string) => { - axios - .put(`/corporates/${corporate_id}/services/${service.service_code}`, { - service_code: service.service_code, - status, - reason:service.reason - }) - .then((res) => { - setDataTableData({ - ...dataTableData, - data: dataTableData.data.map((service) => { - let updatedService = service; - if (row.id == service.id) { - updatedService.status = res.data.status; - } - return updatedService; - }), - }); - }); + // const handleActivate = (service: any, status: string) => { + // axios + // .put(`/corporates/${corporate_id}/services/${service.service_code}`, { + // service_code: service.service_code, + // status, + // reason:service.reason + // }) + // .then((res) => { + // setDataTableData({ + // ...dataTableData, + // data: dataTableData.data.map((service) => { + // let updatedService = service; + // if (row.id == service.id) { + // updatedService.status = res.data.status; + // } + // return updatedService; + // }), + // }); + // }); + // }; + + const handleActivate = (isOpen: boolean, dataValue: DataContent) => { + setDialogOpen(isOpen) + setDataValue(dataValue) + setDescriptionValue('Are you sure to inactive this service ?') + setUrl(url) }; return ( - *': { borderBottom: 'unset' } }}> - {/* - setOpen(!open)} - > - {open ? : } - - */} + + + + {row.service_code} {row.name} + + {row.status == 'active' ? + : + } + - - {row.status == 'active' && ( - - )} - {row.status == 'inactive' && ( - - )} - - - - - - - - - - - - + + + navigate(`/corporates/${row.corporate_id}/services/${row.service_code}`)}> + + Config + + navigate(`/corporates/${corporate_id}/services/${row.id}/history`)}> + + History + + handleActivate(true, {code: row.service_code, name: row.name, id:corporate_id, status: row.status})}> + + Update Status + + + } /> + {/* COLLAPSIBLE ROW */} {false && ( @@ -474,7 +496,7 @@ export default function List() { - Free Admin Fee + Admin Fee @@ -682,6 +704,20 @@ export default function List() { fontWeight: 'bold', }; + const onSubmit = async (row : any) => { + try { + handleUpdate(dataValue.status, dataValue.code, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + + const applyFilter = async (searchFilter: any) => { await loadDataTableData({ search: searchFilter }); setSearchParams({ search: searchFilter }); @@ -697,32 +733,146 @@ export default function List() { loadDataTableData(); }, []); + const NewCorporateSchema = Yup.object().shape({ + reason: Yup.string().required('Reason Edit is required'), + }); + + const methods = useForm({ + resolver: yupResolver(NewCorporateSchema), + }); + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const handleUpdate = (active: string, service_code: string, reason:string) => { + console.log(active) + axios + .put(`/corporates/${corporate_id}/services/${service_code}`, { + service_code: service_code, + status: active, + reason: reason + }) + .then((res) => { + window.location.reload(); + }); + } + + const getContent = () => ( + <> + + Are you sure to {dataValue?.status == 'active' ? 'inactive' : 'active'} this service ? + + + + + Code + + + {dataValue?.code} + + + Service Name + + + {dataValue?.name} + + + + + + Reason for update* + + + + + + + + + + + + + + {dataValue?.status == 'active' ? + + Inactive + + : + + Active + + + + } + + + + + + ); + return ( - - {/* The Main Table */} - + - {/* */} - + + Code - + Service - - + Status - - Action + + {/* Action */} - + {dataTableIsLoading ? ( @@ -750,16 +900,27 @@ export default function List() { - - {isDialog === 'edit' && ( + {/* {isDialog === 'edit' && ( - )} + )} */} + + + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Services/sections/History.tsx b/frontend/dashboard/src/pages/Corporates/Services/sections/History.tsx index 5e7f7675..b3c74418 100644 --- a/frontend/dashboard/src/pages/Corporates/Services/sections/History.tsx +++ b/frontend/dashboard/src/pages/Corporates/Services/sections/History.tsx @@ -121,11 +121,11 @@ export default function CustomizedAccordions() { }, { name: corporate?.name ?? '-', - href: '/corporate/' + corporate_id + '/services', + href: '/corporates/' + corporate_id + '/services', }, { name: 'Audittrail Corporate', - href: '/corporate/' + corporate_id + '/benefits', + href: '/corporates/' + corporate_id + '/benefits', }, ]} /> diff --git a/frontend/dashboard/src/pages/Corporates/Show.tsx b/frontend/dashboard/src/pages/Corporates/Show.tsx index 6e3325e1..1b1a597c 100644 --- a/frontend/dashboard/src/pages/Corporates/Show.tsx +++ b/frontend/dashboard/src/pages/Corporates/Show.tsx @@ -19,6 +19,10 @@ import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; import CorporateTabNavigations from './CorporateTabNavigations'; import { fCurrency } from '../../utils/formatNumber'; import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import Iconify from '@/components/Iconify'; +import { LoadingButton } from '@mui/lab'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { enqueueSnackbar } from 'notistack'; export default function Corporates() { const { themeStretch } = useSettings(); @@ -29,11 +33,95 @@ export default function Corporates() { useEffect(() => { setCorporate(configuredCorporateContext.currentCorporate); - }, [configuredCorporateContext]) + getFilesDoc(corporate_id); + }, [configuredCorporateContext, corporate_id]) const headStyle = { fontWeight: 'bold', - }; + }; + // Upload Docs + const fileDocsInput = useRef(null); + const [fileDocs, setFileDocs] = useState([]); + const [showAll, setShowAll] = useState(false); + const [isActive, setIsActive] = useState(false); + const handleDocsInputChange = (corporate_id) => (event) => { + if(event.target.files[0] && corporate_id) + { + const updatedFiles = Array.from(event.target.files).map((file) => ({ + file + })); + submitUploadDocs(corporate_id, updatedFiles); + } + }; + function submitUploadDocs(corporate_id, files) + { + if(files.length > 0) + { + files.map((file, index) => { + const formData = makeFormData( + { + corporate_id : corporate_id, + result_files : file['file'] + } + ); + axios + .post('/add-files-doc', formData) + .then((response) => { + getFilesDoc(corporate_id); + enqueueSnackbar(response.data.message, { variant: 'success' }); + }) + .catch((error) => { + enqueueSnackbar(error.response.data.errors[0], { variant: 'error' }); + }); + }); + } + } + function getFilesDoc(corporate_id) + { + axios + .post('/get-files-doc',{corporate_id:corporate_id}) + .then((response) => { + setFileDocs(response.data.data); + if(response.data.data[0]['status_download'] == 1) + { + setIsActive(!isActive); + } + else + { + setIsActive(isActive); + } + }) + .catch((error) => { + enqueueSnackbar(error.response.data.errors[0], { variant: 'error' }); + }); + } + + const toggleButton = () => { + setIsActive(!isActive); + let statusDownload = 0; + if(!isActive) + { + statusDownload = 1; + } + else + { + statusDownload = 0; + } + axios + .post('/update-status-files-doc', {status_download : statusDownload, corporate_id : corporate_id}) + .then((response) => { + enqueueSnackbar(response.data.message, { variant: 'success' }); + }) + .catch((error) => { + enqueueSnackbar(error.response.data.errors[0], { variant: 'error' }); + }); + }; + // End Upload Docs + + const style1 = {px:4, marginTop: 2}; + const style2 = {color: '#919EAB', width: '50%'}; + const style3 = {color: '#212B36', width: '50%'}; + return ( @@ -50,65 +138,140 @@ export default function Corporates() { }, ]} /> - + {/* */} - + - - - - Current Policy - -
- - - - Policy Name - {corporate?.current_policy?.code} - - - - Total Premi - {fCurrency(corporate?.current_policy?.total_premi)} - - - - Stop Service - {fCurrency(corporate?.current_policy?.minimal_stop_service_net)} - - - - Balance - {fCurrency(corporate?.current_policy?.limit_balance)} - - - -
- + + + Current Policy + + Policy Name + {corporate?.current_policy?.code} + + + Total Premi + {fCurrency(corporate?.current_policy?.total_premi)} + + + Stop Service + {fCurrency(corporate?.current_policy?.minimal_stop_service_net)} + + + Balance + {fCurrency(corporate?.current_policy?.limit_balance)} + - - Claims - - - - - - Number Of Claim - {corporate?.current_policy?.code} - - - - Total Usage This Year - {fCurrency((corporate?.current_policy?.total_premi ?? 0) - (corporate?.current_policy?.limit_balance ?? 0))} - - - -
+ + Claims + + Number Of Claim + {corporate?.current_policy?.code} + + + Total Usage This Year + {fCurrency((corporate?.current_policy?.total_premi ?? 0) - (corporate?.current_policy?.limit_balance ?? 0))} + + + Docs (Terms & Conditions) + {fileDocs.length > 0 && ( + + + ASO members can download or not? + + + {!showAll && ( + + { + handleDocsInputChange(corporate_id)(event); + }} + accept="application/pdf" + multiple + /> + + + )} + + )} + {fileDocs.slice(0, showAll ? fileDocs.length : 1).map((file, index) => ( + + + {file.original_name} + + + ))} + {!showAll && fileDocs.length > 1 && ( + + setShowAll(true)} style={{ color: '#19BBBB', cursor: 'pointer' }}>Lihat Semua Data + + )} + {showAll && ( + + setShowAll(false)} style={{ color: '#19BBBB', cursor: 'pointer' }}>Sembunyikan Data + + )} + {fileDocs.length <= 0 && ( + + Please add a Terms & Conditions document + + { + handleDocsInputChange(corporate_id)(event); + }} + accept="application/pdf" + // multiple + /> + { + fileDocsInput.current.click(); + }} + > + + + Upload File + + + + + )} +
diff --git a/frontend/dashboard/src/pages/CustomerService/Components/CardBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/Components/CardBenefit.tsx new file mode 100644 index 00000000..65addbfe --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Components/CardBenefit.tsx @@ -0,0 +1,214 @@ +import { Card, Grid, MenuItem, Typography } from "@mui/material"; +import { Stack } from '@mui/material'; +import { BenefitData, DetailFinalLogType } from "../FinalLog/Model/Types"; +import { useEffect, useState, useRef, useMemo } from 'react'; +import { Box } from "@mui/material"; + + +import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import Label from '@/components/Label'; + +import AddIcon from '@mui/icons-material/Add'; +import { Button } from "@mui/material"; +import MoreMenu from "@/components/MoreMenu"; +import { Delete, EditOutlined } from "@mui/icons-material"; +import { fNumber } from "@/utils/formatNumber"; +import palette from "@/theme/palette"; +import DialogBenefit from "../FinalLog/Components/DialogBenefit"; +import DialogEditBenefit from "../FinalLog/Components/DialogEditBenefit"; +import DialogDelete from "../FinalLog/Components/DialogDelete"; + + + +type CardDetail = { + requestLog: DetailFinalLogType|undefined; +} + +const style1 = { + color: '#919EAB', + width: '30%' +} +const style2 = { + width: '70%' +} +const marginBottom1 = { + marginBottom: 1, +} +const marginBottom2 = { + marginBottom: 2, +} + +const [openDialogBenefit, setDialogBenefit] = useState(false); +// Handle Edit Detail Benefit +const [openDialogEditBenefit, setDialogEditBenefit] = useState(false) +const [BenefitConfigurationData, setBenefitConfigurationData] = useState(); + +// Handel Delete Detail Benefit +const [idBenefitData, setIdBenefitData] = useState(); +const [openDialogDeleteBenefit, setDialogDeleteBenefit] = useState(false) + + +export default function CardBenefit({requestLog} : CardDetail ) { + return ( + + + Benefit + + + + {requestLog?.benefit_data?.map((item, index) => ( + + + + + + + {item.benefit?.description} + + + + + { + setDialogEditBenefit(true) + setIdBenefitData(item.id) + setBenefitConfigurationData(item) + }} + > + + Edit + + { + setIdBenefitData(item.id) + setDialogDeleteBenefit(true) + }} + > + + Delete + + + } /> + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {fNumber(item.amount_incurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(item.amount_approved)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(item.amount_not_approved)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid* + + + + + {fNumber(item.excess_paid)} + + + + + + {/* Keterangan* */} + + + + + Keterangan* + + + + + {item.keterangan} + + + + + + + + + + + + ))} + + {/* Dialog Edit */} + + + + {/* Dialog Delete */} + + + + ) + +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/Components/CardDetail.tsx b/frontend/dashboard/src/pages/CustomerService/Components/CardDetail.tsx new file mode 100644 index 00000000..39db8867 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Components/CardDetail.tsx @@ -0,0 +1,57 @@ +import { Card, Typography } from "@mui/material"; +import { Stack } from '@mui/material'; +import { DetailFinalLogType } from "../FinalLog/Model/Types"; +import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; + + +type CardDetail = { + requestLog: DetailFinalLogType|undefined; +} + +const style1 = { + color: '#919EAB', + width: '30%' +} +const style2 = { + width: '70%' +} +const marginBottom1 = { + marginBottom: 1, +} +const marginBottom2 = { + marginBottom: 2, +} + + +export default function CardDetail({requestLog} : CardDetail ) { + return ( + + Detail + + Member ID + {requestLog?.member_id} + + + Policy Number + {requestLog?.policy_number} + + + Name + {requestLog?.name} + + + Date Of Birth + {requestLog?.date_of_birth ? fDate(requestLog?.date_of_birth) : '-'} + + + Marital Status + {requestLog?.marital_status} + + + Submission Date + {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} + + + ) + +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/Components/CardExclusion.tsx b/frontend/dashboard/src/pages/CustomerService/Components/CardExclusion.tsx new file mode 100644 index 00000000..4369074d --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Components/CardExclusion.tsx @@ -0,0 +1,117 @@ +import { Accordion, AccordionDetails, AccordionSummary, Card, Typography } from "@mui/material"; +import { Stack } from '@mui/material'; +import { DetailFinalLogType } from "../FinalLog/Model/Types"; +import { toTitleCase } from "@/utils/formatTime"; +import Label from '@/components/Label'; +import { ExpandMore } from "@mui/icons-material"; + + + +type CardDetail = { + requestLog: DetailFinalLogType|undefined; +} + +const style1 = { + color: '#919EAB', + width: '30%' +} +const style2 = { + width: '70%' +} +const marginBottom2 = { + marginBottom: 2, +} + + +export default function CardExclusion({requestLog} : CardDetail ) { + return ( + + Exclusion + {requestLog?.exclusion?.length > 0 ? requestLog?.exclusion.map((r, index) => ( + + } + aria-controls='panelia-content' + id='panel1a-header' + > + {r.exclusionable.code} + {r.exclusionable.name} + + + + MSC + + {r.rules.length > 0 && r?.rules?.map((text, i) => { + return text.name === 'msc' ? + text.values.split(',').map((text2, j) => { + let labelMSC: string = text2; + switch (labelMSC) { + case 'm': + labelMSC = 'Member'; + break; + case 'c': + labelMSC = 'Child'; + break; + case 's': + labelMSC = 'Spouse'; + break; + default: + labelMSC = 'Member'; + } + return ( + + ); + }) + : null; + })} + + + + Gender + + {r.rules.length > 0 && r?.rules?.map((text, i) => { + return text.name === 'gender' ? + text.values.split(',').map((text2, j) => { + let labelGender: string = toTitleCase(text2); + return ( + + ); + }) + : null; + })} + + + + Min Age + + {r.rules.length > 0 && r?.rules?.map((text, i) => { + return text.name === 'min_age' ? + {text.values} : null + })} + + + + Max Age + + {r.rules.length > 0 && r?.rules?.map((text, i) => { + return text.name === 'max_age' ? + {text.values} : null + })} + + + + Plan + + {r.rules.length > 0 && r?.rules?.map((text, i) => { + return text.name === 'plan' ? + {text.values} : null + })} + + + + + )) : null} + + ) + +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/Components/CardFile.tsx b/frontend/dashboard/src/pages/CustomerService/Components/CardFile.tsx new file mode 100644 index 00000000..9cb6efb4 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Components/CardFile.tsx @@ -0,0 +1,50 @@ +import { Card, Typography } from "@mui/material"; +import { Stack } from '@mui/material'; +import { DetailFinalLogType } from "../FinalLog/Model/Types"; +import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; + + +type CardDetail = { + requestLog: DetailFinalLogType|undefined; +} + +const style1 = { + color: '#919EAB', + width: '30%' +} +const style2 = { + width: '70%' +} +const marginBottom1 = { + marginBottom: 1, +} +const marginBottom2 = { + marginBottom: 2, +} + + +export default function CardFile({requestLog} : CardDetail ) { + return ( + + + + Files History + {requestLog?.files?.map((documentType, index) => ( + + + + {documentType.original_name ? documentType.original_name : '-'} + + + + ))} + + + + ) + +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/Components/CardMedicine.tsx b/frontend/dashboard/src/pages/CustomerService/Components/CardMedicine.tsx new file mode 100644 index 00000000..4054024c --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Components/CardMedicine.tsx @@ -0,0 +1,65 @@ +import { Card, Grid, Typography } from "@mui/material"; +import { Stack } from '@mui/material'; +import { DetailFinalLogType } from "../FinalLog/Model/Types"; +import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import DialogMedicine from "../FinalLog/Components/DialogMedicine"; +import { fNumber } from "@/utils/formatNumber"; +import { Button } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import { useState } from "react"; + +type CardDetail = { + requestLog: DetailFinalLogType|undefined; +} + +const style1 = { + color: '#919EAB', + width: '30%' +} +const style2 = { + width: '70%' +} +const marginBottom1 = { + marginBottom: 1, +} +const marginBottom2 = { + marginBottom: 2, +} + +const [openDialogMedicine, setDialogMedicine] = useState(false); + + +export default function CardMedicine({requestLog} : CardDetail ) { + return ( + + + Medicine + + + + {requestLog?.medicine.map((item, index) => ( + + {item.medicine} + Rp. {fNumber(item.price)} + + ))} + + {/* */} + + ) + +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/Components/CardService.tsx b/frontend/dashboard/src/pages/CustomerService/Components/CardService.tsx new file mode 100644 index 00000000..0ef1a11e --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Components/CardService.tsx @@ -0,0 +1,105 @@ +import { Card, Typography } from "@mui/material"; +import { Stack } from '@mui/material'; +import { DetailFinalLogType } from "../FinalLog/Model/Types"; +import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import Label from '@/components/Label'; + + + +type CardDetail = { + requestLog: DetailFinalLogType|undefined; + isFinalLog: boolean +} + +const style1 = { + color: '#919EAB', + width: '30%' +} +const style2 = { + width: '70%' +} +const marginBottom1 = { + marginBottom: 1, +} +const marginBottom2 = { + marginBottom: 2, +} + + +export default function CardService({requestLog, isFinalLog = true} : CardDetail ) { + return ( + + Service + + Service Type + {requestLog?.service_type} + + + Claim Method + {toTitleCase(requestLog?.claim_method ?? '-')} + + {/* + Benefit + +
    + {requestLog?.benefit.length > 0 ? requestLog?.benefit.map((r, index) => ( +
  • {r.code } - {r.description}
  • + )) :
  • -
  • } +
+
+
*/} + {/* General Practitioner */} + + General Practitioner + External Doctor : + {requestLog?.config_service?.gp_external_doctor_online == '1' ? () : '-'} + {requestLog?.config_service?.gp_external_doctor_offline == '1' ? () : '-'} + + + + + Internal Doctor : + {requestLog?.config_service?.gp_internal_doctor_online == '1' ? () : '-'} + {requestLog?.config_service?.gp_internal_doctor_offline == '1' ? () : '-'} + + + + {/* Specialist Practitioner */} + + Specialist Practitioner + External Doctor : + {requestLog?.config_service?.sp_external_doctor_online == '1' ? () : '-'} + {requestLog?.config_service?.sp_external_doctor_offline == '1' ? () : '-'} + + + + + Internal Doctor : + {requestLog?.config_service?.gp_internal_doctor_online == '1' ? () : '-'} + {requestLog?.config_service?.gp_internal_doctor_offline == '1' ? () : '-'} + + + + {/* Medicine */} + + Medicine + +
    + {requestLog?.config_service?.vitamins == '1' ? (
  • Suplemen
  • ) : (
  • -
  • )} + {requestLog?.config_service?.delivery_fee == '1' ? (
  • Delivery Fee
  • ) : (
  • -
  • )} +
+
+
+ + Admin Fee + + {requestLog?.config_service?.general_practitioner_fee == '1' ? () : '-'} + {requestLog?.config_service?.specialist_practitioner_fee == '1' ? () : '-'} + + + + +
+ ) + +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx new file mode 100644 index 00000000..353b61c8 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx @@ -0,0 +1,343 @@ +import * as Yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; + +import MuiDialog from "@/components/MuiDialog"; +import { Checkbox, Typography, FormControl, Card, Grid, DialogActions } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { BenefitConfigurationListType } from "../Model/Types"; +import { InputLabel, Select, FormHelperText } from "@mui/material"; +import FormGroup from '@mui/material/FormGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Button from '@mui/material/Button'; +import { fNumber } from "@/utils/formatNumber"; +import palette from "@/theme/palette"; +import { Box } from "@mui/material"; +import { FormProvider, RHFTextField } from "@/components/hook-form"; +import RHFTextFieldMoney from '@/components/hook-form/v2/RHFTextFieldMoney'; + +import { useFieldArray, useForm } from 'react-hook-form'; +import { LoadingButton } from '@mui/lab'; +import { postAddBenefit } from '../Model/Functions'; +import { useNavigate } from 'react-router'; +import { description } from '@/_mock/text'; + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + requestLog: DetailFinalLogType|undefined; +} + +type BenefitSelected = { + id: number, + description: string, + benefit_id: number, +} + + + +export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : DialogConfirmationType ) { + + // Add Benefit + const [addBenefit, setAddBenefit] = useState(false) + const navigate = useNavigate() + //Benefit Name + const [valBenefitNames, setValBenefitNames] = useState([]); + const [valBenefitNameError, setValBenefitNameError] = useState(''); + const benefitNameData = requestLog?.benefit; + const [benefitSelected, setBenefitSelected] = useState([]); + + const handleConditionChangeService = (event) => { + const selectedItem = event.target.value; + + if (valBenefitNames.includes(selectedItem)) { + // Item is already selected, remove it + setValBenefitNames(valBenefitNames.filter(item => item !== selectedItem)); + } else { + // Item is not selected, add it + setValBenefitNames([...valBenefitNames, selectedItem]); + } + }; + + useEffect(() => { + const datax: any[] = [] + + valBenefitNames.map((data) => { + benefitNameData?.map((row) => { + if(row.id == data) { + datax.push(row) + } + }) + }) + + // for data information + let temp = datax.map((item, indx) => { + return { + benefit_id: item.id, + description: item.description, + request_log_id: requestLog?.id, + amount_incurred: 0, + amount_approved: 0, + amount_not_approved: 0, + excess_paid: 0, + keterangan: '', + } + }) + + reset({benefit_data: temp}) + + setBenefitSelected(datax) + + }, [valBenefitNames]) + + const handleCloseDialogBenefit = () => { + // setOpenDialog(false); + setAddBenefit(false) + setBenefitSelected([]) + setValBenefitNames([]) + } + + const handleAddDialogBenefit = () => { + setAddBenefit(true) + } + + const defaultValues: BenefitConfigurationListType = { + request_log_id: requestLog?.id, + benefit_name: '', + amount_incurred: 0, + amount_approved: 0, + amount_not_approved: 0, + excess_paid: 0, + }; + + const validationSchema = Yup.object().shape({ + benefit_data: Yup.array().of( + Yup.object().shape({ + amount_incurred : Yup.number().typeError('').required(''), + amount_approved : Yup.number().typeError('').required(''), + amount_not_approved : Yup.number().typeError('').required(''), + excess_paid : Yup.number().typeError('').required(''), + }) + ) + }) + + const methods = useForm({ + resolver: yupResolver(validationSchema), + defaultValues + }); + + const {fields, append, remove} = useFieldArray({name: 'benefit_data',control: methods.control}) + + const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods; + // Submit Form + // ===================================== + const submitHandler = async (data: BenefitConfigurationListType) => { + + const response = await postAddBenefit(data); + + if (response == true) { + reset(); + // navigate('custormer-service/final-log/detail/'+requestLog?.id); + window.location.reload() + } + } + + const getContent = () => !addBenefit ? ( + + + + Benefit Name* + + + Benefit Name + + + {valBenefitNameError} + + + + + ) : + + ( + + + {/* */} + {fields?.map((item, index) => + ( + + + + + {item.description} + + + + + + + + Amount Incurred* + + + + + + + + + + + + + Amount Approved* + + + + append({amount_approved: ''}) } + id='amount_approved' + key={item.id} + name={`benefit_data.${index}.amount_approved`} + placeholder='Amount Approved' + required + /> + + + + + + + + + Amount Not Approved* + + + + append({amount_not_approved: ''}) } + id='amount_not_approved' + key={item.id} + name={`benefit_data.${index}.amount_not_approved`} + placeholder='Amount Not Approved' + required + /> + + + + + + + + + Excess Paid* + + + + append({excess_paid: ''}) } + id='excess_paid' + key={item.id} + name={`benefit_data.${index}.excess_paid`} + placeholder='Excess Paid' + required + /> + + + + + + + + + Keterangan* + + + + append({keterangan: ''}) } + id='keterangan' + key={item.id} + name={`benefit_data.${index}.keterangan`} + placeholder='Keterangan' + required + /> + + + + + + ))} + + + {/* */} + + + + + Save + + + + + + + ); + + const getAction = () => !addBenefit ? ( + + + + + ) : null; + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx new file mode 100644 index 00000000..061739d0 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx @@ -0,0 +1,110 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + approve: string; + requestLog: DetailFinalLogType|undefined; +} + +export default function DialogConfirmation({requestLog, setOpenDialog, openDialog, approve, onSubmit} : DialogConfirmationType ) { + + const navigate = useNavigate(); + const handleSubmit = () => { + const formData = { + status : approve, + id: requestLog?.id + } + axios + .post(`customer-service/request/final-log`, formData) + .then((response) => { + enqueueSnackbar('Verification Final LOG Success', { variant: 'success' }); + setOpenDialog(false); + navigate('/custormer-service/final-log') + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const getContent = () => ( + + Are you sure to {approve == 'approved' ? 'approve' : 'deciline'} this final log ? + + + + Member ID + {requestLog?.member_id} + + + Policy Number + {requestLog?.policy_number} + + + Name + {requestLog?.name} + + + Submission Date + {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} + + + Claim Method + {requestLog?.claim_method ? toTitleCase(requestLog?.claim_method) : '-'} + + + Service Type + {requestLog?.service_type} + + + + + + + {approve == 'approved' ? ( + + ) : ( + + ) } + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDelete.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDelete.tsx new file mode 100644 index 00000000..59669585 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDelete.tsx @@ -0,0 +1,120 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; + + +type DialogDeleteType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + id: number|undefined; +} + +export default function DialogDelete({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { + const handleSubmit = () => { + axios + .delete(`customer-service/request/benefit_data/${id}`) + .then((response) => { + enqueueSnackbar('Benefit Data has Deleted', { variant: 'success' }); + setOpenDialog(false); + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const getContent = () => ( + + Are you sure to delete this detail benefit ? + + + + + + ); + + + return ( + + ); +} + +export function DialogDeleteMedicine({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { + const handleSubmit = () => { + axios + .delete(`customer-service/request/medicine-data/${id}`) + .then((response) => { + enqueueSnackbar('Benefit Data has Deleted', { variant: 'success' }); + setOpenDialog(false); + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const getContent = () => ( + + Are you sure to delete this detail medicine ? + + + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDeleteMedicine.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDeleteMedicine.tsx new file mode 100644 index 00000000..bd98ba42 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDeleteMedicine.tsx @@ -0,0 +1,69 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; + + +type DialogDeleteType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + id: number|undefined; +} + +export default function DialogDeleteMedicine({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { + const handleSubmit = () => { + axios + .delete(`customer-service/request/medicine-data/${id}`) + .then((response) => { + enqueueSnackbar('Benefit Data has Deleted', { variant: 'success' }); + setOpenDialog(false); + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const getContent = () => ( + + Are you sure to delete this detail medicine ? + + + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx new file mode 100644 index 00000000..57063b87 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx @@ -0,0 +1,220 @@ +import * as Yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; + +import MuiDialog from "@/components/MuiDialog"; +import { Box, Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import { BenefitConfigurationListType } from "../Model/Types"; +import { postEditBenefit } from "../Model/Functions"; +import { useForm } from 'react-hook-form'; +import { FormProvider, RHFTextField } from "@/components/hook-form"; +import RHFTextFieldMoney from "@/components/hook-form/v2/RHFTextFieldMoney"; +import { LoadingButton } from "@mui/lab"; + + +type DialogDeleteType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + data: BenefitConfigurationListType|undefined; + id: number|undefined; +} + +export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { + const handleCloseDialog = () => { + setOpenDialog(false); + } + + // setup form + // ==================================== + const defaultValues: BenefitConfigurationListType = { + request_log_id: 0, + benefit_name: '', + amount_incurred: 0, + amount_approved: 0, + amount_not_approved: 0, + excess_paid: 0, + keterangan: '-', + description: '-' + }; + + const validationSchema = Yup.object().shape({ + amount_incurred : Yup.string().typeError('').required(''), + amount_approved : Yup.string().typeError('').required(''), + amount_not_approved : Yup.string().typeError('').required(''), + excess_paid : Yup.string().typeError('').required(''), + }); + + const methods = useForm({ + resolver: yupResolver(validationSchema), + defaultValues + }); + + const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods; + + // Submit Form + // ===================================== + const submitHandler = async (data: BenefitConfigurationListType) => { + + const response = await postEditBenefit(id, data); + + if (response == true) { + reset(); + // navigate('custormer-service/final-log/detail/'+requestLog?.id); + window.location.reload() + } + } + + // Set Value Form + // ===================================== + useEffect(() => { + setValue('amount_incurred', data?.amount_incurred) + setValue('amount_approved', data?.amount_approved) + setValue('amount_not_approved', data?.amount_not_approved) + setValue('excess_paid', data?.excess_paid) + setValue('keterangan', data?.keterangan) + }, [data]) + + const getContent = () => ( + + + {/* */} + + + + + {data?.benefit?.description} + + + + + + + + Amount Incurred* + + + + + + + + + + + + + Amount Approved* + + + + append({amount_approved: ''}) } + id='amount_approved' + key={id} + name={`amount_approved`} + placeholder='Amount Approved' + required + /> + + + + + + + + + Amount Not Approved* + + + + append({amount_not_approved: ''}) } + id='amount_not_approved' + key={id} + name={`amount_not_approved`} + placeholder='Amount Not Approved' + required + /> + + + + + + + + + Excess Paid* + + + + append({excess_paid: ''}) } + id='excess_paid' + key={id} + name={`excess_paid`} + placeholder='Excess Paid' + required + /> + + + + + + + + + Keterangan* + + + + append({keterangan: ''}) } + id='keterangan' + key={id} + name={`keterangan`} + placeholder='Keterangan' + required + /> + + + + + + {/* */} + + + + + Save + + + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogHospitalCare.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogHospitalCare.tsx new file mode 100644 index 00000000..c2467a21 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogHospitalCare.tsx @@ -0,0 +1,155 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Autocomplete, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import { useFieldArray, useForm } from 'react-hook-form'; +import { FormProvider, RHFDatepicker, RHFSelect, RHFTextField } from '@/components/hook-form'; + +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import { LoadingButton } from '@mui/lab'; +import AddIcon from '@mui/icons-material/Add'; + + + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + requestLog: DetailFinalLogType|undefined; +} + +export default function DialogHospitalCare({requestLog, setOpenDialog, openDialog } : DialogConfirmationType ) { + + interface FormValuesProps extends Partial { + taxes: boolean; + inStock: boolean; + } + + const onSubmit = async (data: DetailFinalLogType) => { + + reset(); + } + + const methods = useForm(); + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + resetField, + formState: { isSubmitting }, + } = methods; + + const {fields, append, remove} = useFieldArray({name: "secondary_diagnosis_id", control}) + + const getContent = () => ( + + + + {/* Location */} + + Location* + + + + {/* Dokter */} + + Doctor* + + + + + Medical Record Number* + + + + + Symptoms* + + + + + Sign* + + + + + Diagnosis* + + + + {/* + + + + + + + + + Examination and Result* + + + + {/* + + + + + + + + + + + Invoice* + + + + + + + + + + Save + + + + + ); + + + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogMedicine.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogMedicine.tsx new file mode 100644 index 00000000..0b9d01ed --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogMedicine.tsx @@ -0,0 +1,171 @@ +import * as Yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; + +import MuiDialog from "@/components/MuiDialog"; +import { Button, Autocomplete, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { MedicineType } from "../Model/Types"; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import { useFieldArray, useForm } from 'react-hook-form'; +import { FormProvider, RHFDatepicker, RHFSelect, RHFTextField } from '@/components/hook-form'; + +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import { LoadingButton } from '@mui/lab'; +import AddIcon from '@mui/icons-material/Add'; +import RemoveIcon from '@mui/icons-material/Remove'; +import RHFTextFieldMoney from "@/components/hook-form/v2/RHFTextFieldMoney"; +import { IconButton } from '@mui/material'; +import { postAddMedince } from '../Model/Functions'; + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + requestLog: DetailFinalLogType|undefined; +} + +export default function DialogMedicine({requestLog, setOpenDialog, openDialog } : DialogConfirmationType ) { + const handleCloseDialogMedicine = () => { + setOpenDialog(false); + } + + const requestID = requestLog?.id + + const defaultValues: MedicineType = { + medicine : [{ + id: 0, + medicine_name: '', + medicine_price: 0, + request_log_id: requestID, + medicine: '', // input to database + price: 0, // input to database + }], + }; + + const validationSchema = Yup.object().shape({ + medicine: Yup.array().of( + Yup.object().shape({ + medicine_name : Yup.string().typeError('').required(''), + medicine_price : Yup.number().typeError('').required(''), + request_log_id : Yup.number().typeError('').required(''), + }) + ) + }) + + const methods = useForm({ + resolver: yupResolver(validationSchema), + defaultValues + }); + + const {fields, append, remove} = useFieldArray({name: 'medicine',control: methods.control}) + + useEffect(() => { + let temp = fields.map((item, i) => { + return { + medicine_name: 'test', + medicine_price: 0, + request_log_id: 3, + } + }) + + reset({medicine: temp}) + }, []) + + + + const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods; + // Submit Form + // ===================================== + const submitHandler = async (data: MedicineType) => { + const response = await postAddMedince(data); + + if (response == true) { + reset(); + // navigate('custormer-service/final-log/detail/'+requestLog?.id); + window.location.reload() + } + } + + const getContent = () => ( + + + + {/* Medicine */} + + + Medicine* + + + + + {fields.map((field, index) => ( + + + + + + + + { + index != (fields.length-1) ? + ( + + remove(index)}> + + + + ) : null + } + + + ))} + + + + + + + + Add + + + + + + ); + + const getAction = () => null; + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreate.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreate.tsx new file mode 100644 index 00000000..d952f5e3 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreate.tsx @@ -0,0 +1,355 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, CircularProgress , Button, styled, Stack, IconButton, Card} from '@mui/material'; +import { LoadingButton } from '@mui/lab'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - +import FormCreateSearch from './FormCreateSearch'; +import FormCreateListChoose from './FormCreateListChoose'; +import FormCreateBtnUpload from './FormCreateBtnUpload'; + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { ArrowBackIosNew } from '@mui/icons-material'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from '../Model/Types'; +import { addClaimRequest, getMemberList } from '../Model/Functions'; +import palette from '@/theme/palette'; +import FormCreateFilesUpload from './FormCreateFilesUpload'; +import useLoadOnScroll from '@/hooks/useLoadOnScroll'; +import useCollapseDrawer from '@/hooks/useCollapseDrawer'; +import FormCreateBtnChoose from './FormCreateBtnChoose'; +import axios from '../../../utils/axios'; + +export default function FormCreate() { + const navigate = useNavigate() + const defaultListChoosed:MemberListType[] = []; + + // State + // ------------------------- + const [keyword, setKeyword] = useState(''); + const [listChoosed, setListChoosed] = useState([]); + const [isChoosed, setIsChoosed] = useState(false); + const [formIsLoading, setFormIsLoading] = useState(false); + + // List Choose - auto Scroll + // ------------------------- + const fetchFunction = async (page: number): Promise => getMemberList(page, keyword) + + const {data: MemberList, isLoading: scrollIsLoading, setData, resetLastPage, refetchData} = useLoadOnScroll(fetchFunction); + + // List Choose - Search + // ------------------------- + const handleSearch = (keyword: string) => { + setData([]) + resetLastPage() + setKeyword(keyword) + refetchData() + } + + // Function - Clear Form + // ----------------------------- + const clearForm = () => { + setListChoosed(defaultListChoosed); + setIsChoosed(false); + } + + // Function - Choose Patien Type + // ----------------------------- + const handleChoosePatienType = (data: MemberListType, type: string) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + list.patien_type = type + } + + return list; + }) + setListChoosed(newListChoosed) + } + + // Function - Handle Btn Upload + // ----------------------------- + const handleChangeInput = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', file: any) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'kondisi') { + if (list.file_kondisi == undefined) { + list.file_kondisi = [file]; + } + else { + list.file_kondisi.push(file); + } + } + + if (type_file == 'diagnosa') { + if (list.file_diagnosa == undefined) { + list.file_diagnosa = [file]; + } + else { + list.file_diagnosa.push(file); + } + } + + if (type_file == 'penunjang') { + if (list.file_penunjang == undefined) { + list.file_penunjang = [file]; + } + else { + list.file_penunjang.push(file); + } + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Remove Fle + // ----------------------------- + const handleRemoveFile = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', target_index: number) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'kondisi') { + list.file_kondisi = list.file_kondisi?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'diagnosa') { + list.file_diagnosa = list.file_diagnosa?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'penunjang') { + list.file_penunjang = list.file_penunjang?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Submit Form + // ----------------------------- + const handleSubmit = async () => { + setFormIsLoading(true) + let response = await addClaimRequest(listChoosed) + setFormIsLoading(false) + + if (response == true) { + clearForm() + } + } + + + + let isDirty = listChoosed.some((row) => { + if (row.patien_type == undefined) { + return true + } + }) + + return ( + + {/* Back Button */} + + isChoosed==false ? navigate(`/claim-requests`) : setIsChoosed(false)} > + + + + + {'Create Claim Requests'} + + + + {/* Choose Section */} + + {/* Search */} + + handleSearch('')} onSubmit={(keyword) => handleSearch(keyword)} /> + + + + + {/* List */} + + + { + MemberList.map((row, index) => { + return ( + { + checked ? setListChoosed((prevData) => [...prevData, data]) : setListChoosed((items) => items.filter(item => item.id != data.id)) + }} + /> + ) + }) + } + + + + {/* Loading */} + + + + + {/* Submit List */} + + setIsChoosed(true)} /> + + + + + + {/* Input Section */} + + { + listChoosed.map((row, index) => { + return ( + + + {/* Patien Name */} + + + + + {row.name} + + + {row.member_id} + + + + + + + {/* Patien Type */} + + + {row.service_type.map((r,i) => { + const code = r.code + return ( + + + + ) + })} + + + + {/* File Kondisi */} + + + + Condition Document + + + {row.file_kondisi && row.file_kondisi.map((file, index) => ( + + handleRemoveFile(row, 'kondisi', index)} /> + + ))} + + + handleChangeInput(row, 'kondisi', file)} /> + + + + + {/* File Diagnosa */} + + + + Diagnosis Document + + + {row.file_diagnosa && row.file_diagnosa.map((file, index) => ( + + handleRemoveFile(row, 'diagnosa', index)} /> + + ))} + + + handleChangeInput(row, 'diagnosa', file)} /> + + + + + {/* File Penunjang */} + + + + Supporting Result Document + + + {row.file_penunjang && row.file_penunjang.map((file, index) => ( + + handleRemoveFile(row, 'penunjang', index)} /> + + ))} + + + handleChangeInput(row, 'penunjang', file)} /> + + + + + + + ) + }) + } + + + + + handleSubmit()}> + Save Changes + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateBtnChoose.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateBtnChoose.tsx new file mode 100644 index 00000000..cffd3bc3 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateBtnChoose.tsx @@ -0,0 +1,39 @@ +import { styled, Button } from "@mui/material"; +import useCollapseDrawer from "@/hooks/useCollapseDrawer"; + +/** + * Custom Style + * ============================================ +*/ +const DivCustom1 = styled('div')(({ theme }) => ({ + background: 'white', + position: 'fixed', + left: '350px', + right: 0, + bottom: 0, + paddingLeft: '32px', + paddingRight: '32px', + paddingTop: '32px', + paddingBottom: '48px', + [theme.breakpoints.between('sm', 'lg')]: { + left: '0px', + }, +})); + +type Props = { + disabled: boolean, + title : string, + handleClickProp: () => void +} + +export default function FormCreateBtnChoose ({disabled, title, handleClickProp}: Props) { + const { collapseClick } = useCollapseDrawer(); + + return ( + + + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateBtnUpload.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateBtnUpload.tsx new file mode 100644 index 00000000..23df5ed5 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateBtnUpload.tsx @@ -0,0 +1,39 @@ +import { useRef } from "react"; +import { Box, ButtonBase, Typography } from "@mui/material"; +import Iconify from "@/components/Iconify"; + +type Props = { + handleChangeInputProp: (event: any) => void +} + +export default function FormCreateBtnUpload ({handleChangeInputProp}: Props) { + const fileInput = useRef(null); + + return ( + fileInput.current?.click()}> + + + + Upload Result + + + handleChangeInputProp(event.target.files ? event.target.files[0] : {})} + accept="application/pdf" + /> + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateFilesUpload.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateFilesUpload.tsx new file mode 100644 index 00000000..7ab9d7bd --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateFilesUpload.tsx @@ -0,0 +1,25 @@ +import Iconify from "@/components/Iconify"; +import { ArrowBackIosNew, InsertDriveFile } from '@mui/icons-material'; +import { Stack, Typography } from "@mui/material"; + +type Props = { + file: any, + handleRemoveFileProp: () => void, +} + +export default function FormCreateFilesUpload({ file, handleRemoveFileProp }: Props) { + return ( + + + + {file.name ? file.name : '-'} + + {handleRemoveFileProp()}} + sx={{cursor: 'pointer'}} + > + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateListChoose.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateListChoose.tsx new file mode 100644 index 00000000..03c8d0b1 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateListChoose.tsx @@ -0,0 +1,78 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, Card} from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from '../Model/Types'; +import palette from '@/theme/palette'; + +/** + * Props + * ===================================================== + */ +type Props = { + data: MemberListType, + ListChoosed: MemberListType[], + handleCheckedProp: (checked: boolean, data: MemberListType) => void, +}; + +export default function FormCreateListChoose({data, ListChoosed, handleCheckedProp}: Props) { + const [isChoosed, setIsChoosed] = useState(false) + + useEffect(() => { + setIsChoosed(false); + + ListChoosed.forEach(list => { + if (list.id == data.id) { + setIsChoosed(true); + } + }) + }, [ListChoosed]) + + return ( + + { + return isChoosed ? palette.light.primary.lighter : palette.light.background.default + } + }}> + + handleCheckedProp(checked, data)} />} + checked={isChoosed} + /> + + + + {data.name} + + + {data.member_id} + + + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateSearch.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateSearch.tsx new file mode 100644 index 00000000..026b886b --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormCreateSearch.tsx @@ -0,0 +1,70 @@ +/** + * Core + * ============================================ + */ +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import { Grid } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import { FormProvider, RHFTextField } from '@/components/hook-form'; +// - Local - + +/** + * Icon, Utils, Types, Functions + * ============================================ + */ +import { Search } from '@mui/icons-material'; +import { SearchType } from '../Model/Types'; + +type Props = { + onSubmit: (keyword: string) => void, + onEmpty: () => void, +}; + +const FormCreateSearch = ({ onSubmit, onEmpty }: Props) => { + const defaultValuesSearchForm = { + keyword: '' + }; + + const methodsSearchForm = useForm({ + defaultValues: defaultValuesSearchForm + }); + + const { handleSubmit, formState: { isDirty } } = methodsSearchForm; + + // search on submit + const onSubmitSearch = (data: SearchType ) => { + onSubmit(data.keyword); + } + + // search on empty + useEffect(() => { + if (isDirty === false) { + onEmpty() + } + },[isDirty]) + + return ( + + + + }} + sx={{ input: { paddingLeft: '14px' } }} + /> + + + + ) +} + +export default FormCreateSearch diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormEdit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormEdit.tsx new file mode 100644 index 00000000..faa95bf0 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/FormEdit.tsx @@ -0,0 +1,456 @@ +import * as Yup from 'yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate } from 'react-router-dom'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Controller, useForm } from 'react-hook-form'; +import React, { useRef, useEffect, useMemo, useState } from 'react'; +import axios from '../../../utils/axios'; +import { FormProvider, RHFTextField } from '../../../components/hook-form'; + +import { makeFormData } from '@/utils/jsonToFormData'; +import { + Autocomplete, + Button, + Grid, + Stack, + Table, + TableBody, + TableCell, + TableRow, + TextField, + Typography, + useTheme, + List, + ListItem, + IconButton, + ListItemAvatar, + Avatar, + ListItemText, + Card, + InputAdornment, + Divider, + ButtonBase, + Box, +} from '@mui/material'; +import Iconify from '../../../components/Iconify'; +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import { LoadingButton } from '@mui/lab'; +import { fCurrency } from '../../../utils/formatNumber'; +import MemberSelectDialog from '../../../components/dialogs/MemberSelectDialog'; +import { Add, ArrowBackIosNew, DeleteOutline } from '@mui/icons-material'; +import { ClaimRequest, Files } from '@/@types/claims'; +import { fDateTimesecond } from '@/utils/formatTime'; + +interface FormValuesProps extends Partial { + taxes: boolean; + inStock: boolean; +} + +type Props = { + isEdit: boolean; + currentClaim?: ClaimRequest; +}; + +export default function FormEdit({ isEdit, currentClaim }: Props) { + const navigate = useNavigate(); + + const { enqueueSnackbar } = useSnackbar(); + + const EditClaimSchema = Yup.object().shape({ + organization_id: Yup.string().required('Code Provider is required'), + }); + + const defaultValues = useMemo( + () => ({ + id: currentClaim?.id || '-', + code: currentClaim?.code || '-', + member_name: currentClaim?.member?.name || '-', + date: currentClaim?.submission_date ? fDateTimesecond(currentClaim?.submission_date) : '-', + claim_method: currentClaim?.payment_type || '-', + service_type: currentClaim?.service_code || '-', + organization_id: currentClaim?.organization?.code || '-', + }), + [currentClaim] + ); + + useEffect(() => { + if (isEdit && currentClaim) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + // setFileKondisis(currentClaim?.files_by_type?.claim_diagnosis); + // setFileDiagnosas(currentClaim?.files_by_type?.claim_diagnosis); + setFileHasilPenunjangCurrent(currentClaim?.files_by_type?.claim_result); + }, [isEdit, currentClaim]); + + + const methods = useForm({ + resolver: yupResolver(EditClaimSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const values = watch(); + + const [isCheckingLimit, setIsCheckingLimit] = useState(false); + const [isEligible, setIsEligible] = useState(false); + const [memberBenefits, setMemberBenefits] = useState([]); + const [diagnosisOption, setDiagnosisOption] = useState([]); + const [isMemberDialogOpen, setIsMemberDialogOpen] = useState(false); + const [member, setMember] = useState({}) + + // ---------------------------------------------------------------------- + + // Files Result Kondisi + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState, index) => { + setFileKondisis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + // Files Result Diagnosa + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + + const handleDiagnosaInputChange = (event) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState, index) => { + setFileDiagnosas( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + // Files Result Hasil Penunjang + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + const [fileHasilPenunjangsCurrent, setFileHasilPenunjangCurrent] = useState([]); + + const handleResultInputChange = (event) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState, index) => { + setFileHasilPenunjangs( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + + const onSubmit = async (data: FormValuesProps) => { + try { + // const formData = new FormData(); + // formData.append('result_files', fileHasilPenunjangs); + // formData.append('diagnosa_files', fileDiagnosaInput); + // formData.append('kondisi_files', fileKondisiInput); + // formData.append('provider_code', data.organization_id); + // formData.append('_method', 'PUT'); + const formData = makeFormData({ + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis, + provider_code: data.organization_id, + _method: 'PUT' + }); + + const response = await axios.put(`/claim-requests/${data.id}`, formData); + + reset(); + enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); + navigate('/claim-requests'); + } catch (error: any) { + if (error && error.response.status === 422) { + for (const [key, value] of Object.entries(error.response.data.errors)) { + // setError(key, { message: value[0] }); + enqueueSnackbar('Failed Processing Request', { variant: 'error' }); + } + } else { + enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); + } + } + }; + + + return ( + + + + navigate(`/claim-requests`)} > + + + + + {'Edit Claim Requests'} + + + + + + + + Code* + + + Name* + + + + + + + + {/* */} + + + + + + Date of Submission* + + + Claim Method* + + + Service Type* + + + Code Provider* + + + + + + + + ), }} + name="date" label="Date of Submission" disabled/> + + + + + + + + + + + + + {/* -------------------------------Upload Dokumen Kondisi------------------------------- */} + + + Condition Document + + + {fileKondisis && + fileKondisis.map((file, index) => ( + + {file.name} + { + removeKondisiFiles(fileKondisis, index); + }} + > + + ))} + + + fileKondisiInput.current?.click()}> + + + + Add File + + + + + + + {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} + + + Diagnosis Document + + + {fileDiagnosas && + fileDiagnosas.map((file, index) => ( + + {file.name} + { + removeDiagnosaFiles(fileDiagnosas, index); + }} + > + + ))} + + + fileDiagnosaInput.current?.click()}> + + + + Add Result + + + + + + + {/* -------------------------------Upload Result Hasil Penunjang------------------------------- */} + + + Supporting Result Document + + + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file, index) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + > + + ))} + + + fileHasilPenunjangInput.current?.click()}> + + + + Add Result + + + + + + + + + + + + + + + Update + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/CreateUpdate.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/CreateUpdate.tsx new file mode 100644 index 00000000..c710deaa --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/CreateUpdate.tsx @@ -0,0 +1,63 @@ +import * as Yup from 'yup'; +import { Box, IconButton } from '@mui/material'; +import { ArrowBackIosNew } from '@mui/icons-material'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Autocomplete, Button, Card, Collapse, Container, Divider, Grid, Stack, Table, TableBody, TableCell, TableRow, TextField, Typography } from '@mui/material'; +import { Controller, useForm } from 'react-hook-form'; +import { useParams } from 'react-router-dom'; +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; +import { FormProvider, RHFCheckbox, RHFSelect, RHFTextField } from '../../components/hook-form'; +import Page from '../../components/Page'; +import useSettings from '../../hooks/useSettings'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import MemberSelectDialog from '../../components/dialogs/MemberSelectDialog'; +import { styled } from '@mui/system'; +import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { LoadingButton } from '@mui/lab'; +import { fCurrency } from '../../utils/formatNumber'; +import Iconify from '../../components/Iconify'; +import { ClaimRequest } from '@/@types/claims'; +import FormEdit from './Components/FormEdit'; +import FormCreate from './Components/FormCreate'; + +export default function ClaimsCreateUpdate() { + + const { themeStretch } = useSettings(); + const { id } = useParams(); + + const isEdit = id ? true : false; + + const [currentClaim, setCurrentClaim] = useState(); + + useEffect(() => { + if (isEdit) { + axios.get('/claim-requests/' + id).then((res) => { + console.log('Yeet', res.data); + setCurrentClaim(res.data.data); + }); + + console.log(currentClaim) + } + }, [id]); + + + return ( + + + { + id == undefined + ? + ( + + ) + : + ( + + ) + } + + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx new file mode 100644 index 00000000..480fd05a --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx @@ -0,0 +1,431 @@ +import { + Container, + Grid, + Stack, + Typography, + Card, + Dialog, + TableRow, + Tab, + TableCell, + Collapse, + AccordionSummary, + AccordionDetails, + IconButton, + } from '@mui/material'; +// components +import Page from '../../../components/Page'; +// utils +import useSettings from '../../../hooks/useSettings'; +// react +import { useNavigate, useParams, useLocation } from 'react-router-dom'; +import { useEffect, useState, useRef, useMemo } from 'react'; +import axios from '../../../utils/axios'; +// pages +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import { DetailFinalLogType } from './Model/Types'; +import { fDate, fDateTimesecond } from '@/utils/formatTime'; +import { Button } from '@mui/material'; +import DialogConfirmation from '../FinalLog/Components/DialogConfirmation'; +import Label from '@/components/Label'; +import { Box } from '@mui/system'; +import { Accordion } from '@mui/material'; +import { Delete, EditOutlined, ExpandMore } from '@mui/icons-material'; +import {BenefitData } from '../FinalLog/Model/Types' +import AddIcon from '@mui/icons-material/Add'; + +// Import Card Detail Final LOG +import CardDetail from '../Components/CardDetail'; +import CardService from '../Components/CardService'; +import CardExclusion from '../Components/CardExclusion'; +import CardBenefit from '../Components/CardBenefit'; + +// Import Dialog +import DialogHospitalCare from './Components/DialogHospitalCare'; +import DialogBenefit from './Components/DialogBenefit'; +import DialogMedicine from './Components/DialogMedicine'; +import DialogDelete from './Components/DialogDelete'; +import DialogEditBenefit from './Components/DialogEditBenefit'; +import { DialogDeleteMedicine } from './Components/DialogDelete'; + +import MoreMenu from '@/components/MoreMenu'; +import { MenuItem } from '@mui/material'; +import { fNumber } from '@/utils/formatNumber'; +import palette from '@/theme/palette'; +import CardMedicine from '../Components/CardMedicine'; +import CardFile from '../Components/CardFile'; + + +// ---------------------------------------------------------------------- + +export default function Detail() { + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const [requestLog, setRequestLog] = useState(); + + + const { id } = useParams(); + + useEffect(() => { + axios + .get('customer-service/request/'+id) + .then((response) => { + setRequestLog(response.data.data) + }) + .catch((error) => { + console.error(error); + }) + }, [id]); + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + const marginBottom2 = { + marginBottom: 2, + } + + const [openDialogSubmit, setOpenDialogSubmit] = useState(false); + const [openDialogHospital, setDialogHospital] = useState(false); + const [openDialogBenefit, setDialogBenefit] = useState(false); + const [openDialogMedicine, setDialogMedicine] = useState(false); + + // Handel Delete Detail Benefit + const [idBenefitData, setIdBenefitData] = useState(); + const [openDialogDeleteBenefit, setDialogDeleteBenefit] = useState(false) + + const [approve, setApprove] = useState('') + + // Handle Edit Detail Benefit + const [openDialogEditBenefit, setDialogEditBenefit] = useState(false) + const [BenefitConfigurationData, setBenefitConfigurationData] = useState(); + return ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + {(requestLog && requestLog.code ? requestLog.code : '')} + + + {/* Detail */} + + + + + + {/* Service */} + + + + + + {/* Exclusion */} + + + + + + {/* Hospital Care */} + {/* + + + History of Hospital Care + + + + + + */} + + {/* Benefit */} + + + + Benefit + + + + {requestLog?.benefit_data?.map((item, index) => ( + + + + + + + {item.benefit?.description} + + + + + { + setDialogEditBenefit(true) + setIdBenefitData(item.id) + setBenefitConfigurationData(item) + }} + > + + Edit + + { + setIdBenefitData(item.id) + setDialogDeleteBenefit(true) + }} + > + + Delete + + + } /> + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {fNumber(item.amount_incurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(item.amount_approved)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(item.amount_not_approved)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid* + + + + + {fNumber(item.excess_paid)} + + + + + + {/* Keterangan* */} + + + + + Keterangan* + + + + + {item.keterangan} + + + + + + + + + + + + ))} + + + + + {/* PR Buat pindahin ke componen */} + {/* + + */} + + + {/* Dialog Edit */} + + + + {/* Dialog Delete */} + + + + {/* Medicine */} + + + + Medicine + + + + {requestLog?.medicine.map((item, index) => ( + + {item.medicine} + Rp. {fNumber(item.price)} + { + setIdBenefitData(item.id) + setDialogDeleteBenefit(true) + }}> + + + + + ))} + + + + + + + {/* File */} + + + + + {requestLog?.status_final_log == 'requested' ? ( + + + <> +
+ +
+
+ +
+ + +
+
+ ) : null} + +
+
+
+ ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/DetailStepper.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/DetailStepper.tsx new file mode 100644 index 00000000..b788e29f --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/DetailStepper.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stepper from '@mui/material/Stepper'; +import Step from '@mui/material/Step'; +import StepLabel from '@mui/material/StepLabel'; +import { useEffect, useState } from 'react'; +import ClearIcon from '@mui/icons-material/Clear'; + +const steps = [ + 'Request', + 'Review', + 'Approval', + 'Decline', + ]; + + export default function HorizontalLinearAlternativeLabelStepper({data}) { + const [active, setActive] = useState(0); + const [status, SetStatus] = useState(null); + let updatedSteps = [...steps]; + useEffect(() => { + if (data && data.data) { + if (data.data.status.status === 'requested') { + setActive(1); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'reviewed') { + setActive(2); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'approved') + { + setActive(3); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if(data.data.status.status === 'declined') + { + setActive(4) + updatedSteps = updatedSteps.filter(step => step !== 'Approval'); + } + } + SetStatus(updatedSteps); + }, [data]); + + + + + return ( + + + {status?.map((label) => ( + + : ''}>{label} + + ))} + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/DetailTimeline.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/DetailTimeline.tsx new file mode 100644 index 00000000..f62a706d --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/DetailTimeline.tsx @@ -0,0 +1,426 @@ +import * as React from 'react'; +import Timeline from '@mui/lab/Timeline'; +import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; +import TimelineSeparator from '@mui/lab/TimelineSeparator'; +import TimelineConnector from '@mui/lab/TimelineConnector'; +import TimelineContent from '@mui/lab/TimelineContent'; +import TimelineDot from '@mui/lab/TimelineDot'; +import {Typography, Card, Stack, ButtonBase, Box, Divider} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import Iconify from '../../components/Iconify'; +import { useEffect, useState, useRef } from 'react'; +import { format } from 'date-fns'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; +import DescriptionIcon from '@mui/icons-material/Description'; +import { LoadingButton } from '@mui/lab'; +import axios from '../../utils/axios'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { enqueueSnackbar } from 'notistack'; +import { useParams} from 'react-router-dom'; + +const Item1 = styled(Paper)(({ theme }) => ({ + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + backgroundColor: '#919EAB29', + color: '#637381', + width: 'fit-content', + marginRight: 'auto', +})); + +const Item2 = styled(Paper)(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + color: theme.palette.text.secondary, + width: 'fit-content', + marginLeft: 'auto', +})); + +export default function NoOppositeContent({data}) { + const [timeline, setTimeline] = useState(null); + const [requestFile, setRequestFile] = useState(null); + const [document, setDocument] = useState(null); + useEffect(() => { + if (data && data.data) { + setTimeline(data.data.timeline); + setRequestFile(data.data.request_files); + setDocument(data.data.documents); + } + + }, [data]); + + // Diagnosis + const fileRequestDocumentInputDiagnosis = useRef(null); + const [fileDiagnosis, setFileDiagnosis] = useState([]); + const handleRequestDocumentInputChangeDiagnosis = (event) => { + if (event.target.files[0]) { + setFileDiagnosis([...fileDiagnosis, ...event.target.files]); + } + }; + const removeFileDiagnois = (filesState, index) => { + setFileDiagnosis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Kondisi + const fileRequestDocumentInputKondisi = useRef(null); + const [fileKondisi, setFileKondisi] = useState([]); + const handleRequestDocumentInputChangeKondisi = (event) => { + if (event.target.files[0]) { + setFileKondisi([...fileKondisi, ...event.target.files]); + } + }; + const removeFileKondisi = (filesState, index) => { + setFileKondisi( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Result + const fileRequestDocumentInputResult = useRef(null); + const [fileResult, setFileResult] = useState([]); + const handleRequestDocumentInputChangeResult = (event) => { + if (event.target.files[0]) { + setFileResult([...fileResult, ...event.target.files]); + } + }; + const removeFileResult = (filesState, index) => { + setFileResult( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + const { id } = useParams(); + const [submitLoading, setSubmitLoading] = useState(false); + const submitRequestFiles = () => { + setSubmitLoading(true); + const formData = makeFormData({ + fileDiagnosis: fileDiagnosis, + fileKondisis: fileKondisi, + fileResults: fileResult + }); + axios + .post('claim-requests/'+id+'/request-files', formData) + .then((response) => { + window.location.reload(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }); + } + const submitButton = requestFile?.find((dataRequestFile) => dataRequestFile.check_files === null); + return ( + <> + {timeline?.map((dataTimeline, index) => ( + + {dataTimeline.date ? format(new Date(dataTimeline.date), "d MMM yyyy") : ''} + + + + + + + + + + {dataTimeline.date ? format(new Date(dataTimeline.date), "HH : mm") : ''} + {dataTimeline.txt_status} + + + Detail: + {dataTimeline.description} + + {dataTimeline.status === 'reviewed' && requestFile ? ( + <> + {submitButton ? ( + Request Document + ) : ( + Request Document Success Uploaded + )} + {/* Diagnosis */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-diagnosis' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Diagnosis + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosis && + fileDiagnosis.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileDiagnois(fileDiagnosis, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputDiagnosis.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeDiagnosis(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Kondisi */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-kondisi' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Condition + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisi && + fileKondisi.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileKondisi(fileKondisi, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputKondisi.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeKondisi(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Supporting Result */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-result' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Supporting Result + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileResult && + fileResult.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileResult(fileResult, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputResult.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeResult(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {submitButton ? ( + { + submitRequestFiles(); + }} + loading={submitLoading} + > + Submit + + ) : ''} + + ) : ''} + + + {dataTimeline.status === 'requested' ? ( + + + + + Documents + + + {document?.map((dataDocument, index) => ( + + + {dataDocument.type === 'claim-diagnosis' ? + 'Diagnosis' + : dataDocument.type === 'claim-kondisi' ? + 'Condition' + : dataDocument.type === 'claim-result' ? + 'Supporting Result' + : dataDocument.type === 'claim-invoice' ? + 'Invoice' + : ''} + + + + + {dataDocument.original_name ? dataDocument.original_name : '-'} + + + + ))} + + + + ) : ''} + + + + ))} + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Index.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Index.tsx new file mode 100644 index 00000000..d26903b0 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Index.tsx @@ -0,0 +1,30 @@ +import { Card, Stack } from "@mui/material"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import List from "./List"; + + + +export default function Claims() { + + const pageTitle = 'Claim Request'; + return ( + + + + + {/* */} + + {/* */} + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx new file mode 100644 index 00000000..fe591df7 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx @@ -0,0 +1,582 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + IconButton, + MenuItem, + Table, + TableBody, + TableCell, + TableRow, + TextField, + Typography, + Stack, + Menu, + ButtonGroup, + Link, + Chip, + TableHead, + Grid, +} from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; + +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +// hooks +import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; +import useSettings from '@/hooks/useSettings'; +// components +import axios from '../../../utils/axios'; +import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../../@types/paginated-data'; +import DataTable from '../../../components/LaravelTable'; +import { fCurrency } from '../../../utils/formatNumber'; +import EditRoundedIcon from '@mui/icons-material/EditRounded'; +import { LoadingButton } from '@mui/lab'; +import { enqueueSnackbar } from 'notistack'; +import { Divider } from '@mui/material'; +import Iconify from '@/components/Iconify'; +import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { capitalizeFirstLetter } from '@/utils/formatString'; +import Label from '@/components/Label'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import { Import } from '@/@types/claims'; + +import { FinalLogType } from '../FinalLog/Model/Types'; +// import LoadingButton from '@/theme/overrides/LoadingButton'; + +export default function List() { + const { themeColorPresets } = useSettings(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + + const navigate = useNavigate() + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(''); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? ''; + setSearchText(newSearchText); + }; + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch({ search: searchText }); // Trigger to Parent + }; + + useEffect(() => { + // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, []); + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); + const [importLoading, setImportLoading] = useState(false); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected'); + } + }; + + const handleCancelImportButton = () => { + importForm.current.value = ''; + importForm.current.dispatchEvent(new Event('change', { bubbles: true })); + }; + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name); + } else { + setCurrentImportFileName(null); + } + }; + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append('file', importForm.current?.files[0]); + + setImportLoading(true); + axios + .post(`claim-requests/import`, formData) + .then((response) => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + setImportLoading(false); + }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + setImportLoading(false); + }); + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }); + } + }; + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + const handleGetData = (type :string) => { + axios.get(`corporates/${corporate_id}/data-plan-benefit`) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + return ( +
+ + {!currentImportFileName && ( + + + + + Import + {handleGetTemplate('claim-request')}}>Download Template + {handleGetData('data-plan-benefit')}}>Download Claim Request + + {/* */} + + )} + + {currentImportFileName && ( + + + + + + + } + sx={{ p: 1.8 }} + onClick={handleUpload} + loading={importLoading} + > + Upload + + + )} + {importResult && ( + + + Last Import Result Report :{' '} + + {importResult.result_file?.name ?? '-'} + + + + )} +
+ ); + } + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState( + LaravelPaginatedDataDefault + ); + + const loadDataTableData = async (appliedFilter: any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/customer-service/request?final_log=1&service_code=OP', { params: filter }); + // console.log(response.data); + setDataTableLoading(false); + + setDataTableData(response.data); + }; + + const applyFilter = async (searchFilter: { search: string }) => { + await loadDataTableData(searchFilter); + setSearchParams(searchFilter); + }; + + const handlePageChange = (event: ChangeEvent, value: number): void => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + }; + + const handleApprove = (claimRequest) => { + axios + .post(`claim-requests/${claimRequest.id}/approve`) + .then((response) => { + enqueueSnackbar('Success Approve', { variant: 'success' }); + loadDataTableData(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + }; + + useEffect(() => { + loadDataTableData(); + }, []); + + const headStyle = { + fontWeight: 'bold', + }; + + // Called on every row to map the data to the columns + function createData(data: FinalLogType) { + return { + ...data, + }; + } + + { + /* ------------------ TABLE ROW ------------------ */ + } + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + const [loadingApprove, setLoadingApprove] = React.useState(false); + + return ( + + *': { borderBottom: 'unset' } }}> + {/* + setOpen(!open)}> + {open ? : } + + */ } + {/* + { + // handleShowClaim(row); + // }} + > + {row.id} + + */} + {row.code} + {row.member?.full_name} + + {row.service_name} + {row.payment_type_name} + + { row.status_final_log == "requested" ? + () : + row.status_final_log == "declined" ? + () + : + () + } + + + + {/* navigate(`/claim-requests/edit/${row.id}`)}> + + Edit + */} + navigate ('/custormer-service/final-log/detail/'+row.id+'')}> + + Detail + + + } /> + + {/* + + { + handleShowClaim(row); + }} + > + + + */} + + {/* COLLAPSIBLE ROW */} + + + + + } + spacing={1} + sx={{ marginY: 2 }} + > + + Berkas Hasil Penunjang + {/* {row.files_by_type?.claim_kondisi && + row.files_by_type?.claim_kondisi.map((file, index) => ( + + -{' '} + + {file.name} + + + ))} */} + + {row.files_by_type?.claim_kondisi && ( + <> + - Kondisi + {row.files_by_type?.claim_kondisi.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_diagnosis && ( + <> + - Diagnosa + {row.files_by_type?.claim_diagnosis.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_result && ( + <> + - Hasil + {row.files_by_type?.claim_result.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + {(!row.files_by_type?.claim_result && !row.files_by_type?.claim_diagnosis && !row.files_by_type?.claim_kondisi)&& Tidak ada berkas} + + + + + + + + ); + } + { + /* ------------------ END TABLE ROW ------------------ */ + } + + function TableContent() { + return ( + + {/* ------------------ TABLE HEADER ------------------ */} + + + {/* */} + {/* + ID Request LOG + */} + + Code + + + Name + + + Date of Submission + + + Service Type + + + Claim Method + + + Status + + + + + {/* ------------------ END TABLE HEADER ------------------ */} + + {/* ------------------ TABLE ROW ------------------ */} + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length === 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableData.data.map((row) => ( + + ))} + + )} + {/* ------------------ END TABLE ROW ------------------ */} +
+ ); + } + + // --------------------------------------------------------- + // Dialog Detail Claim Request + const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false); + const [loadingClaimDetail, setLoadingClaimDetail] = useState(true); + const [currentClaim, setCurrentClaim] = useState(null); + + function handleShowClaim(claimRequest) { + setLoadingClaimDetail(true); + setOpenDialogDetailClaim(true); + + axios + .get(`/claim-requests/${claimRequest.id}`) + .then(({ data }) => { + setCurrentClaim(data.data); + setLoadingClaimDetail(false); + }) + .catch((err) => { + enqueueSnackbar(err.message, { variant: 'error' }); + }); + } + + function handleDownloadLog() {} + + return ( + + + + + + + } + /> + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Functions.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Functions.tsx new file mode 100644 index 00000000..753fca55 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Functions.tsx @@ -0,0 +1,190 @@ +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { MedicineType, MemberListType } from './Types'; +import { BenefitConfigurationListType } from './Types'; +import { makeFormData } from '@/utils/jsonToFormData'; + +/** + * Listing Member + */ +export const getMemberList = async ( page: number, keyword: string ): Promise => { + const response = await axios.get(`/claim-requests/list-member?page=${page}&keyword=${keyword}`) + .then((res) =>{ + return res.data.data.member_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Add Claim Request + */ +export const addClaimRequest = async ( data: MemberListType[] ): Promise => { + // Mapping + const formData = new FormData(); + + data.map((row, index) => { + formData.append(`member_id[${index}]`, row.id.toString()); + formData.append(`service_code[${index}]`, row.patien_type??''); + + if (row.file_kondisi != undefined) { + row.file_kondisi.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_kondisi[member_${row.id}][${file_index}]`, file); + }); + } + + if (row.file_diagnosa != undefined) { + row.file_diagnosa.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_diagnosa[member_${row.id}][${file_index}]`, file); + }); + } + + if (row.file_penunjang != undefined) { + row.file_penunjang.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_penunjang[member_${row.id}][${file_index}]`, file); + }); + } + }) + + // Axios + const response = await axios.post(`/claim-requests`, formData) + .then((res) =>{ + enqueueSnackbar("Berhasil membuat data !", { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return false; + }); + + return response; +}; + +/** + * Add Benefit + */ + +export const postAddBenefit = async (data: BenefitConfigurationListType):Promise => { + const response = await axios.post(`customer-service/request/insert-benefit`, { + ...data + }) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + // for (const key in arr_message) { + enqueueSnackbar(arr_message, { + variant: 'warning', + }); + // } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +} + +/** + * Edit Benefit + */ +export const postEditBenefit = async (id:number|undefined, data: BenefitConfigurationListType):Promise => { + const response = await axios.put(`customer-service/request/benefit_data/${id}`, { + ...data + }) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + // for (const key in arr_message) { + enqueueSnackbar(arr_message, { + variant: 'warning', + }); + // } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +} + +/** + * Add Medicine + */ + +export const postAddMedince = async (data: MedicineType):Promise => { + const response = await axios.post(`customer-service/request/medicine-data`, { + ...data + }) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + // for (const key in arr_message) { + enqueueSnackbar(arr_message, { + variant: 'warning', + }); + // } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx new file mode 100644 index 00000000..ad56d099 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx @@ -0,0 +1,139 @@ +import { Member } from "@/@types/member" + +/** + * Search Type + */ +export type SearchType = { + keyword: string, +} + +/** + * Member List + */ +export type FinalLogType = { + id : number, + code : string, + member : Member, + member_name : string, + submission_date : string, + service_name : string, + payment_type_name : string, + status_final_log : string, + status : string, + files_by_type : files_by_type, +} + + +export type DetailFinalLogType = { + id : number, + code : string, + member_id : string, + policy_number : string, + name : string|any, + date_of_birth : string, + gender : string, + marital_status : string, + submission_date : string, + service_type : string, + claim_method : string, + status : string, + status_final_log : string, + benefit : Benefit[], + benefit_data : BenefitData[], + config_service : ConfigService, + exclusion : Exclusion[], + medicine : Medicine[], + files : file[], +} + +export type BenefitData = { + amount_incurred : number, + amount_approved : number, + amount_not_approved : number, + excess_paid : number, + keterangan : string, + benefit : Benefit, + request_log_id : number, + benefit_name : string, + description : string, + id : number, +} + +export type BenefitConfigurationListType = { + request_log_id: number|undefined, + benefit_name: string, + benefit: { + description: string + }, + amount_incurred: number, + amount_approved: number, + amount_not_approved: number, + excess_paid: number, + keterangan: string, + description: string, +} + +export type Benefit = { + id: number, + code: string, + description: string +} + +export type files_by_type = { + claim_diagnosis : file[], + claim_kondisi : file[], + claim_result : file[], +} + +export type file = { + original_name: string, + name: string, + path: string, + url: string, +} + +export type ConfigService = { + gp_external_doctor_online: string, + gp_external_doctor_offline: string, + gp_internal_doctor_online: string, + gp_internal_doctor_offline: string, + sp_external_doctor_online: string, + sp_external_doctor_offline: string, + sp_internal_doctor_online: string, + sp_internal_doctor_offline: string, + vitamins: string, + delivery_fee: string, + general_practitioner_fee: string, + specialist_practitioner_fee: string +} + +export type Exclusion = { + exclusionable: { + code: string, + name: string + }, + rules: Rule[] +} + +export type Rule = { + id: number, + exclusion_id: number, + name: string, + values: string, + +} + +export type MedicineType = { + medicine: Medicine[], +} + +export type Medicine = { + id: number, + medicine_name: string, + medicine_price: number, + medicine: string, + price: number, + request_log_id: number|undefined, +} + + diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/DialogConfirmation.tsx new file mode 100644 index 00000000..fe3a734b --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/DialogConfirmation.tsx @@ -0,0 +1,109 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useState } from 'react'; +import { DetailRequestLogType } from "../Model/Types"; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + approve: string; + requestLog: DetailRequestLogType|undefined; +} + +export default function DialogConfirmation({requestLog, setOpenDialog, openDialog, approve, onSubmit} : DialogConfirmationType ) { + + const navigate = useNavigate(); + const handleSubmit = () => { + const formData = { + status : approve + } + axios + .put(`customer-service/request/${requestLog?.id}`, formData) + .then((response) => { + enqueueSnackbar('Verification Request LOG Success', { variant: 'success' }); + setOpenDialog(false); + navigate('/custormer-service/request') + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const getContent = () => ( + + Are you sure to {approve == 'approved' ? 'approve' : 'deciline'} this request ? + + + + Member ID + {requestLog?.member_id} + + + Policy Number + {requestLog?.policy_number} + + + Name + {requestLog?.name} + + + Submission Date + {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} + + + Claim Method + {requestLog?.claim_method ? toTitleCase(requestLog?.claim_method) : '-'} + + + Service Type + {requestLog?.service_type} + + + + + + + {approve == 'approved' ? ( + + ) : ( + + ) } + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreate.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreate.tsx new file mode 100644 index 00000000..d952f5e3 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreate.tsx @@ -0,0 +1,355 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, CircularProgress , Button, styled, Stack, IconButton, Card} from '@mui/material'; +import { LoadingButton } from '@mui/lab'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - +import FormCreateSearch from './FormCreateSearch'; +import FormCreateListChoose from './FormCreateListChoose'; +import FormCreateBtnUpload from './FormCreateBtnUpload'; + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { ArrowBackIosNew } from '@mui/icons-material'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from '../Model/Types'; +import { addClaimRequest, getMemberList } from '../Model/Functions'; +import palette from '@/theme/palette'; +import FormCreateFilesUpload from './FormCreateFilesUpload'; +import useLoadOnScroll from '@/hooks/useLoadOnScroll'; +import useCollapseDrawer from '@/hooks/useCollapseDrawer'; +import FormCreateBtnChoose from './FormCreateBtnChoose'; +import axios from '../../../utils/axios'; + +export default function FormCreate() { + const navigate = useNavigate() + const defaultListChoosed:MemberListType[] = []; + + // State + // ------------------------- + const [keyword, setKeyword] = useState(''); + const [listChoosed, setListChoosed] = useState([]); + const [isChoosed, setIsChoosed] = useState(false); + const [formIsLoading, setFormIsLoading] = useState(false); + + // List Choose - auto Scroll + // ------------------------- + const fetchFunction = async (page: number): Promise => getMemberList(page, keyword) + + const {data: MemberList, isLoading: scrollIsLoading, setData, resetLastPage, refetchData} = useLoadOnScroll(fetchFunction); + + // List Choose - Search + // ------------------------- + const handleSearch = (keyword: string) => { + setData([]) + resetLastPage() + setKeyword(keyword) + refetchData() + } + + // Function - Clear Form + // ----------------------------- + const clearForm = () => { + setListChoosed(defaultListChoosed); + setIsChoosed(false); + } + + // Function - Choose Patien Type + // ----------------------------- + const handleChoosePatienType = (data: MemberListType, type: string) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + list.patien_type = type + } + + return list; + }) + setListChoosed(newListChoosed) + } + + // Function - Handle Btn Upload + // ----------------------------- + const handleChangeInput = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', file: any) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'kondisi') { + if (list.file_kondisi == undefined) { + list.file_kondisi = [file]; + } + else { + list.file_kondisi.push(file); + } + } + + if (type_file == 'diagnosa') { + if (list.file_diagnosa == undefined) { + list.file_diagnosa = [file]; + } + else { + list.file_diagnosa.push(file); + } + } + + if (type_file == 'penunjang') { + if (list.file_penunjang == undefined) { + list.file_penunjang = [file]; + } + else { + list.file_penunjang.push(file); + } + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Remove Fle + // ----------------------------- + const handleRemoveFile = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', target_index: number) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'kondisi') { + list.file_kondisi = list.file_kondisi?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'diagnosa') { + list.file_diagnosa = list.file_diagnosa?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'penunjang') { + list.file_penunjang = list.file_penunjang?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Submit Form + // ----------------------------- + const handleSubmit = async () => { + setFormIsLoading(true) + let response = await addClaimRequest(listChoosed) + setFormIsLoading(false) + + if (response == true) { + clearForm() + } + } + + + + let isDirty = listChoosed.some((row) => { + if (row.patien_type == undefined) { + return true + } + }) + + return ( + + {/* Back Button */} + + isChoosed==false ? navigate(`/claim-requests`) : setIsChoosed(false)} > + + + + + {'Create Claim Requests'} + + + + {/* Choose Section */} + + {/* Search */} + + handleSearch('')} onSubmit={(keyword) => handleSearch(keyword)} /> + + + + + {/* List */} + + + { + MemberList.map((row, index) => { + return ( + { + checked ? setListChoosed((prevData) => [...prevData, data]) : setListChoosed((items) => items.filter(item => item.id != data.id)) + }} + /> + ) + }) + } + + + + {/* Loading */} + + + + + {/* Submit List */} + + setIsChoosed(true)} /> + + + + + + {/* Input Section */} + + { + listChoosed.map((row, index) => { + return ( + + + {/* Patien Name */} + + + + + {row.name} + + + {row.member_id} + + + + + + + {/* Patien Type */} + + + {row.service_type.map((r,i) => { + const code = r.code + return ( + + + + ) + })} + + + + {/* File Kondisi */} + + + + Condition Document + + + {row.file_kondisi && row.file_kondisi.map((file, index) => ( + + handleRemoveFile(row, 'kondisi', index)} /> + + ))} + + + handleChangeInput(row, 'kondisi', file)} /> + + + + + {/* File Diagnosa */} + + + + Diagnosis Document + + + {row.file_diagnosa && row.file_diagnosa.map((file, index) => ( + + handleRemoveFile(row, 'diagnosa', index)} /> + + ))} + + + handleChangeInput(row, 'diagnosa', file)} /> + + + + + {/* File Penunjang */} + + + + Supporting Result Document + + + {row.file_penunjang && row.file_penunjang.map((file, index) => ( + + handleRemoveFile(row, 'penunjang', index)} /> + + ))} + + + handleChangeInput(row, 'penunjang', file)} /> + + + + + + + ) + }) + } + + + + + handleSubmit()}> + Save Changes + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateBtnChoose.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateBtnChoose.tsx new file mode 100644 index 00000000..cffd3bc3 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateBtnChoose.tsx @@ -0,0 +1,39 @@ +import { styled, Button } from "@mui/material"; +import useCollapseDrawer from "@/hooks/useCollapseDrawer"; + +/** + * Custom Style + * ============================================ +*/ +const DivCustom1 = styled('div')(({ theme }) => ({ + background: 'white', + position: 'fixed', + left: '350px', + right: 0, + bottom: 0, + paddingLeft: '32px', + paddingRight: '32px', + paddingTop: '32px', + paddingBottom: '48px', + [theme.breakpoints.between('sm', 'lg')]: { + left: '0px', + }, +})); + +type Props = { + disabled: boolean, + title : string, + handleClickProp: () => void +} + +export default function FormCreateBtnChoose ({disabled, title, handleClickProp}: Props) { + const { collapseClick } = useCollapseDrawer(); + + return ( + + + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateBtnUpload.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateBtnUpload.tsx new file mode 100644 index 00000000..23df5ed5 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateBtnUpload.tsx @@ -0,0 +1,39 @@ +import { useRef } from "react"; +import { Box, ButtonBase, Typography } from "@mui/material"; +import Iconify from "@/components/Iconify"; + +type Props = { + handleChangeInputProp: (event: any) => void +} + +export default function FormCreateBtnUpload ({handleChangeInputProp}: Props) { + const fileInput = useRef(null); + + return ( + fileInput.current?.click()}> + + + + Upload Result + + + handleChangeInputProp(event.target.files ? event.target.files[0] : {})} + accept="application/pdf" + /> + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateFilesUpload.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateFilesUpload.tsx new file mode 100644 index 00000000..7ab9d7bd --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateFilesUpload.tsx @@ -0,0 +1,25 @@ +import Iconify from "@/components/Iconify"; +import { ArrowBackIosNew, InsertDriveFile } from '@mui/icons-material'; +import { Stack, Typography } from "@mui/material"; + +type Props = { + file: any, + handleRemoveFileProp: () => void, +} + +export default function FormCreateFilesUpload({ file, handleRemoveFileProp }: Props) { + return ( + + + + {file.name ? file.name : '-'} + + {handleRemoveFileProp()}} + sx={{cursor: 'pointer'}} + > + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateListChoose.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateListChoose.tsx new file mode 100644 index 00000000..03c8d0b1 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateListChoose.tsx @@ -0,0 +1,78 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, Card} from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from '../Model/Types'; +import palette from '@/theme/palette'; + +/** + * Props + * ===================================================== + */ +type Props = { + data: MemberListType, + ListChoosed: MemberListType[], + handleCheckedProp: (checked: boolean, data: MemberListType) => void, +}; + +export default function FormCreateListChoose({data, ListChoosed, handleCheckedProp}: Props) { + const [isChoosed, setIsChoosed] = useState(false) + + useEffect(() => { + setIsChoosed(false); + + ListChoosed.forEach(list => { + if (list.id == data.id) { + setIsChoosed(true); + } + }) + }, [ListChoosed]) + + return ( + + { + return isChoosed ? palette.light.primary.lighter : palette.light.background.default + } + }}> + + handleCheckedProp(checked, data)} />} + checked={isChoosed} + /> + + + + {data.name} + + + {data.member_id} + + + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateSearch.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateSearch.tsx new file mode 100644 index 00000000..026b886b --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormCreateSearch.tsx @@ -0,0 +1,70 @@ +/** + * Core + * ============================================ + */ +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import { Grid } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import { FormProvider, RHFTextField } from '@/components/hook-form'; +// - Local - + +/** + * Icon, Utils, Types, Functions + * ============================================ + */ +import { Search } from '@mui/icons-material'; +import { SearchType } from '../Model/Types'; + +type Props = { + onSubmit: (keyword: string) => void, + onEmpty: () => void, +}; + +const FormCreateSearch = ({ onSubmit, onEmpty }: Props) => { + const defaultValuesSearchForm = { + keyword: '' + }; + + const methodsSearchForm = useForm({ + defaultValues: defaultValuesSearchForm + }); + + const { handleSubmit, formState: { isDirty } } = methodsSearchForm; + + // search on submit + const onSubmitSearch = (data: SearchType ) => { + onSubmit(data.keyword); + } + + // search on empty + useEffect(() => { + if (isDirty === false) { + onEmpty() + } + },[isDirty]) + + return ( + + + + }} + sx={{ input: { paddingLeft: '14px' } }} + /> + + + + ) +} + +export default FormCreateSearch diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/FormEdit.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormEdit.tsx new file mode 100644 index 00000000..faa95bf0 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/FormEdit.tsx @@ -0,0 +1,456 @@ +import * as Yup from 'yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate } from 'react-router-dom'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Controller, useForm } from 'react-hook-form'; +import React, { useRef, useEffect, useMemo, useState } from 'react'; +import axios from '../../../utils/axios'; +import { FormProvider, RHFTextField } from '../../../components/hook-form'; + +import { makeFormData } from '@/utils/jsonToFormData'; +import { + Autocomplete, + Button, + Grid, + Stack, + Table, + TableBody, + TableCell, + TableRow, + TextField, + Typography, + useTheme, + List, + ListItem, + IconButton, + ListItemAvatar, + Avatar, + ListItemText, + Card, + InputAdornment, + Divider, + ButtonBase, + Box, +} from '@mui/material'; +import Iconify from '../../../components/Iconify'; +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import { LoadingButton } from '@mui/lab'; +import { fCurrency } from '../../../utils/formatNumber'; +import MemberSelectDialog from '../../../components/dialogs/MemberSelectDialog'; +import { Add, ArrowBackIosNew, DeleteOutline } from '@mui/icons-material'; +import { ClaimRequest, Files } from '@/@types/claims'; +import { fDateTimesecond } from '@/utils/formatTime'; + +interface FormValuesProps extends Partial { + taxes: boolean; + inStock: boolean; +} + +type Props = { + isEdit: boolean; + currentClaim?: ClaimRequest; +}; + +export default function FormEdit({ isEdit, currentClaim }: Props) { + const navigate = useNavigate(); + + const { enqueueSnackbar } = useSnackbar(); + + const EditClaimSchema = Yup.object().shape({ + organization_id: Yup.string().required('Code Provider is required'), + }); + + const defaultValues = useMemo( + () => ({ + id: currentClaim?.id || '-', + code: currentClaim?.code || '-', + member_name: currentClaim?.member?.name || '-', + date: currentClaim?.submission_date ? fDateTimesecond(currentClaim?.submission_date) : '-', + claim_method: currentClaim?.payment_type || '-', + service_type: currentClaim?.service_code || '-', + organization_id: currentClaim?.organization?.code || '-', + }), + [currentClaim] + ); + + useEffect(() => { + if (isEdit && currentClaim) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + // setFileKondisis(currentClaim?.files_by_type?.claim_diagnosis); + // setFileDiagnosas(currentClaim?.files_by_type?.claim_diagnosis); + setFileHasilPenunjangCurrent(currentClaim?.files_by_type?.claim_result); + }, [isEdit, currentClaim]); + + + const methods = useForm({ + resolver: yupResolver(EditClaimSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const values = watch(); + + const [isCheckingLimit, setIsCheckingLimit] = useState(false); + const [isEligible, setIsEligible] = useState(false); + const [memberBenefits, setMemberBenefits] = useState([]); + const [diagnosisOption, setDiagnosisOption] = useState([]); + const [isMemberDialogOpen, setIsMemberDialogOpen] = useState(false); + const [member, setMember] = useState({}) + + // ---------------------------------------------------------------------- + + // Files Result Kondisi + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState, index) => { + setFileKondisis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + // Files Result Diagnosa + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + + const handleDiagnosaInputChange = (event) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState, index) => { + setFileDiagnosas( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + // Files Result Hasil Penunjang + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + const [fileHasilPenunjangsCurrent, setFileHasilPenunjangCurrent] = useState([]); + + const handleResultInputChange = (event) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState, index) => { + setFileHasilPenunjangs( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + + + const onSubmit = async (data: FormValuesProps) => { + try { + // const formData = new FormData(); + // formData.append('result_files', fileHasilPenunjangs); + // formData.append('diagnosa_files', fileDiagnosaInput); + // formData.append('kondisi_files', fileKondisiInput); + // formData.append('provider_code', data.organization_id); + // formData.append('_method', 'PUT'); + const formData = makeFormData({ + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis, + provider_code: data.organization_id, + _method: 'PUT' + }); + + const response = await axios.put(`/claim-requests/${data.id}`, formData); + + reset(); + enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); + navigate('/claim-requests'); + } catch (error: any) { + if (error && error.response.status === 422) { + for (const [key, value] of Object.entries(error.response.data.errors)) { + // setError(key, { message: value[0] }); + enqueueSnackbar('Failed Processing Request', { variant: 'error' }); + } + } else { + enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); + } + } + }; + + + return ( + + + + navigate(`/claim-requests`)} > + + + + + {'Edit Claim Requests'} + + + + + + + + Code* + + + Name* + + + + + + + + {/* */} + + + + + + Date of Submission* + + + Claim Method* + + + Service Type* + + + Code Provider* + + + + + + + + ), }} + name="date" label="Date of Submission" disabled/> + + + + + + + + + + + + + {/* -------------------------------Upload Dokumen Kondisi------------------------------- */} + + + Condition Document + + + {fileKondisis && + fileKondisis.map((file, index) => ( + + {file.name} + { + removeKondisiFiles(fileKondisis, index); + }} + > + + ))} + + + fileKondisiInput.current?.click()}> + + + + Add File + + + + + + + {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} + + + Diagnosis Document + + + {fileDiagnosas && + fileDiagnosas.map((file, index) => ( + + {file.name} + { + removeDiagnosaFiles(fileDiagnosas, index); + }} + > + + ))} + + + fileDiagnosaInput.current?.click()}> + + + + Add Result + + + + + + + {/* -------------------------------Upload Result Hasil Penunjang------------------------------- */} + + + Supporting Result Document + + + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file, index) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + > + + ))} + + + fileHasilPenunjangInput.current?.click()}> + + + + Add Result + + + + + + + + + + + + + + + Update + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/CreateUpdate.tsx b/frontend/dashboard/src/pages/CustomerService/Request/CreateUpdate.tsx new file mode 100644 index 00000000..c710deaa --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/CreateUpdate.tsx @@ -0,0 +1,63 @@ +import * as Yup from 'yup'; +import { Box, IconButton } from '@mui/material'; +import { ArrowBackIosNew } from '@mui/icons-material'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Autocomplete, Button, Card, Collapse, Container, Divider, Grid, Stack, Table, TableBody, TableCell, TableRow, TextField, Typography } from '@mui/material'; +import { Controller, useForm } from 'react-hook-form'; +import { useParams } from 'react-router-dom'; +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; +import { FormProvider, RHFCheckbox, RHFSelect, RHFTextField } from '../../components/hook-form'; +import Page from '../../components/Page'; +import useSettings from '../../hooks/useSettings'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import MemberSelectDialog from '../../components/dialogs/MemberSelectDialog'; +import { styled } from '@mui/system'; +import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { LoadingButton } from '@mui/lab'; +import { fCurrency } from '../../utils/formatNumber'; +import Iconify from '../../components/Iconify'; +import { ClaimRequest } from '@/@types/claims'; +import FormEdit from './Components/FormEdit'; +import FormCreate from './Components/FormCreate'; + +export default function ClaimsCreateUpdate() { + + const { themeStretch } = useSettings(); + const { id } = useParams(); + + const isEdit = id ? true : false; + + const [currentClaim, setCurrentClaim] = useState(); + + useEffect(() => { + if (isEdit) { + axios.get('/claim-requests/' + id).then((res) => { + console.log('Yeet', res.data); + setCurrentClaim(res.data.data); + }); + + console.log(currentClaim) + } + }, [id]); + + + return ( + + + { + id == undefined + ? + ( + + ) + : + ( + + ) + } + + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Detail.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Detail.tsx new file mode 100644 index 00000000..db8cc17d --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Detail.tsx @@ -0,0 +1,175 @@ +import { + Container, + Grid, + Stack, + Typography, + Card, + Dialog, + } from '@mui/material'; +// components +import Page from '../../../components/Page'; +// utils +import useSettings from '../../../hooks/useSettings'; +// react +import { useNavigate, useParams, useLocation } from 'react-router-dom'; +import { useEffect, useState, useRef, useMemo } from 'react'; +import axios from '../../../utils/axios'; +// pages +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import { DetailRequestLogType } from './Model/Types'; +import { fDate, fDateTimesecond } from '@/utils/formatTime'; +import { Button } from '@mui/material'; +import DialogConfirmation from './Components/DialogConfirmation'; + +// ---------------------------------------------------------------------- + +export default function Detail() { + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const [requestLog, setRequestLog] = useState(); + + + const { id } = useParams(); + + useEffect(() => { + axios + .get('customer-service/request/'+id) + .then((response) => { + setRequestLog(response.data.data) + }) + .catch((error) => { + console.error(error); + }) + }, [id]); + + function toTitleCase(str: string | null) { + return str.replace(/\w\S*/g, function(txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const [openDialogSubmit, setOpenDialogSubmit] = useState(false); + const handleCloseDialogSubmit = () => { + setOpenDialogSubmit(false); + } + + const [approve, setApprove] = useState('') + + return ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + {(requestLog && requestLog.code ? requestLog.code : '')} + + + + + Detail + + Member ID + {requestLog?.member_id} + + + Policy Number + {requestLog?.policy_number} + + + Name + {requestLog?.name} + + + Date Of Birth + {requestLog?.date_of_birth ? fDate(requestLog?.date_of_birth) : '-'} + + + Marital Status + {requestLog?.marital_status} + + + Submission Date + {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} + + + + + + Service + + Service Type + {requestLog?.service_type} + + + Claim Method + {toTitleCase(requestLog?.claim_method ?? '-')} + + {/* + Benefit + +
    + {requestLog?.benefit.length > 0 ? requestLog?.benefit.map((r, index) => ( +
  • {r.code } - {r.description}
  • + )) :
  • -
  • } +
+
+
*/} +
+
+ {requestLog?.status == 'requested' ? ( + + + <> +
+ +
+
+ +
+ + +
+
+ ) : null} + +
+
+
+ ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/DetailStepper.tsx b/frontend/dashboard/src/pages/CustomerService/Request/DetailStepper.tsx new file mode 100644 index 00000000..b788e29f --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/DetailStepper.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stepper from '@mui/material/Stepper'; +import Step from '@mui/material/Step'; +import StepLabel from '@mui/material/StepLabel'; +import { useEffect, useState } from 'react'; +import ClearIcon from '@mui/icons-material/Clear'; + +const steps = [ + 'Request', + 'Review', + 'Approval', + 'Decline', + ]; + + export default function HorizontalLinearAlternativeLabelStepper({data}) { + const [active, setActive] = useState(0); + const [status, SetStatus] = useState(null); + let updatedSteps = [...steps]; + useEffect(() => { + if (data && data.data) { + if (data.data.status.status === 'requested') { + setActive(1); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'reviewed') { + setActive(2); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'approved') + { + setActive(3); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if(data.data.status.status === 'declined') + { + setActive(4) + updatedSteps = updatedSteps.filter(step => step !== 'Approval'); + } + } + SetStatus(updatedSteps); + }, [data]); + + + + + return ( + + + {status?.map((label) => ( + + : ''}>{label} + + ))} + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/DetailTimeline.tsx b/frontend/dashboard/src/pages/CustomerService/Request/DetailTimeline.tsx new file mode 100644 index 00000000..8b2d932c --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/DetailTimeline.tsx @@ -0,0 +1,426 @@ +import * as React from 'react'; +import Timeline from '@mui/lab/Timeline'; +import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; +import TimelineSeparator from '@mui/lab/TimelineSeparator'; +import TimelineConnector from '@mui/lab/TimelineConnector'; +import TimelineContent from '@mui/lab/TimelineContent'; +import TimelineDot from '@mui/lab/TimelineDot'; +import {Typography, Card, Stack, ButtonBase, Box, Divider} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import Iconify from '../../../components/Iconify'; +import { useEffect, useState, useRef } from 'react'; +import { format } from 'date-fns'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; +import DescriptionIcon from '@mui/icons-material/Description'; +import { LoadingButton } from '@mui/lab'; +import axios from '../../../utils/axios'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { enqueueSnackbar } from 'notistack'; +import { useParams} from 'react-router-dom'; + +const Item1 = styled(Paper)(({ theme }) => ({ + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + backgroundColor: '#919EAB29', + color: '#637381', + width: 'fit-content', + marginRight: 'auto', +})); + +const Item2 = styled(Paper)(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + color: theme.palette.text.secondary, + width: 'fit-content', + marginLeft: 'auto', +})); + +export default function NoOppositeContent({data}) { + const [timeline, setTimeline] = useState(null); + const [requestFile, setRequestFile] = useState(null); + const [document, setDocument] = useState(null); + useEffect(() => { + if (data && data.data) { + setTimeline(data.data.timeline); + setRequestFile(data.data.request_files); + setDocument(data.data.documents); + } + + }, [data]); + + // Diagnosis + const fileRequestDocumentInputDiagnosis = useRef(null); + const [fileDiagnosis, setFileDiagnosis] = useState([]); + const handleRequestDocumentInputChangeDiagnosis = (event) => { + if (event.target.files[0]) { + setFileDiagnosis([...fileDiagnosis, ...event.target.files]); + } + }; + const removeFileDiagnois = (filesState, index) => { + setFileDiagnosis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Kondisi + const fileRequestDocumentInputKondisi = useRef(null); + const [fileKondisi, setFileKondisi] = useState([]); + const handleRequestDocumentInputChangeKondisi = (event) => { + if (event.target.files[0]) { + setFileKondisi([...fileKondisi, ...event.target.files]); + } + }; + const removeFileKondisi = (filesState, index) => { + setFileKondisi( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Result + const fileRequestDocumentInputResult = useRef(null); + const [fileResult, setFileResult] = useState([]); + const handleRequestDocumentInputChangeResult = (event) => { + if (event.target.files[0]) { + setFileResult([...fileResult, ...event.target.files]); + } + }; + const removeFileResult = (filesState, index) => { + setFileResult( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + const { id } = useParams(); + const [submitLoading, setSubmitLoading] = useState(false); + const submitRequestFiles = () => { + setSubmitLoading(true); + const formData = makeFormData({ + fileDiagnosis: fileDiagnosis, + fileKondisis: fileKondisi, + fileResults: fileResult + }); + axios + .post('claim-requests/'+id+'/request-files', formData) + .then((response) => { + window.location.reload(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }); + } + const submitButton = requestFile?.find((dataRequestFile) => dataRequestFile.check_files === null); + return ( + <> + {timeline?.map((dataTimeline, index) => ( + + {dataTimeline.date ? format(new Date(dataTimeline.date), "d MMM yyyy") : ''} + + + + + + + + + + {dataTimeline.date ? format(new Date(dataTimeline.date), "HH : mm") : ''} + {dataTimeline.txt_status} + + + Detail: + {dataTimeline.description} + + {dataTimeline.status === 'reviewed' && requestFile ? ( + <> + {submitButton ? ( + Request Document + ) : ( + Request Document Success Uploaded + )} + {/* Diagnosis */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-diagnosis' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Diagnosis + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosis && + fileDiagnosis.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileDiagnois(fileDiagnosis, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputDiagnosis.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeDiagnosis(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Kondisi */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-kondisi' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Condition + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisi && + fileKondisi.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileKondisi(fileKondisi, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputKondisi.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeKondisi(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Supporting Result */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-result' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Supporting Result + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileResult && + fileResult.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileResult(fileResult, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputResult.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeResult(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {submitButton ? ( + { + submitRequestFiles(); + }} + loading={submitLoading} + > + Submit + + ) : ''} + + ) : ''} + + + {dataTimeline.status === 'requested' ? ( + + + + + Documents + + + {document?.map((dataDocument, index) => ( + + + {dataDocument.type === 'claim-diagnosis' ? + 'Diagnosis' + : dataDocument.type === 'claim-kondisi' ? + 'Condition' + : dataDocument.type === 'claim-result' ? + 'Supporting Result' + : dataDocument.type === 'claim-invoice' ? + 'Invoice' + : ''} + + + + + {dataDocument.original_name ? dataDocument.original_name : '-'} + + + + ))} + + + + ) : ''} + + + + ))} + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Index.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Index.tsx new file mode 100644 index 00000000..6b1e6fd4 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Index.tsx @@ -0,0 +1,30 @@ +import { Card, Stack } from "@mui/material"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import List from "./List"; + + + +export default function RequestLog() { + + const pageTitle = 'Request LOG'; + return ( + + + + + {/* */} + + {/* */} + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/List.tsx b/frontend/dashboard/src/pages/CustomerService/Request/List.tsx new file mode 100644 index 00000000..1a2b3179 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/List.tsx @@ -0,0 +1,582 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + IconButton, + MenuItem, + Table, + TableBody, + TableCell, + TableRow, + TextField, + Typography, + Stack, + Menu, + ButtonGroup, + Link, + Chip, + TableHead, + Grid, + SvgIcon, +} from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; + +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import ApprovalIcon from '../../../../build/icons/ic_approval.svg'; + + +// hooks +import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; +import useSettings from '@/hooks/useSettings'; +// components +import axios from '../../../utils/axios'; +import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../../@types/paginated-data'; +import DataTable from '../../../components/LaravelTable'; +import { fCurrency } from '../../../utils/formatNumber'; +import EditRoundedIcon from '@mui/icons-material/EditRounded'; +import { LoadingButton } from '@mui/lab'; +import { enqueueSnackbar } from 'notistack'; +import { Divider } from '@mui/material'; +import Iconify from '@/components/Iconify'; +import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { capitalizeFirstLetter } from '@/utils/formatString'; +import Label from '@/components/Label'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import { Import } from '@/@types/claims'; + +import { RequestLogType } from '../Request/Model/Types'; +// import SvgIconStyle from '@/components/SvgIconStyle'; +import SvgIconStyle from '../../../components/SvgIconStyle'; +// import LoadingButton from '@/theme/overrides/LoadingButton'; + +export default function List() { + const { themeColorPresets } = useSettings(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + + const navigate = useNavigate() + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(''); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? ''; + setSearchText(newSearchText); + }; + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch({ search: searchText }); // Trigger to Parent + }; + + useEffect(() => { + // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, []); + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); + const [importLoading, setImportLoading] = useState(false); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected'); + } + }; + + const handleCancelImportButton = () => { + importForm.current.value = ''; + importForm.current.dispatchEvent(new Event('change', { bubbles: true })); + }; + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name); + } else { + setCurrentImportFileName(null); + } + }; + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append('file', importForm.current?.files[0]); + + setImportLoading(true); + axios + .post(`customer-service/request/import`, formData) + .then((response) => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + setImportLoading(false); + }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + setImportLoading(false); + }); + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }); + } + }; + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + const handleGetData = (type :string) => { + axios.get(`customer-service/request/data`) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + return ( +
+ + {!currentImportFileName && ( + + + + + Import + {handleGetTemplate('request-log')}}>Download Template + {handleGetData('data-request-log')}}>Download Request LOG + + {/* */} + + )} + + {currentImportFileName && ( + + + + + + + } + sx={{ p: 1.8 }} + onClick={handleUpload} + loading={importLoading} + > + Upload + + + )} + {importResult && ( + + + Last Import Result Report :{' '} + + {importResult.result_file?.name ?? '-'} + + + + )} +
+ ); + } + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState( + LaravelPaginatedDataDefault + ); + + const loadDataTableData = async (appliedFilter: any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/customer-service/request', { params: filter }); + setDataTableLoading(false); + setDataTableData(response.data); + }; + + const applyFilter = async (searchFilter: { search: string }) => { + await loadDataTableData(searchFilter); + setSearchParams(searchFilter); + }; + + const handlePageChange = (event: ChangeEvent, value: number): void => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + }; + + const handleApprove = (claimRequest) => { + axios + .post(`claim-requests/${claimRequest.id}/approve`) + .then((response) => { + enqueueSnackbar('Success Approve', { variant: 'success' }); + loadDataTableData(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + }; + + useEffect(() => { + loadDataTableData(); + }, []); + + const headStyle = { + fontWeight: 'bold', + }; + + // Called on every row to map the data to the columns + function createData(data: RequestLogType): any { + return { + ...data, + }; + } + + { + /* ------------------ TABLE ROW ------------------ */ + } + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + const [loadingApprove, setLoadingApprove] = React.useState(false); + + return ( + + *': { borderBottom: 'unset' } }}> + {/* + setOpen(!open)}> + {open ? : } + + */ } + {/* + { + // handleShowClaim(row); + // }} + > + {row.id} + + */} + {row.code} + {row.member_name} + + {row.service_name} + {row.payment_type_name} + + { row.status == "requested" ? + () : + row.status == "declined" ? + () + : + () + } + + + + navigate ('/custormer-service/request/detail/'+row.id+'')}> + + Detail + + + + } /> + + {/* + + { + handleShowClaim(row); + }} + > + + + */} + + {/* COLLAPSIBLE ROW */} + + + + + } + spacing={1} + sx={{ marginY: 2 }} + > + + Berkas Hasil Penunjang + {/* {row.files_by_type?.claim_kondisi && + row.files_by_type?.claim_kondisi.map((file, index) => ( + + -{' '} + + {file.name} + + + ))} */} + + {row.files_by_type?.claim_kondisi && ( + <> + - Kondisi + {row.files_by_type?.claim_kondisi.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_diagnosis && ( + <> + - Diagnosa + {row.files_by_type?.claim_diagnosis.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + + {row.files_by_type?.claim_result && ( + <> + - Hasil + {row.files_by_type?.claim_result.map((file, index) => ( + + + + {file.name} + + + ))} + + )} + {(!row.files_by_type?.claim_result && !row.files_by_type?.claim_diagnosis && !row.files_by_type?.claim_kondisi)&& Tidak ada berkas} + + + + + + + + ); + } + { + /* ------------------ END TABLE ROW ------------------ */ + } + + function TableContent() { + return ( + + {/* ------------------ TABLE HEADER ------------------ */} + + + {/* */} + {/* + ID Request LOG + */} + + Code + + + Name + + + Date of Submission + + + Service Type + + + Claim Method + + + Status + + + + + {/* ------------------ END TABLE HEADER ------------------ */} + + {/* ------------------ TABLE ROW ------------------ */} + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length === 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableData.data.map((row) => ( + + ))} + + )} + {/* ------------------ END TABLE ROW ------------------ */} +
+ ); + } + + // --------------------------------------------------------- + // Dialog Detail Claim Request + const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false); + const [loadingClaimDetail, setLoadingClaimDetail] = useState(true); + const [currentClaim, setCurrentClaim] = useState(null); + + function handleShowClaim(claimRequest) { + setLoadingClaimDetail(true); + setOpenDialogDetailClaim(true); + + axios + .get(`/claim-requests/${claimRequest.id}`) + .then(({ data }) => { + setCurrentClaim(data.data); + setLoadingClaimDetail(false); + }) + .catch((err) => { + enqueueSnackbar(err.message, { variant: 'error' }); + }); + } + + function handleDownloadLog() {} + + return ( + + + + + + + } + /> + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Model/Functions.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Model/Functions.tsx new file mode 100644 index 00000000..da72ff60 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Model/Functions.tsx @@ -0,0 +1,79 @@ +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { MemberListType } from './Types'; +import { makeFormData } from '@/utils/jsonToFormData'; + +/** + * Listing Member + */ +export const getMemberList = async ( page: number, keyword: string ): Promise => { + const response = await axios.get(`/claim-requests/list-member?page=${page}&keyword=${keyword}`) + .then((res) =>{ + return res.data.data.member_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Add Claim Request + */ +export const addClaimRequest = async ( data: MemberListType[] ): Promise => { + // Mapping + const formData = new FormData(); + + data.map((row, index) => { + formData.append(`member_id[${index}]`, row.id.toString()); + formData.append(`service_code[${index}]`, row.patien_type??''); + + if (row.file_kondisi != undefined) { + row.file_kondisi.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_kondisi[member_${row.id}][${file_index}]`, file); + }); + } + + if (row.file_diagnosa != undefined) { + row.file_diagnosa.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_diagnosa[member_${row.id}][${file_index}]`, file); + }); + } + + if (row.file_penunjang != undefined) { + row.file_penunjang.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_penunjang[member_${row.id}][${file_index}]`, file); + }); + } + }) + + // Axios + const response = await axios.post(`/claim-requests`, formData) + .then((res) =>{ + enqueueSnackbar("Berhasil membuat data !", { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return false; + }); + + return response; +}; diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Model/Types.tsx new file mode 100644 index 00000000..0091c213 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/Request/Model/Types.tsx @@ -0,0 +1,57 @@ +import { Member } from "@/@types/member" + +/** + * Search Type + */ +export type SearchType = { + keyword: string, +} + +/** + * Member List + */ +export type RequestLogType = { + id : number, + code : string, + member : Member, + submission_date : string, + service_name : string, + payment_type_name : string, + status_final_log : string, + status : string, + files_by_type : files_by_type, +} + +export type files_by_type = { + claim_diagnosis : file[], + claim_kondisi : file[], + claim_result : file[], +} + +export type file = { + name: string, + url: string, +} + +export type DetailRequestLogType = { + id : number, + code : string, + member_id : string, + policy_number : string, + name : string, + date_of_birth : string, + gender : string, + marital_status : string, + submission_date : string, + service_type : string, + claim_method : string, + status : string, + benefit : Benefit[], +} + +export type Benefit = { + code: string, + description: string +} + + diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/History.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/History.tsx new file mode 100644 index 00000000..0f514a2b --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Diagnosis/History.tsx @@ -0,0 +1,221 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + Container, + FormControl, + Grid, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Stack, +} from '@mui/material'; +import * as React from 'react'; +import { useParams } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; +import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; +import { useContext, useEffect, useState } from 'react'; +import MuiAccordionSummary, { + AccordionSummaryProps, +} from '@mui/material/AccordionSummary'; +import useSettings from '../../../hooks/useSettings'; +import axios from '../../../utils/axios'; +import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import MuiAccordionDetails from '@mui/material/AccordionDetails'; +import HeaderBreadcrumbs from '../../../components/HeaderBreadcrumbs'; +import { Corporate } from '@/@types/corporates'; +import { fDate, fDateTime } from '@/utils/formatTime'; + +const Accordion = styled((props: AccordionProps) => ( + +))(({ theme }) => ({ + border: `1px solid ${theme.palette.divider}`, + '&:not(:last-child)': { + borderBottom: 0, + }, + '&:before': { + display: 'none', + }, +})); + +const AccordionSummary = styled((props: AccordionSummaryProps) => ( + } + {...props} + /> +))(({ theme }) => ({ + backgroundColor: + theme.palette.mode === 'dark' + ? 'rgba(255, 255, 255, .05)' + : 'rgba(0, 0, 0, .03)', + flexDirection: 'row-reverse', + '& .MuiAccordionSummary-expandIconWrapper.Mui-expanded': { + transform: 'rotate(90deg)', + }, + '& .MuiAccordionSummary-content': { + marginLeft: theme.spacing(1), + }, +})); + +const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ + padding: theme.spacing(2), + borderTop: '1px solid rgba(0, 0, 0, .125)', +})); + +export default function CustomizedAccordions() { + const [expanded, setExpanded] = React.useState('panel1'); + + const handleChange = + (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + const pageTitle = 'Diagnosis History'; + + const { themeStretch } = useSettings(); + + const { id } = useParams(); + + const [corporate, setCorporate] = useState(); + const [ currentCorporate, setCurrentCorporate ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\Icd'; + const url = `/audittrail/${id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentCorporate(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + + }, [configuredCorporateContext]); + + return ( +
+ + {currentCorporate?.data.map((item, index) => ( + + + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + + + + + Field + Old Value + New Values + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'deleted_by' || + key === 'deleted_at' || + key === 'created_by' || + key === 'created_at' || + key === 'updated_by' || + key === 'description'|| + key === 'version'|| + key === 'rev'|| + key === 'active'|| + key === 'parent_code'|| + key === 'id' + ) { + return null; // Melewati iterasi saat key adalah 'deleted_by' + } + switch (key) { + case 'welcome_message': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'help_text': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'active': + renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; + value = value == 1 ? 'Active' : 'Inactive'; + break; + case 'created_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'delete_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + + const field = key.charAt(0).toUpperCase() + key.slice(1); + // if (value != renderedValue) { + return ( + + {`${field}`} + {`${value}`} + {renderedValue} + + ); + // } + })} + + + + + ))} +
+ ); +} diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/Index.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/Index.tsx index 4da33ed2..8defda2c 100644 --- a/frontend/dashboard/src/pages/Master/Diagnosis/Index.tsx +++ b/frontend/dashboard/src/pages/Master/Diagnosis/Index.tsx @@ -16,23 +16,26 @@ export default function Divisions() { return ( - - - + + - ); } diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/List-master.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/List-master.tsx new file mode 100644 index 00000000..70127b94 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Diagnosis/List-master.tsx @@ -0,0 +1,397 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; +import HistoryIcon from '@mui/icons-material/History'; +// hooks +import { Link, NavLink as RouterLink } from 'react-router-dom'; +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../hooks/useSettings'; +import { useParams, useSearchParams } from 'react-router-dom'; +// components +import axios from '../../../utils/axios'; +import { LaravelPaginatedData } from '../../../@types/paginated-data'; +import { Icd } from '../../../@types/diagnosis'; +import BasePagination from '../../../components/BasePagination'; +import { enqueueSnackbar } from 'notistack'; + +export default function List() { + const { themeStretch } = useSettings(); + const { corporate_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? '' + setSearchText(newSearchText); + } + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch(searchText); // Trigger to Parent + } + + useEffect(() => { // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null) + const [currentImportFileName, setCurrentImportFileName] = useState(null) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected') + } + } + + const handleICDList = async (appliedFilter = null) => { + axios.get('master/diagnosis/list').then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }); + } + + const handleCancelImportButton = () => { + importForm.current.value = ""; + importForm.current.dispatchEvent(new Event("change", { bubbles: true })); + } + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name) + } else { + setCurrentImportFileName(null); + } + } + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append("file", importForm.current?.files[0]) + axios.post(`master/diagnosis/import`, formData ) + .then(response => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data) + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }) + } + } + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + + return ( +
+ + {( !currentImportFileName && + + {/*

kjasndkjandskjasndkjansdkjansd

*/} + + + Create Template + {handleGetTemplate('master-icd')}}>Download Template + Download ICD + +
+ )} + + {( currentImportFileName && + + + + + + + + )} + {( importResult && + + Last Import Result Report : {importResult.result_file?.name ?? "-"} + + )} +
+ ); + } + + // Called on every row to map the data to the columns + function createData( icd: Icd ): Icd { + return { + ...icd, + } + } + + // Generate the every row of the table + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + + const handleActivate = (model: any, status: string) => { + axios + .put(`/master/diagnosis/${row.id}/activation`, { + // service_code: service.service_code, + active: status == 'active', + }) + .then((res) => { + setDataTableData({ + ...dataTableData, + data: dataTableData.data.map((model) => { + let updatedModel = model; + if (row.id == model.id) { + updatedModel.active = res.data.icd.active; + } + return updatedModel; + }), + }); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + }; + + return ( + + *': { borderBottom: 'unset' } }}> + + setOpen(!open)} + > + {open ? : } + + + {row.type} + {row.code} + {row.name} + {row.version} + + + {/* */} + + {row.active == 1 && ( + + )} + {row.active != 1 && ( + + )} + + + {/* */} + + + + + + {/* COLLAPSIBLE ROW */} + + + + + + Description : {row.description} + + + + + + + ); + } + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableLastRequest, setDataTableLastRequest] = useState(0); + const [dataTableResponseState, setDataTableResponseState] = useState('idle'); + const [dataTableData, setDataTableData] = useState({ + current_page: 1, + data: [], + path: "", + first_page_url: "", + last_page: 1, + last_page_url: "", + next_page_url: "", + prev_page_url: "", + per_page: 10, + from: 0, + to: 0, + total: 0 + }); + const [dataTablePage, setDataTablePage] = useState(5); + + const loadDataTableData = async (appliedFilter : any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/master/diagnosis', { params: filter }); + console.log(response.data); + setDataTableLoading(false); + + setDataTableData(response.data); + } + + const headStyle = { + fontWeight: 'bold', + }; + + const applyFilter = async (searchFilter: string) => { + await loadDataTableData({ "search" : searchFilter }); + setSearchParams({ "search" : searchFilter }); + } + + const handlePageChange = (event : ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); + loadDataTableData(filter); + setSearchParams(filter); + } + + useEffect(() => { + loadDataTableData(); + }, []) + + return ( + + + + + {/* The Main Table */} + + + + + + Type + Code + Name + Version + Status + Action + + + {dataTableIsLoading ? + ( + + + Loading + + + ) : ( + dataTableData.data.length == 0 ? + ( + + + No Data + + + ) : ( + + {dataTableData.data.map(row => ( + + ))} + + ) + )} +
+
+ + +
+
+ ); +} diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/List.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/List.tsx index ef1aad24..b65de80d 100644 --- a/frontend/dashboard/src/pages/Master/Diagnosis/List.tsx +++ b/frontend/dashboard/src/pages/Master/Diagnosis/List.tsx @@ -5,7 +5,9 @@ import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; +import HistoryIcon from '@mui/icons-material/History'; // hooks +import { Link, NavLink as RouterLink, useNavigate } from 'react-router-dom'; import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; import useSettings from '../../../hooks/useSettings'; import { useParams, useSearchParams } from 'react-router-dom'; @@ -15,13 +17,15 @@ import { LaravelPaginatedData } from '../../../@types/paginated-data'; import { Icd } from '../../../@types/diagnosis'; import BasePagination from '../../../components/BasePagination'; import { enqueueSnackbar } from 'notistack'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; export default function List() { - const { themeStretch } = useSettings(); - const { corporate_id } = useParams(); - const [searchParams, setSearchParams] = useSearchParams(); - const [importResult, setImportResult] = useState(null); - + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const { diagnosis_template_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + function SearchInput(props: any) { // SEARCH const searchInput = useRef(null); @@ -42,7 +46,7 @@ export default function List() { }, [searchParams]) return ( -
+ ); @@ -53,7 +57,7 @@ export default function List() { // Create Button Menu const [anchorEl, setAnchorEl] = React.useState(null); const createMenu = Boolean(anchorEl); - const importForm = useRef(null) + const importForm = useRef(null) const [currentImportFileName, setCurrentImportFileName] = useState(null) const handleClick = (event: React.MouseEvent) => { @@ -73,6 +77,22 @@ export default function List() { } } + const handleICDList = async (appliedFilter = null) => { + axios.get('master/diagnosis/'+ diagnosis_template_id +'/list').then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + enqueueSnackbar('Download Success', { variant: 'succes' }) + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + ; + } + const handleCancelImportButton = () => { importForm.current.value = ""; importForm.current.dispatchEvent(new Event("change", { bubbles: true })); @@ -90,12 +110,13 @@ export default function List() { if (importForm.current?.files.length) { const formData = new FormData(); formData.append("file", importForm.current?.files[0]) - axios.post(`corporates/${corporate_id}/import-plan-benefit`, formData ) + axios.post(`master/diagnosis/` + diagnosis_template_id + `/import`, formData ) .then(response => { handleCancelImportButton(); loadDataTableData(); setImportResult(response.data) // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + enqueueSnackbar('Succesfully import data '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows', { variant: 'success' }) }) .catch(response => { enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) @@ -104,7 +125,20 @@ export default function List() { enqueueSnackbar('No File Selected', { variant: 'warning' }) } } - + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + return (
@@ -113,8 +147,8 @@ export default function List() { {/*

kjasndkjandskjasndkjansdkjansd

*/} )} - {( importResult && + {( importResult && Last Import Result Report : {importResult.result_file?.name ?? "-"} @@ -174,37 +209,55 @@ export default function List() { const { row } = props; const [open, setOpen] = React.useState(false); + const handleActivate = (model: any, status: string) => { + axios + .put(`/master/diagnosis/${row.id}/activation`, { + // service_code: service.service_code, + active: status == 'active', + }) + .then((res) => { + setDataTableData({ + ...dataTableData, + data: dataTableData.data.map((model) => { + let updatedModel = model; + if (row.id == model.id) { + updatedModel.active = res.data.icd.active; + } + return updatedModel; + }), + }); + enqueueSnackbar( + 'Updated Successfully!', + { variant: 'success' } + ); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + }; + return ( - *': { borderBottom: 'unset' } }}> - - setOpen(!open)} - > - {open ? : } - - - {row.type} - {row.code} - {row.name} - {row.version} - - - - - {/* COLLAPSIBLE ROW */} - - - - - - Description : {row.description} - - - - + *': { borderBottom: '1' } }}> + + {row.code} + {row.name} + + + + navigate(`/master/diagnosis/${row.id}/diagnosis-history`)}> + + History + + + } /> + + ); @@ -233,8 +286,7 @@ export default function List() { const loadDataTableData = async (appliedFilter : any | null = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/master/diagnosis', { params: filter }); - // console.log(response.data); + const response = await axios.get('/master/diagnosis/'+diagnosis_template_id, { params: filter }); setDataTableLoading(false); setDataTableData(response.data); @@ -258,26 +310,29 @@ export default function List() { useEffect(() => { loadDataTableData(); }, []) - + return ( - {/* The Main Table */} - + - + + + + + + + + - - Type + Code - Name - Version - Status - Action + Description + - + {dataTableIsLoading ? ( @@ -286,7 +341,7 @@ export default function List() { ) : ( - dataTableData.data.length == 0 ? + dataTableData.data.length == 0 ? ( @@ -303,9 +358,8 @@ export default function List() { )}
- + -
); } diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/Master/CreateUpdate.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/Master/CreateUpdate.tsx new file mode 100644 index 00000000..018f009a --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Diagnosis/Master/CreateUpdate.tsx @@ -0,0 +1,72 @@ + +import { useNavigate, useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../../components/HeaderBreadcrumbs"; +import Page from "../../../../components/Page"; +import useSettings from "../../../../hooks/useSettings"; +import {useContext, useEffect, useMemo, useState } from 'react'; +import axios from '../../../../utils/axios'; +import { useSnackbar } from 'notistack'; +import CorporatePlanForm from './Form'; +import { CorporatePlan } from '../../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; + + + +export default function PlanCreate() { + const { themeStretch } = useSettings(); + const { corporate_id, id } = useParams(); + const [corporate, setCorporate] = useState(); + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + }, [configuredCorporateContext]) + + const [ currentCorporatePlan, setCurrentCorporatePlan ] = useState(); + + + const navigate = useNavigate(); + + const isEdit = !!id; + + useEffect(() => { + if (isEdit) { + axios.get('/master/diagnosis-template/'+id+'/edit') + .then((res) => { + setCurrentCorporatePlan(res.data); + }) + .catch((err) => { + if (err.response.status === 404) { + navigate('/404'); + } + }) + } + }, [corporate_id, id]); + + + return ( + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/Master/Form.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/Master/Form.tsx new file mode 100644 index 00000000..27819834 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Diagnosis/Master/Form.tsx @@ -0,0 +1,125 @@ +import * as Yup from 'yup'; +import { LoadingButton } from "@mui/lab"; +import { Box, Card, Grid, Stack, Typography } from "@mui/material"; +import { CorporatePlan } from "../../../../@types/corporates"; +import { FormProvider, RHFSwitch, RHFTextField } from "../../../../components/hook-form"; +import { useEffect, useMemo } from 'react'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate, useParams } from 'react-router-dom'; +import axios from '../../../../utils/axios'; +import palette from '@/theme/palette'; + +type Props = { + isEdit: boolean; + currentCorporatePlan?: CorporatePlan; +}; + +export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Props) { + + const { enqueueSnackbar } = useSnackbar(); + const navigate = useNavigate(); + const { corporate_id } = useParams(); + + const NewCorporatePlanSchema = Yup.object().shape({ + name: Yup.string().required('Name is required'), + }); + + const defaultValues = useMemo( + () => ({ + name: currentCorporatePlan?.name || '', + description: currentCorporatePlan?.description || '', + active: currentCorporatePlan?.active === 1 ? true : false, + }), + [currentCorporatePlan] + ); + + useEffect(() => { + if (isEdit && currentCorporatePlan) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + }, [isEdit, currentCorporatePlan]); + + const methods = useForm({ + resolver: yupResolver(NewCorporatePlanSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + + const onSubmit = async (data: any) => { + if (!isEdit) { + await axios + .post('/master/diagnosis-template/store', data) + .then((res) => { + enqueueSnackbar('Division created successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/master/diagnosis', { replace: true }); + }) + .catch(({ response }) => { + if (response.status === 422) { + for (const [key, value] of Object.entries(response.data.errors)) { + setError(key, { message: value[0] }); + enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); + } + } + else { + enqueueSnackbar('Create Failed : '+ response.data.message, { variant: 'error' }); + } + }); + } else { + await axios + .put('/master/diagnosis-template/' + currentCorporatePlan?.id + '/update', data) + .then((res) => { + enqueueSnackbar('Division updated successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/master/diagnosis' , { replace: true }); + }) + .catch(({ response }) => { + enqueueSnackbar('Update Failed : '+ response.data.message, { variant: 'error' }); + }); + } + }; + + return ( + + + + + + + + Detail + + + + + + + { isEdit? 'Update' : 'Create' } + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/Master/History.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/Master/History.tsx new file mode 100644 index 00000000..e0c0c7aa --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Diagnosis/Master/History.tsx @@ -0,0 +1,218 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + Container, + FormControl, + Grid, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Stack, +} from '@mui/material'; +import * as React from 'react'; +import { useParams } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; +import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; +import { useContext, useEffect, useState } from 'react'; +import MuiAccordionSummary, { + AccordionSummaryProps, +} from '@mui/material/AccordionSummary'; +import useSettings from '../../../../hooks/useSettings'; +import axios from '../../../../utils/axios'; +import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import MuiAccordionDetails from '@mui/material/AccordionDetails'; +import HeaderBreadcrumbs from '../../../../components/HeaderBreadcrumbs'; +import { Corporate } from '@/@types/corporates'; +import { fDate, fDateTime } from '@/utils/formatTime'; + +const Accordion = styled((props: AccordionProps) => ( + +))(({ theme }) => ({ + border: `1px solid ${theme.palette.divider}`, + '&:not(:last-child)': { + borderBottom: 0, + }, + '&:before': { + display: 'none', + }, +})); + +const AccordionSummary = styled((props: AccordionSummaryProps) => ( + } + {...props} + /> +))(({ theme }) => ({ + backgroundColor: + theme.palette.mode === 'dark' + ? 'rgba(255, 255, 255, .05)' + : 'rgba(0, 0, 0, .03)', + flexDirection: 'row-reverse', + '& .MuiAccordionSummary-expandIconWrapper.Mui-expanded': { + transform: 'rotate(90deg)', + }, + '& .MuiAccordionSummary-content': { + marginLeft: theme.spacing(1), + }, +})); + +const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ + padding: theme.spacing(2), + borderTop: '1px solid rgba(0, 0, 0, .125)', +})); + +export default function CustomizedAccordions() { + const [expanded, setExpanded] = React.useState('panel1'); + + const handleChange = + (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + const pageTitle = 'Diagnosis Template History'; + + const { themeStretch } = useSettings(); + + const { id } = useParams(); + + const [corporate, setCorporate] = useState(); + const [ currentCorporate, setCurrentCorporate ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\IcdTemplate'; + const url = `/audittrail/${id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentCorporate(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + + }, [configuredCorporateContext]); + + return ( +
+ + {currentCorporate?.data.map((item, index) => ( + + + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + + + + + Field + Old Value + New Values + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'deleted_by' || + key === 'deleted_at' || + key === 'created_by' || + key === 'created_at' || + key === 'updated_by' || + key === 'description' + ) { + return null; // Melewati iterasi saat key adalah 'deleted_by' + } + switch (key) { + case 'welcome_message': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'help_text': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'active': + renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; + value = value == 1 ? 'Active' : 'Inactive'; + break; + case 'created_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'delete_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + + const field = key.charAt(0).toUpperCase() + key.slice(1); + if (value == renderedValue) { + return null + } else { + return ( + + {`${field}`} + {`${value}`} + {renderedValue} + + ); + } + })} + + + + + ))} +
+ ); +} diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/Master/Index.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/Master/Index.tsx new file mode 100644 index 00000000..a3ccff4c --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Diagnosis/Master/Index.tsx @@ -0,0 +1,37 @@ +import { Card, Grid } from "@mui/material"; +import { useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../../components/HeaderBreadcrumbs"; +import Page from "../../../../components/Page"; +import useSettings from "../../../../hooks/useSettings"; +import List from "./List"; + + + +export default function Divisions() { + const { themeStretch } = useSettings(); + + const { corporate_id } = useParams(); + + const pageTitle = 'Diagnosis'; + return ( + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/Master/List.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/Master/List.tsx new file mode 100644 index 00000000..86315323 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Diagnosis/Master/List.tsx @@ -0,0 +1,344 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; +import HistoryIcon from '@mui/icons-material/History'; +// hooks +import { Link, NavLink as RouterLink, useNavigate } from 'react-router-dom'; +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../../hooks/useSettings'; +import { useParams, useSearchParams } from 'react-router-dom'; +// components +import axios from '../../../../utils/axios'; +import { LaravelPaginatedData } from '../../../../@types/paginated-data'; +import { Icd } from '../../../../@types/diagnosis'; +import BasePagination from '../../../../components/BasePagination'; +import { enqueueSnackbar } from 'notistack'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import { EditOutlined, FindInPageOutlined } from '@mui/icons-material'; + +export default function List() { + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const { corporate_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? '' + setSearchText(newSearchText); + } + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch(searchText); // Trigger to Parent + } + + useEffect(() => { // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null) + const [currentImportFileName, setCurrentImportFileName] = useState(null) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected') + } + } + + const handleICDList = async (appliedFilter = null) => { + axios.get('master/diagnosis/list').then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }); + } + + const handleCancelImportButton = () => { + importForm.current.value = ""; + importForm.current.dispatchEvent(new Event("change", { bubbles: true })); + } + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name) + } else { + setCurrentImportFileName(null); + } + } + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append("file", importForm.current?.files[0]) + axios.post(`master/diagnosis/import`, formData ) + .then(response => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data) + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }) + } + } + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + + + return ( +
+ + {( !currentImportFileName && + + {/*

kjasndkjandskjasndkjansdkjansd

*/} + + + + + + +
+ )} +
+ ); + } + + // Called on every row to map the data to the columns + function createData( icd: Icd ): Icd { + return { + ...icd, + } + } + + // Generate the every row of the table + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + + const handleActivate = (model: any, status: string) => { + axios + .put(`/master/diagnosis-template/${row.id}/activation`, { + // service_code: service.service_code, + active: status == 'active', + }) + .then((res) => { + setDataTableData({ + ...dataTableData, + data: dataTableData.data.map((model) => { + let updatedModel = model; + if (row.id == model.id) { + updatedModel.active = res.data.icd.active; + } + return updatedModel; + }), + }); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + }; + + return ( + + *': { borderBottom: '1' } }}> + + {row.name} + {row.description ?? '-'} + + + + navigate(`/master/diagnosis/${row.id}`)}> + + Detail + + navigate(`/master/diagnosis-template/${row.id}/edit`)} > + + Edit + + navigate(`/master/diagnosis-template/${row.id}/diagnosis-template-history`)}> + + History + + + } /> + + + + + ); + } + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableLastRequest, setDataTableLastRequest] = useState(0); + const [dataTableResponseState, setDataTableResponseState] = useState('idle'); + const [dataTableData, setDataTableData] = useState({ + current_page: 1, + data: [], + path: "", + first_page_url: "", + last_page: 1, + last_page_url: "", + next_page_url: "", + prev_page_url: "", + per_page: 10, + from: 0, + to: 0, + total: 0 + }); + const [dataTablePage, setDataTablePage] = useState(5); + + const loadDataTableData = async (appliedFilter : any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/master/diagnosis-template', { params: filter }); + console.log(response.data); + setDataTableLoading(false); + + setDataTableData(response.data); + } + + const headStyle = { + fontWeight: 'bold', + }; + + const applyFilter = async (searchFilter: string) => { + await loadDataTableData({ "search" : searchFilter }); + setSearchParams({ "search" : searchFilter }); + } + + const handlePageChange = (event : ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); + loadDataTableData(filter); + setSearchParams(filter); + } + + useEffect(() => { + loadDataTableData(); + }, []) + + return ( + + + + {/* The Main Table */} + + + + + + + + + + + + + Name + Description + + + + {dataTableIsLoading ? + ( + + + Loading + + + ) : ( + dataTableData.data.length == 0 ? + ( + + + No Data + + + ) : ( + + {dataTableData.data.map(row => ( + + ))} + + ) + )} +
+
+ + +
+ ); +} diff --git a/frontend/dashboard/src/pages/Master/Doctors/Form.tsx b/frontend/dashboard/src/pages/Master/Doctors/Form.tsx index c2037e43..55d27f88 100644 --- a/frontend/dashboard/src/pages/Master/Doctors/Form.tsx +++ b/frontend/dashboard/src/pages/Master/Doctors/Form.tsx @@ -228,6 +228,8 @@ export default function PractitionerForm({ isEdit, currentPractitioner }: Props) useEffect(() => { axios.get(`/search-organizations`).then((response) => { + console.log(response); + setOrganizations( response.data.map((item: any) => ({ ...item, name: item.name, value: item.id })) ); @@ -489,7 +491,11 @@ export default function PractitionerForm({ isEdit, currentPractitioner }: Props) options={availableOrganizations} value={findValueOrganization(form.organizationId) ?? ''} getOptionLabel={(option) => option.name} - isOptionEqualToValue={(option, value) => option.value === value.value} + isOptionEqualToValue={(option, value) => { + console.log(value, option, 'test') + return option.value === value.value + } + } onChange={(event, value) => handleOrganizationIdChange(index, value)} renderInput={(params) => ( diff --git a/frontend/dashboard/src/pages/Master/Drug/Index.tsx b/frontend/dashboard/src/pages/Master/Drug/Index.tsx index 0bdff569..91393b10 100644 --- a/frontend/dashboard/src/pages/Master/Drug/Index.tsx +++ b/frontend/dashboard/src/pages/Master/Drug/Index.tsx @@ -1,16 +1,11 @@ -import { Card, Grid } from "@mui/material"; -import { useParams } from "react-router-dom"; +import { Card } from "@mui/material"; import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; import Page from "../../../components/Page"; -import useSettings from "../../../hooks/useSettings"; import List from "./List"; export default function Drugs() { - const { themeStretch } = useSettings(); - - const { corporate_id } = useParams(); const pageTitle = 'Drug'; return ( @@ -20,8 +15,8 @@ export default function Drugs() { heading={ pageTitle } links={[ { - name: 'Master', - href: '/master', + name: 'Pharmacy & Delivery Management', + href: '/', }, { name: 'Drug', diff --git a/frontend/dashboard/src/pages/Master/Drug/List.tsx b/frontend/dashboard/src/pages/Master/Drug/List.tsx index ae0a4abd..00afbecc 100644 --- a/frontend/dashboard/src/pages/Master/Drug/List.tsx +++ b/frontend/dashboard/src/pages/Master/Drug/List.tsx @@ -1,310 +1,579 @@ // @mui -import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; -import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; -import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -import AddIcon from '@mui/icons-material/Add'; -import UploadIcon from '@mui/icons-material/Upload'; -import CancelIcon from '@mui/icons-material/Cancel'; -// hooks -import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; -import useSettings from '../../../hooks/useSettings'; -import { useParams, useSearchParams } from 'react-router-dom'; -// components -import axios from '../../../utils/axios'; -import { LaravelPaginatedData } from '../../../@types/paginated-data'; -import { Icd } from '../../../@types/diagnosis'; -import BasePagination from '../../../components/BasePagination'; +import { + Button, + Card, + IconButton, + MenuItem, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Stack, + Collapse, + Box, + FormControl, + InputLabel, + Select, + FormHelperText, + Menu, + ButtonGroup, + } from '@mui/material'; + import AddIcon from '@mui/icons-material/Add'; + // hooks + import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; + import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; + // components + import axios from '../../../utils/axios'; + import { Drug } from '../../../@types/pharmacy-and-delivery-managements'; + import { LaravelPaginatedData } from '../../../@types/paginated-data'; + import BasePagination from '../../../components/BasePagination'; + import TableMoreMenu from '@/components/table/TableMoreMenu'; + import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; + import HistoryIcon from '@mui/icons-material/History'; + import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; + import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; + import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; + import CloseIcon from '@mui/icons-material/Close'; + import { enqueueSnackbar } from 'notistack'; + import Label from '../../../components/Label'; + import UploadIcon from '@mui/icons-material/Upload'; + import CancelIcon from '@mui/icons-material/Cancel'; + import DownloadIcon from '@mui/icons-material/Download'; + import { LoadingButton } from '@mui/lab'; + -export default function List() { - const { themeStretch } = useSettings(); + export default function DrugList() { const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); - + const navigate = useNavigate(); + function SearchInput(props: any) { - // SEARCH - const searchInput = useRef(null); - const [searchText, setSearchText] = useState(""); + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(''); - const handleSearchChange = (event: any) => { - const newSearchText = event.target.value ?? '' + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); - } + }; - const handleSearchSubmit = (event: any) => { + const handleSubmit = (event: any) => { event.preventDefault(); props.onSearch(searchText); // Trigger to Parent - } + }; - useEffect(() => { // Trigger First Search + useEffect(() => { setSearchText(searchParams.get('search') ?? ''); - }, [searchParams]) + }, [searchParams]); - return ( -
- + return ( + + - ); - } - - function ImportForm(props: any) { - // IMPORT - // Create Button Menu - const [anchorEl, setAnchorEl] = React.useState(null); - const createMenu = Boolean(anchorEl); - const importForm = useRef(null) - const [currentImportFileName, setCurrentImportFileName] = useState(null) - - const handleClick = (event: React.MouseEvent) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; - - const handleImportButton = () => { - if (importForm?.current) { - handleClose(); - importForm.current ? importForm.current.click() : console.log('No File selected'); - } else { - alert('No file selected') - } - } - - const handleCancelImportButton = () => { - importForm.current.value = ""; - importForm.current.dispatchEvent(new Event("change", { bubbles: true })); - } - - const handleImportChange = (event: any) => { - if (event.target.files[0]) { - setCurrentImportFileName(event.target.files[0].name) - } else { - setCurrentImportFileName(null); - } - } - - const handleUpload = () => { - if (importForm.current?.files.length) { - const formData = new FormData(); - formData.append("file", importForm.current?.files[0]) - axios.post(`corporates/${corporate_id}/import-plan-benefit`, formData ) - .then(response => { - handleCancelImportButton(); - loadDataTableData(); - setImportResult(response.data) - // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); - }) - .catch(response => { - enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) - }) - } else { - enqueueSnackbar('No File Selected', { variant: 'warning' }) - } - } - - return ( -
- - {( !currentImportFileName && - - {/*

kjasndkjandskjasndkjansdkjansd

*/} - - - Import - Download Template - -
- )} - - {( currentImportFileName && - - - - - - - - )} - {( importResult && - - Last Import Result Report : {importResult.result_file?.name ?? "-"} - - )} -
- ); + ); } // Called on every row to map the data to the columns - function createData( icd: Icd ): Icd { - return { - ...icd, - } + function createData(drug: Drug): Drug { + return { + ...drug, + }; } + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importDrug = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); + const [importLoading, setImportLoading] = useState(false); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importDrug?.current) { + handleClose(); + importDrug.current ? importDrug.current.click() : console.log('No File selected'); + } else { + alert('No file selected'); + } + }; + + const handleCancelImportButton = () => { + if(importDrug.current) + { + importDrug.current.value = ''; + importDrug.current.dispatchEvent(new Event('change', { bubbles: true })); + } + }; + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name); + } else { + setCurrentImportFileName(null); + } + }; + + const handleUpload = () => { + if(importDrug.current && importDrug.current.files) + { + if (importDrug.current?.files.length) { + const formData = new FormData(); + formData.append('file', importDrug.current?.files[0]); + setImportLoading(true); + axios + .post(`master/drugs/import`, formData) + .then((response) => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + setImportLoading(false); + enqueueSnackbar('Success Import Drugs', { variant: 'success' }); + }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + setImportLoading(false); + }); + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }); + } + } + }; + + const handleGetTemplate = () => { + axios.get('master/drugs/download-template').then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }); + }; + + return ( +
+ + {!currentImportFileName && ( + + + + + + Import + + { + handleGetTemplate(); + }} + > + Download Template + + {/* + Download ICD + */} + + + )} + + {currentImportFileName && ( + + + + + + + } + sx={{ p: 1.8 }} + onClick={handleUpload} + loading={importLoading} + > + Upload + + + )} + {importResult && ( + + + Last Import Result :{' '} + + {importResult.data.total_success_row ?? 0} + {' '} + Row Processed,{' '} + + {importResult.data.total_failed_row} + {' '} + Failed + {importResult.data.failed_rows.map((row, index) => ( + [Code={row.code ? row.code : 'Required'},Name={row.name ? row.name : 'Required'}] + ))} + + + )} +
+ ); + } // Generate the every row of the table function Row(props: { row: ReturnType }) { - const { row } = props; - const [open, setOpen] = React.useState(false); + const { row } = props; + const [open, setOpen] = React.useState(false); + const style1 = { + color: '#637381' + } - return ( + return ( - *': { borderBottom: 'unset' } }}> - - setOpen(!open)} - > - {open ? : } - + *': open ? {borderBottom: 'unset'} : {}, cursor: open ? 'pointer' : '' }} onClick={() => {if(open==true) setOpen(!open)}}> + {row.type ? row.type : '-'} + {row.code ? row.code : '-'} + {row.name ? row.name : '-'} + {row.version ? row.version : '-'} + + {row.active === 1 ? ( + + ) : ( + + )} + + + + setOpen(!open)}> + + Details + + {/* handleEditData(row)}> + + Edit + */} + handleEditDataStatus(row)}> + + Update Status + + {/* navigate ('/corporates/'+corporate_id+'/hospitals/'+row.id+'/history')}> + + History + */} + + } + /> - {row.type} - {row.code} - {row.name} - {row.version} - - - - - {/* COLLAPSIBLE ROW */} - - - - - - Description : {row.description} - - - + + {/* COLLAPSIBLE ROW */} + {if(open==true) setOpen(!open)}}> + + + + + Detail + + + Code: + {row.code ? row.code : '-'} + + + Name: + {row.name ? row.name : '-'} + + + + + - + - ); + ); } // Dummy Default Data - const [dataTableIsLoading, setDataTableLoading] = useState(true); - const [dataTableLastRequest, setDataTableLastRequest] = useState(0); - const [dataTableResponseState, setDataTableResponseState] = useState('idle'); - const [dataTableData, setDataTableData] = useState({ - current_page: 1, - data: [], - path: "", - first_page_url: "", - last_page: 1, - last_page_url: "", - next_page_url: "", - prev_page_url: "", - per_page: 10, - from: 0, - to: 0, - total: 0 + const [dataTableIsLoading, setDataTableLoading] = React.useState(true); + const [dataTableData, setDataTableData] = React.useState({ + current_page: 1, + data: [], + path: '', + first_page_url: '', + last_page: 1, + last_page_url: '', + next_page_url: '', + prev_page_url: '', + per_page: 10, + from: 0, + to: 0, + total: 0, }); - const [dataTablePage, setDataTablePage] = useState(5); - const loadDataTableData = async (appliedFilter : any | null = null) => { - setDataTableLoading(true); - const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/master/drugs', { params: filter }); - // console.log(response.data); - setDataTableLoading(false); - - setDataTableData(response.data); - } - - const headStyle = { - fontWeight: 'bold', + const loadDataTableData = async (appliedFilter: any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + // Get Data Drugs + const response = await axios.get('/master/drugs', { params: filter }); + setDataTableLoading(false); + setDataTableData(response.data); }; - const applyFilter = async (searchFilter: string) => { - await loadDataTableData({ "search" : searchFilter }); - setSearchParams({ "search" : searchFilter }); - } + const applyFilter = async (searchFilter: any) => { + await loadDataTableData({ search: searchFilter }); + setSearchParams({ search: searchFilter }); + }; - const handlePageChange = (event : ChangeEvent, value: number) => { - const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); - loadDataTableData(filter); - setSearchParams(filter); - } + const handlePageChange = (event: ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + }; useEffect(() => { - loadDataTableData(); - }, []) - - return ( - - + loadDataTableData(); + }, []); - - {/* The Main Table */} - - - - - - Type - Code - Name - Version - Status - Action - - - {dataTableIsLoading ? - ( - + //validation dialog + const [nameField, setNameField] = useState(''); + const [codeField, setCodeField] = useState(''); + // ID for edit data + const [idField, setIdField] = useState(''); + + const handleAddData = () => { + navigate('/corporates/'+corporate_id+'/hospitals/create'); + } + //Edit data + const handleEditData = (data : any) => { + navigate('/corporates/'+corporate_id+'/hospitals/edit/'+data.id+'/'+data.organization_id); + } + // End dialog for hospitals + + // Dialog for update status hospitals + const [openDialogStatus, setOpenDialogStatus] = useState(false); + const [activeField, setActiveField] = useState(0); + const [reasonUpdate,setReasonUpdate] = useState('Agreement changed'); + + const handleCloseDialogUpdate = () => { + setOpenDialogStatus(false); + setNameField(''); + setCodeField(''); + setIdField(''); + setActiveField(activeField); + } + + const handleSaveUpdateData = () => { + let activeValue = 0; + if(activeField === 1) + { + activeValue = 0; + } + else + { + activeValue = 1; + } + const updateData = { + reason: reasonUpdate, + active : activeValue, + id: idField, + }; + axios + .put('/master/drugs/'+idField+'/activation', updateData) + .then((response) => { + enqueueSnackbar('Data updated successfully', { variant: 'success' }); + loadDataTableData(); + handleCloseDialogUpdate(); + }) + .catch((error) => { + enqueueSnackbar('Failed to add data', { variant: 'error' }); + }); + } + + const handleEditDataStatus = (data: any) => { + setIdField(data.id); + setNameField(data.name); + setCodeField(data.code); + setActiveField(data.active); + setOpenDialogStatus(true); + } + // End dialog for update status devisions + + + + return ( + + + + {/* The Main Table */} + +
+ {/* Table Head */} + - Loading + + Type + + + Code + + + Name + + + Version + + + Status + + + - - ) : ( - dataTableData.data.length == 0 ? - ( + + {/* Condition Table Body */} + {dataTableIsLoading ? ( - - No Data - + + + Loading + + - ) : ( + ) : dataTableData.data.length == 0 ? ( - {dataTableData.data.map(row => ( + + + No Data + + + + ) : ( + + {dataTableData.data.map((row) => ( - ))} + ))} - ) - )} -
-
- - -
-
+ )} + + + {/* Paginations */} + + + {/* Dialog Update Status */} + + + + + Update Status + + + + + + + + + Are you sure to {activeField == 1 ? 'Inactive' : 'Active'} this drug ? + + + Code + {nameField} + + + Name + {codeField} + + + + + Reason for update* + + + Reason for update + + + + + + + + + + + + + ); -} + } \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/Formularium/Index.tsx b/frontend/dashboard/src/pages/Master/Formularium/Index.tsx index 22b005cb..ff6c2ba3 100644 --- a/frontend/dashboard/src/pages/Master/Formularium/Index.tsx +++ b/frontend/dashboard/src/pages/Master/Formularium/Index.tsx @@ -21,11 +21,15 @@ export default function Drugs() { links={[ { name: 'Master', - href: '/master', + href: '/master/formularium-template', + }, + { + name: 'Formularium Template', + href: '/master/formularium-template', }, { name: 'Formularium', - href: '/master/formulariums', + href: '/master/formularium-template', }, ]} /> diff --git a/frontend/dashboard/src/pages/Master/Formularium/List.tsx b/frontend/dashboard/src/pages/Master/Formularium/List.tsx index fc93a3e0..046ce52d 100644 --- a/frontend/dashboard/src/pages/Master/Formularium/List.tsx +++ b/frontend/dashboard/src/pages/Master/Formularium/List.tsx @@ -1,5 +1,5 @@ // @mui -import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Grid, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; @@ -18,7 +18,7 @@ import BasePagination from '../../../components/BasePagination'; export default function List() { const navigate = useNavigate(); const { themeStretch } = useSettings(); - const { corporate_id } = useParams(); + const { formularium_template_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); @@ -78,6 +78,18 @@ export default function List() { importForm.current.dispatchEvent(new Event("change", { bubbles: true })); } + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + const handleImportChange = (event: any) => { if (event.target.files[0]) { setCurrentImportFileName(event.target.files[0].name) @@ -86,11 +98,27 @@ export default function List() { } } + const handleFormulariumList = async (appliedFilter = null) => { + axios.get(`master/formulariums/${formularium_template_id}/list`).then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + enqueueSnackbar('Download Success', { variant: 'succes' }) + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + ; + } + const handleUpload = () => { if (importForm.current?.files.length) { const formData = new FormData(); formData.append("file", importForm.current?.files[0]) - axios.post(`master/formularium/import`, formData ) + axios.post(`master/formulariums/${formularium_template_id}/import`, formData ) .then(response => { handleCancelImportButton(); loadDataTableData(); @@ -131,9 +159,10 @@ export default function List() { 'aria-labelledby': 'basic-button', }} > - {navigate('/master/formularium/create')} }>Create + {/* {navigate(`/master/formularium/create/${formularium_template_id}`)} }>Create */} Import - Download Template + {handleGetTemplate('master-formularium')}}>Download Template + Download Formularium )} @@ -188,20 +217,85 @@ export default function List() { {row.code} + {row.atc_code} {row.name} - {row.items_count} + {row.category_name} + {row.uom} - - + {/* + */} {/* COLLAPSIBLE ROW */} - + + - - - Description : {row.description} - + + Detail + + + + + Description + + + : {row.description ?? '-'} + + + General Indication + + + : {row.general_indication ?? '-'} + + + Composition + + + : {row.composition ?? '-'} + + + + + + + Kategori Obat + + + : {row.kategori_obat ?? '-'} + + + BPOM Registration + + + : {row.bpom_registration ?? '-'} + + + Classifications + + + : {row.classifications ?? '-'} + + + Cat For + + + : {row.cat_for ?? '-'} + + + Class + + + : {row.class ?? '-'} + + + Manufacturer + + + : {row.manufacturer ?? '-'} + + + + @@ -233,10 +327,11 @@ export default function List() { const loadDataTableData = async (appliedFilter : any | null = null) => { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); - const response = await axios.get('/master/formulariums', { params: filter }); + const response = await axios.get('/master/formulariums/'+formularium_template_id, { params: filter }); // console.log(response.data); setDataTableLoading(false); + console.log(formularium_template_id) setDataTableData(response.data); } @@ -262,7 +357,6 @@ export default function List() { return ( - {/* The Main Table */} @@ -271,10 +365,10 @@ export default function List() { Code + ATC Code Name - Total Item - Status - Action + Category Name + UOM {dataTableIsLoading ? diff --git a/frontend/dashboard/src/pages/Master/Formularium/Master/CreateUpdate.tsx b/frontend/dashboard/src/pages/Master/Formularium/Master/CreateUpdate.tsx new file mode 100644 index 00000000..29cd5cb4 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Formularium/Master/CreateUpdate.tsx @@ -0,0 +1,72 @@ + +import { useNavigate, useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../../components/HeaderBreadcrumbs"; +import Page from "../../../../components/Page"; +import useSettings from "../../../../hooks/useSettings"; +import {useContext, useEffect, useMemo, useState } from 'react'; +import axios from '../../../../utils/axios'; +import { useSnackbar } from 'notistack'; +import CorporatePlanForm from './Form'; +import { CorporatePlan } from '../../../../@types/corporates'; +import { Corporate } from "@/@types/corporates"; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; + + + +export default function PlanCreate() { + const { themeStretch } = useSettings(); + const { corporate_id, id } = useParams(); + const [corporate, setCorporate] = useState(); + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + console.log(configuredCorporateContext.currentCorporate); + }, [configuredCorporateContext]) + + const [ currentCorporatePlan, setCurrentCorporatePlan ] = useState(); + + + const navigate = useNavigate(); + + const isEdit = !!id; + + useEffect(() => { + if (isEdit) { + axios.get('/master/formularium-template/'+id+'/edit') + .then((res) => { + setCurrentCorporatePlan(res.data); + }) + .catch((err) => { + if (err.response.status === 404) { + navigate('/404'); + } + }) + } + }, [corporate_id, id]); + + + return ( + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Master/Formularium/Master/Form.tsx b/frontend/dashboard/src/pages/Master/Formularium/Master/Form.tsx new file mode 100644 index 00000000..d98ea1db --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Formularium/Master/Form.tsx @@ -0,0 +1,128 @@ +import * as Yup from 'yup'; +import { LoadingButton } from "@mui/lab"; +import { Card, Grid, Stack, Typography } from "@mui/material"; +import { CorporatePlan } from "../../../../@types/corporates"; +import { FormProvider, RHFSwitch, RHFTextField } from "../../../../components/hook-form"; +import { useEffect, useMemo } from 'react'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate, useParams } from 'react-router-dom'; +import axios from '../../../../utils/axios'; + +type Props = { + isEdit: boolean; + currentCorporatePlan?: CorporatePlan; +}; + +export default function CorporatePlanForm({ isEdit, currentCorporatePlan }: Props) { + + const { enqueueSnackbar } = useSnackbar(); + const navigate = useNavigate(); + const { corporate_id } = useParams(); + + const NewCorporatePlanSchema = Yup.object().shape({ + name: Yup.string().required('Name is required'), + }); + + const defaultValues = useMemo( + () => ({ + name: currentCorporatePlan?.name || '', + description: currentCorporatePlan?.description || '', + active: currentCorporatePlan?.active === 1 ? true : false, + }), + [currentCorporatePlan] + ); + + useEffect(() => { + if (isEdit && currentCorporatePlan) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + }, [isEdit, currentCorporatePlan]); + + const methods = useForm({ + resolver: yupResolver(NewCorporatePlanSchema), + defaultValues, + }); + + const { + reset, + watch, + control, + setValue, + getValues, + setError, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + + const onSubmit = async (data: any) => { + if (!isEdit) { + await axios + .post('/master/formularium-template/store', data) + .then((res) => { + enqueueSnackbar('Formularium created successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/master/formularium-template', { replace: true }); + }) + .catch(({ response }) => { + if (response.status === 422) { + for (const [key, value] of Object.entries(response.data.errors)) { + setError(key, { message: value[0] }); + enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); + } + } + else { + enqueueSnackbar('Create Failed : '+ response.data.message, { variant: 'error' }); + } + }); + } else { + await axios + .put('/master/formularium-template/' + currentCorporatePlan?.id + '/update', data) + .then((res) => { + enqueueSnackbar('Formularium updated successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/master/formularium-template' , { replace: true }); + }) + .catch(({ response }) => { + enqueueSnackbar('Update Failed : '+ response.data.message, { variant: 'error' }); + }); + } + }; + + return ( + + + + + + + Detail + + + + + + + { isEdit? 'Update' : 'Create' } + + + + + + {/* + + + + + */} + + + ); +} diff --git a/frontend/dashboard/src/pages/Master/Formularium/Master/History.tsx b/frontend/dashboard/src/pages/Master/Formularium/Master/History.tsx new file mode 100644 index 00000000..143c68de --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Formularium/Master/History.tsx @@ -0,0 +1,218 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + Container, + FormControl, + Grid, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Stack, +} from '@mui/material'; +import * as React from 'react'; +import { useParams } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; +import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; +import { useContext, useEffect, useState } from 'react'; +import MuiAccordionSummary, { + AccordionSummaryProps, +} from '@mui/material/AccordionSummary'; +import useSettings from '../../../../hooks/useSettings'; +import axios from '../../../../utils/axios'; +import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import MuiAccordionDetails from '@mui/material/AccordionDetails'; +import HeaderBreadcrumbs from '../../../../components/HeaderBreadcrumbs'; +import { Corporate } from '@/@types/corporates'; +import { fDate, fDateTime } from '@/utils/formatTime'; + +const Accordion = styled((props: AccordionProps) => ( + +))(({ theme }) => ({ + border: `1px solid ${theme.palette.divider}`, + '&:not(:last-child)': { + borderBottom: 0, + }, + '&:before': { + display: 'none', + }, +})); + +const AccordionSummary = styled((props: AccordionSummaryProps) => ( + } + {...props} + /> +))(({ theme }) => ({ + backgroundColor: + theme.palette.mode === 'dark' + ? 'rgba(255, 255, 255, .05)' + : 'rgba(0, 0, 0, .03)', + flexDirection: 'row-reverse', + '& .MuiAccordionSummary-expandIconWrapper.Mui-expanded': { + transform: 'rotate(90deg)', + }, + '& .MuiAccordionSummary-content': { + marginLeft: theme.spacing(1), + }, +})); + +const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ + padding: theme.spacing(2), + borderTop: '1px solid rgba(0, 0, 0, .125)', +})); + +export default function CustomizedAccordions() { + const [expanded, setExpanded] = React.useState('panel1'); + + const handleChange = + (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + const pageTitle = 'Formularium Template History'; + + const { themeStretch } = useSettings(); + + const { id } = useParams(); + + const [corporate, setCorporate] = useState(); + const [ currentCorporate, setCurrentCorporate ] = useState(); + + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\FormulariumTemplate'; + const url = `/audittrail/${id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentCorporate(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + + }, [configuredCorporateContext]); + + return ( +
+ + {currentCorporate?.data.map((item, index) => ( + + + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + + + + + Field + Old Value + New Values + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'deleted_by' || + key === 'deleted_at' || + key === 'created_by' || + key === 'created_at' || + key === 'updated_by' || + key === 'description' + ) { + return null; // Melewati iterasi saat key adalah 'deleted_by' + } + switch (key) { + case 'welcome_message': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'help_text': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'active': + renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; + value = value == 1 ? 'Active' : 'Inactive'; + break; + case 'created_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'delete_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + + const field = key.charAt(0).toUpperCase() + key.slice(1); + if (value == renderedValue) { + return null + } else { + return ( + + {`${field}`} + {`${value}`} + {renderedValue} + + ); + } + })} + + + + + ))} +
+ ); +} diff --git a/frontend/dashboard/src/pages/Master/Formularium/Master/Index.tsx b/frontend/dashboard/src/pages/Master/Formularium/Master/Index.tsx new file mode 100644 index 00000000..e31faf0d --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Formularium/Master/Index.tsx @@ -0,0 +1,38 @@ +import { Card, Grid } from "@mui/material"; +import { useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../../components/HeaderBreadcrumbs"; +import Page from "../../../../components/Page"; +import useSettings from "../../../../hooks/useSettings"; +import List from "./List"; + + + +export default function Divisions() { + const { themeStretch } = useSettings(); + + const { corporate_id } = useParams(); + + const pageTitle = 'Formularium Template'; + return ( + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Master/Formularium/Master/List.tsx b/frontend/dashboard/src/pages/Master/Formularium/Master/List.tsx new file mode 100644 index 00000000..971d0d8a --- /dev/null +++ b/frontend/dashboard/src/pages/Master/Formularium/Master/List.tsx @@ -0,0 +1,334 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; +import HistoryIcon from '@mui/icons-material/History'; +// hooks +import { Link, NavLink as RouterLink } from 'react-router-dom'; +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../../hooks/useSettings'; +import { useParams, useSearchParams } from 'react-router-dom'; +// components +import axios from '../../../../utils/axios'; +import { LaravelPaginatedData } from '../../../../@types/paginated-data'; +import { Icd } from '../../../../@types/diagnosis'; +import BasePagination from '../../../../components/BasePagination'; +import { enqueueSnackbar } from 'notistack'; + +export default function List() { + const { themeStretch } = useSettings(); + const { corporate_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? '' + setSearchText(newSearchText); + } + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch(searchText); // Trigger to Parent + } + + useEffect(() => { // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null) + const [currentImportFileName, setCurrentImportFileName] = useState(null) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected') + } + } + + const handleICDList = async (appliedFilter = null) => { + axios.get('master/diagnosis/list').then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }); + } + + const handleCancelImportButton = () => { + importForm.current.value = ""; + importForm.current.dispatchEvent(new Event("change", { bubbles: true })); + } + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name) + } else { + setCurrentImportFileName(null); + } + } + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append("file", importForm.current?.files[0]) + axios.post(`master/diagnosis/import`, formData ) + .then(response => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data) + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }) + } + } + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + + + return ( +
+ + {( !currentImportFileName && + + {/*

kjasndkjandskjasndkjansdkjansd

*/} + + + + + + +
+ )} +
+ ); + } + + // Called on every row to map the data to the columns + function createData( icd: Icd ): Icd { + return { + ...icd, + } + } + + // Generate the every row of the table + function Row(props: { row: ReturnType }) { + const { row } = props; + const [open, setOpen] = React.useState(false); + + const handleActivate = (model: any, status: string) => { + axios + .put(`/master/formularium-template/${row.id}/activation`, { + // service_code: service.service_code, + active: status == 'active', + }) + .then((res) => { + setDataTableData({ + ...dataTableData, + data: dataTableData.data.map((model) => { + let updatedModel = model; + if (row.id == model.id) { + updatedModel.active = res.data.icd.active; + } + return updatedModel; + }), + }); + }) + .catch((error) => { + // console.log('asdasd', error.response.data.message) + enqueueSnackbar( + error.response.data.message ?? error.message ?? 'Failed Processing Request', + { variant: 'error' } + ); + }); + }; + + return ( + + *': { borderBottom: 'unset' } }}> + {row.name} + {row.description ?? '-'} + + {/* */} + + + + + + + + + + + + + + + ); + } + + // Dummy Default Data + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableLastRequest, setDataTableLastRequest] = useState(0); + const [dataTableResponseState, setDataTableResponseState] = useState('idle'); + const [dataTableData, setDataTableData] = useState({ + current_page: 1, + data: [], + path: "", + first_page_url: "", + last_page: 1, + last_page_url: "", + next_page_url: "", + prev_page_url: "", + per_page: 10, + from: 0, + to: 0, + total: 0 + }); + const [dataTablePage, setDataTablePage] = useState(5); + + const loadDataTableData = async (appliedFilter : any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/master/formularium-template', { params: filter }); + console.log(response.data); + setDataTableLoading(false); + + setDataTableData(response.data); + } + + const headStyle = { + fontWeight: 'bold', + }; + + const applyFilter = async (searchFilter: string) => { + await loadDataTableData({ "search" : searchFilter }); + setSearchParams({ "search" : searchFilter }); + } + + const handlePageChange = (event : ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ["page", value]]); + loadDataTableData(filter); + setSearchParams(filter); + } + + useEffect(() => { + loadDataTableData(); + }, []) + + return ( + + + + + {/* The Main Table */} + + + + + Name + Description + Action + + + {dataTableIsLoading ? + ( + + + Loading + + + ) : ( + dataTableData.data.length == 0 ? + ( + + + No Data + + + ) : ( + + {dataTableData.data.map(row => ( + + ))} + + ) + )} +
+
+ + +
+
+ ); +} diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/CreateUpdate.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/CreateUpdate.tsx new file mode 100644 index 00000000..2e1aa7f7 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/CreateUpdate.tsx @@ -0,0 +1,69 @@ +import { useNavigate, useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import useSettings from "../../../hooks/useSettings"; +import {useContext, useEffect, useMemo, useState } from 'react'; +import axios from '../../../utils/axios'; +import { useSnackbar } from 'notistack'; +import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext"; +import { Corporate, CorporatePlan } from "@/@types/corporates"; +import { MasterFormularium } from "./Type"; +import CreateUpdateForm from "./CreateUpdateForm"; +import Typography from "@/theme/overrides/Typography"; + +export default function CreateUpdate() { + const navigate = useNavigate(); + const { corporate_id, id } = useParams(); + const [corporate, setCorporate] = useState(); + const configuredCorporateContext = useContext(ConfiguredCorporateContext) + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + }, [ConfiguredCorporateContext]) + + const [ currentCorporatePlan, setCurrentCorporatePlan ] = useState(); + const [ currentMasterForm, setCurrentMasterForm ] = useState(); + const isEdit = !!id; + + useEffect(() => { + if (isEdit) { + axios.get(`/master/formularium-template/${id}/edit`) + .then((res) => { + // setCurrentCorporatePlan(res.data); + setCurrentMasterForm(res.data); + }) + .catch((err) => { + if (err.response.status === 404) { + navigate('/404'); + } + }) + } + }, [corporate_id, id]) + + const pageType = !isEdit ? "Create" : "Edit" + const pageTitle = `Master Formularium ${pageType}` + return ( + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/CreateUpdateForm.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/CreateUpdateForm.tsx new file mode 100644 index 00000000..b93d3bfd --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/CreateUpdateForm.tsx @@ -0,0 +1,143 @@ +import * as Yup from 'yup'; +import { LoadingButton } from "@mui/lab"; +import { Button, Card, Grid, Stack, Typography } from "@mui/material"; +import { CorporatePlan } from "../../../@types/corporates"; +import { FormProvider, RHFSwitch, RHFTextField } from "../../../components/hook-form"; +import { useEffect, useMemo } from 'react'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useSnackbar } from 'notistack'; +import { useNavigate, useParams } from 'react-router-dom'; +import axios from '../../../utils/axios'; +import { MasterFormularium } from "./Type"; + + +type Props = { + isEdit: boolean; + currentMasterForm?: MasterFormularium; +}; + +export default function CreateUpdateForm({ isEdit, currentMasterForm }: Props) { + const navigate = useNavigate(); + const { enqueueSnackbar } = useSnackbar(); + + const NewCorporatePlanSchema = Yup.object().shape({ + name: Yup.string().required('Name is required'), + }); + + const defaultValues = useMemo( + () => ({ + name: currentMasterForm?.name || '', + description: currentMasterForm?.description || '', + }), + [currentMasterForm] + ) + + useEffect(() => { + if (isEdit && currentMasterForm) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + }, [isEdit, currentMasterForm]) + + const methods = useForm({ + resolver: yupResolver(NewCorporatePlanSchema), + defaultValues, + }) + + const { + reset, + setError, + handleSubmit, + formState: { isSubmitting } + } = methods; + + const onSubmit = async (data: any) => { + if (!isEdit) { + await axios + .post('/master/formularium-template/store', data) + .then((res) => { + enqueueSnackbar('Formularium created succesfully', {variant: 'success'}); + }) + .then((res) => { + navigate('/master/formularium-template-v2', { replace: true }); + }) + .catch(({ response }) => { + if (response.status === 422) { + for (const [key, value] of Object.entries(response.data.errors)) { + setError(key, { message: value[0] }); + enqueueSnackbar(value[0] ?? 'Failed Processing Reques', { variant: 'error' }); + } + } + else { + enqueueSnackbar('Create Failed : ' + response.data.message, {variant: 'error'}); + } + }); + } else { + await axios + .put(`/master/formularium-template/${currentMasterForm?.id}/update`, data) + .then((res) => { + enqueueSnackbar('Formularium updated successfully', { variant: 'success' }); + }) + .then((res) => { + navigate('/master/formularium-template-v2', { replace: true }); + }) + .catch(({ response }) => { + enqueueSnackbar(`Update Failed : ${response.data.message}`, { variant: 'error' }) + }) + } + } + + return ( + + + + + + Detail + Name* + + Description* + + + + + + + + { isEdit? 'Update' : 'Create' } + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/DetailFormularium.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/DetailFormularium.tsx new file mode 100644 index 00000000..049b3c3a --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/DetailFormularium.tsx @@ -0,0 +1,102 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Grid, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import { LoadingButton } from "@mui/lab"; +import { CachedOutlined, FindInPageOutlined } from '@mui/icons-material'; +// hooks +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../../hooks/useSettings'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { RHFSelect, FormProvider } from '@/components/hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; +// components +import axios from '../../../../utils/axios'; +import Label from '@/components/Label'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; +import DialogUpdateStatus from '@/components/DialogUpdateStatus' +import * as Yup from 'yup'; +import { FormulariumData } from "../Type"; + + +type Props = { + props: FormulariumData, + isActive: number, +} + +export default function DetailFormularium({props, isActive} : Props) { + const [open, setOpen] = React.useState(false); + + + return ( + + + + {props.code} + {props.atc_code} + {props.name} + {props.category_name} + {props.uom} + + {isActive == 1 ? ( + + ) : ( + + )} + + + + setOpen(!open)}> + + Detail + + + } /> + + + + + + + + + + Detail + + Description + : {props.description} + + General Indication + : {props.general_indication} + + Composition + : {props.composition} + + Kategori Obat + : {props.kategori_obat} + + BPOM Registration + : {props.bpom_registration} + + Classification + : {props.classifications} + + Cat For + : {props.cat_for} + + Class + : {props.class} + + Manufacturer + : {props.manufacturer} + + + + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/Formularium.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/Formularium.tsx new file mode 100644 index 00000000..13e09315 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/Formularium.tsx @@ -0,0 +1,316 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Grid, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import AddIcon from '@mui/icons-material/Add'; +import UploadIcon from '@mui/icons-material/Upload'; +import CancelIcon from '@mui/icons-material/Cancel'; +// hooks +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../../hooks/useSettings'; +import { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'; +// components +import axios from '../../../../utils/axios'; +import { LaravelPaginatedData } from '../../../../@types/paginated-data'; +import { Icd } from '../../../../@types/diagnosis'; +import BasePagination from '../../../../components/BasePagination'; +import { enqueueSnackbar } from 'notistack'; +import DetailFormularium from "./DetailFormularium"; +import { FormulariumData } from '../Type'; + + +export default function List() { + const navigate = useNavigate(); + const { id: formularium_template_id } = useParams(); + const [searchParams, setSearchParams] = useSearchParams(); + const [importResult, setImportResult] = useState(null); + const { isActive } = useLocation().state as { isActive: number } + + function SearchInput(props: any) { + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? '' + setSearchText(newSearchText); + } + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch(searchText); + } + + useEffect(() => { + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ); + } + + function ImportForm( props: any ) { + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null) + const [currentImportFileName, setCurrentImportFileName] = useState(null) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) {; + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected') + } + } + + const handleCancelImportButton = () => { + importForm.current.value = ''; + importForm.current?.dispatchEvent(new Event('change', { bubbles: true })) + } + + const handleGetTemplate = (type: string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name) + } else { + setCurrentImportFileName(null); + } + } + + const handleFormulariumList = async (appliedFilter = null) => { + axios.get(`master/formulariums/${formularium_template_id}/list`) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + enqueueSnackbar('Download Success', { variant: 'success' }) + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }); + } + + const handleUpload = () => { + if (importForm.current?.files?.length) { + const formData = new FormData(); + formData.append('file', importForm.current?.files[0]) + axios.post(`master/formulariums/${formularium_template_id}/import`, formData ) + .then(response => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + }) + .catch(response => { + enqueueSnackbar('Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' }) + }) + } else { + enqueueSnackbar(`No File Selected`, { variant: 'warning' }) + } + } + + return ( +
+ + {(!currentImportFileName && + + + + Import + handleGetTemplate('master-formularium')}>Download Template + handleFormulariumList()}>Download Formularium + + + )} + {( currentImportFileName && + + + + + + + )} + {( importResult && + + Last Import Result Report : {importResult.result_file?.name ?? "-"} + + )} +
+ ); + } + + // Default data + const [dataTableRow, setDataTableRow] = useState(null) + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState({ + current_page: 1, + data: [], + path: "", + first_page_url: "", + last_page: 1, + last_page_url: "", + next_page_url: "", + prev_page_url: "", + per_page: 10, + from: 0, + to: 0, + total: 0 + }); + + const loadDataTableData = async (appliedFilter : any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get(`/master/formulariums/${formularium_template_id}`, { params: filter }); + setDataTableLoading(false); + + console.log(formularium_template_id) + console.log(response) + setDataTableData(response.data) + setDataTableRow(response.data.data) + } + + const applyFilter = async (searchFilter: string) => { + await loadDataTableData({ 'search': searchFilter }); + setSearchParams({ 'search' : searchFilter }); + } + + const handlePageChange = (event : ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + } + + useEffect(() => { + loadDataTableData(); + }, []) + + const headStyle = { + fontWeight: 'bold', + }; + + return ( + + + + + + + + + Code + ATC Code + Name + Category Name + UOM + Status + + + + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length == 0 ? ( + + + + No Data + + + + ) : ( + dataTableRow?.map(item => ( + + )) + )} +
+
+ + +
+
+ ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/Index.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/Index.tsx new file mode 100644 index 00000000..381283ef --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/Detail/Index.tsx @@ -0,0 +1,37 @@ +import { Card, Grid } from "@mui/material"; +import { useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../../components/HeaderBreadcrumbs"; +import Page from "../../../../components/Page"; +import useSettings from "../../../../hooks/useSettings"; +import List from "./Formularium"; + + +export default function Formularium() { + const pageTitle = "Formularium" + const { id: formularium_template_id } = useParams(); + + return ( + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/FormulariumRow.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/FormulariumRow.tsx new file mode 100644 index 00000000..919ab2f5 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/FormulariumRow.tsx @@ -0,0 +1,211 @@ +import * as Yup from 'yup'; +import TableMoreMenu from "@/components/table/TableMoreMenu" +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; +import { Button, Card, Collapse, Grid, MenuItem, Paper, Stack, Table, TableCell, TableContainer, TableHead, TableRow, Typography } from "@mui/material" +import React, { Fragment, useEffect, useState } from "react"; +import axios from "@/utils/axios"; +import { useNavigate, useParams } from "react-router-dom"; +import { RHFSelect, FormProvider } from '@/components/hook-form'; +import DialogUpdateStatus from '@/components/DialogUpdateStatus' +import { MasterFormularium } from "./Type"; +import { LoadingButton } from "@mui/lab"; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; + +type Props = { + props: MasterFormularium +} + +export default function FormulariumRow({props} : Props) { + const navigate = useNavigate(); + + const [isDialogOpen, setDialogOpen] = useState(false); + const [dataValue, setDataValue] = useState(null); + const [dataDescription, setDescriptionValue] = useState(''); + const [url, setUrl] = useState(''); + let titles = { + name: 'Update Status', + icon: '-' + } + type FormValuesProps = { + value: string; + active: boolean; + }; + + const handleActivate = (isOpen: boolean, dataValue: MasterFormularium) => { + setDialogOpen(isOpen); + setDataValue(dataValue); + setDescriptionValue("Are you sure to inactive this formularium ? "); + setUrl(url); + }; + + const NewMasterFormSchema = Yup.object().shape({ + reason: Yup.string().required('Reason edit is required') + }); + + const methods = useForm({ + resolver: yupResolver(NewMasterFormSchema) + }); + + const onSubmit = async (row: any) => { + try { + handleUpdate(dataValue?.active, dataValue?.id, row.reason) + } catch (error: any) { + console.log('data gagal'); + } + + const ascent = document?.querySelector('ascent'); + if (ascent != null) { + ascent.innerHTML = ''; + } + }; + + const handleUpdate = (active: number, id: number, reason: string) => { + + if (active == 1) { + active = 0 + } else { + active = 1 + } + + axios + .put(`/master/formularium-template/${id}/activation`, { + active: active, + }) + .then((res) => { + window.location.reload(); + }) + } + + const { + reset, + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const getContent = () => ( + <> + + Are you sure to Change this Formularium + + + + + Formularium name + + + {dataValue?.name} + + + + + Reason for update + + + + + + + + + + + + {dataValue?.active == 1 ? + + Inactive + : + + Active + + } + + + + + + + ) + + return ( + + + + {props.name} + {props.description} + + + navigate(`/master/formularium-template-v2/${props.id}/detail`, {state: { isActive: props.active }})}> + + Detail + + navigate(`/master/formularium-template-v2/${props.id}/edit`)}> + + Edit + + handleActivate(true, { + id: props.id, + name: props.name, + description: props.description, + active: props.active + }) + }> + + Update Status + + navigate(`/master/formularium-template-v2/${props.id}/history`)}> + + History + + + } /> + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/History.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/History.tsx new file mode 100644 index 00000000..ca991be6 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/History.tsx @@ -0,0 +1,211 @@ +// @mui +import { + Box, + Button, + Card, + Collapse, + Container, + FormControl, + Grid, + IconButton, + InputLabel, + MenuItem, + OutlinedInput, + Paper, + Select, + SelectChangeEvent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Typography, + Badge, + Stack, + } from '@mui/material'; + import * as React from 'react'; +import { useParams } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; +import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; +import { useContext, useEffect, useState } from 'react'; +import MuiAccordionSummary, { + AccordionSummaryProps, +} from '@mui/material/AccordionSummary'; +import useSettings from '../../../hooks/useSettings'; +import axios from '../../../utils/axios'; +import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext'; +import MuiAccordionDetails from '@mui/material/AccordionDetails'; +import HeaderBreadcrumbs from '../../../components/HeaderBreadcrumbs'; +import { Corporate } from '@/@types/corporates'; +import { fDate, fDateTime } from '@/utils/formatTime'; + + +const Accordion = styled((props: AccordionProps) => ( + +))(({ theme }) => ({ + border: `1px solid ${theme.palette.divider}`, + "&:not(:last-child)": { + borderBottom: 0, + }, + "&:before": { + display: 'none' + }, +})); + +const AccordionSummary = styled((props: AccordionSummaryProps) => ( + } + {...props} + /> +))(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' + ? 'rgba(255,255,255,0.5)' + : 'rgba(0,0,0,.03)', + flexDirection: 'row-reverse', + "& .MuiAccordionSummary-expandIconWrapper.Mui-expanded": { + transform: 'rotate(90dg)', + }, + "& .MuiAccordionSummary=content": { + marginLeft: theme.spacing(1), + }, +})); + +const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ + padding: theme.spacing(2), + borderTop: '1px solid rgba(0,0,0,.125)', +})); + +export default function MasterFormulariumHistory() { + const [expanded, setExpanded] = React.useState('panel1'); + + const handleChange = (panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + const pageTitle = 'Master Formularium History' + const { id } = useParams(); + const { corporate_id } = useParams(); + const [corporate, setCorporate] = useState(); + const [currentCorporate, setCurrentCorporate] = useState(); + const configuredCorporateContext = useContext(ConfiguredCorporateContext); + + useEffect(() => { + setCorporate(configuredCorporateContext.currentCorporate); + const model = 'App\\Models\\FormulariumTemplate'; + const url = `/audittrail/${id}?model=${model}`; + axios.get(url) + .then((res) => { + setCurrentCorporate(res.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan: ', error); + }); + }, [configuredCorporateContext]) + + return ( +
+ + {currentCorporate?.data.map((item, index) => ( + + + {`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`} + + + + + + + Field + Old Value + New Values + + + + {Object.entries(item.old_values).map(([key, value]) => { + let renderedValue; + if (key === 'deleted_by' || + key === 'deleted_at' || + key === 'created_by' || + key === 'created_at' || + key === 'updated_by' || + key === 'description' + ) { + return null; // Melewati iterasi saat key adalah 'deleted_by' + } + switch (key) { + case 'welcome_message': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'help_text': + renderedValue = item.new_values[key].replace(/<[^>]*>/g, ''); + value = value.replace(/<[^>]*>/g, ''); + break; + case 'active': + renderedValue = item.new_values[key] == 1 ? 'Active' : 'Inactive'; + value = value == 1 ? 'Active' : 'Inactive'; + break; + case 'created_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'updated_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + case 'delete_at': + renderedValue = fDateTime(item.new_values[key]); + value = fDateTime(value); + break; + default: + renderedValue = item.new_values[key]; + break; + } + + const field = key.charAt(0).toUpperCase() + key.slice(1); + if (value == renderedValue) { + return null + } else { + return ( + + {`${field}`} + {`${value}`} + {renderedValue} + + ); + } + })} + +
+
+
+
+ ))} +
+ ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/Index.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/Index.tsx new file mode 100644 index 00000000..370d2f9e --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/Index.tsx @@ -0,0 +1,33 @@ +import { Card, Grid } from "@mui/material"; +import { useParams } from "react-router-dom"; +import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; +import Page from "../../../components/Page"; +import useSettings from "../../../hooks/useSettings"; +import List from "./List"; + +export default function MasterFormularium() { + const pageTitle = "Master Formularium" + + return ( + + + + + + + + + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/List.tsx b/frontend/dashboard/src/pages/Master/FormulariumV2/List.tsx new file mode 100644 index 00000000..dda9ab94 --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/List.tsx @@ -0,0 +1,172 @@ +// @mui +import { Box, Button, Card, Collapse, IconButton, InputLabel, MenuItem, OutlinedInput, Paper, Grid, Select, SelectChangeEvent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, Badge, Tab, Tabs, CardHeader, Stack, Menu, ButtonGroup, Pagination } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +// hooks +import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react'; +import useSettings from '../../../hooks/useSettings'; +import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; +// components +import axios from '../../../utils/axios'; +import { LaravelPaginatedData } from '../../../@types/paginated-data'; +import BasePagination from '../../../components/BasePagination'; +import FormulariumRow from "./FormulariumRow"; +import { MasterFormularium } from "./Type"; + +export default function List() { + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + + // Default data + const [dataTableRow, setDataTableRow] = useState(null) + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState({ + current_page: 1, + data: [], + path: "", + first_page_url: "", + last_page: 1, + last_page_url: "", + next_page_url: "", + prev_page_url: "", + per_page: 10, + from: 0, + to: 0, + total: 0 + }); + + const loadDataTableData =async (appliedFilter: any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + const response = await axios.get('/master/formularium-template', { params: filter }); + console.log(response.data); + console.log(response.data.data) + setDataTableLoading(false); + + setDataTableData(response.data); + setDataTableRow(response.data.data); + } + + const applyFilter = async (searchFilter: string) => { + await loadDataTableData({'search' : searchFilter }); + setSearchParams({ 'search' : searchFilter }) + } + + const handlePageChange = (event : ChangeEvent, value: number) => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + } + + useEffect(() => { + loadDataTableData(); + }, []) + + function SearchInput(props: any) { + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(""); + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? "" + setSearchText(newSearchText) + } + + const handleSearchSubmit = (event: any) => { + event.preventDefault(); + props.onSearch(searchText); + } + + useEffect(() => { + setSearchText(searchParams.get('search') ?? ''); + }, [searchParams]) + + return ( +
+ + + ) + } + + function SearchCreate(props: any) { + return ( +
+ + + + +
+ ) + } + + const headStyle = { + fontWeight: 'bold' + } + + return ( + + + + + + + + + + Name + Description + + + + {dataTableIsLoading ? ( + + + + Loading + + + + ) : dataTableData.data.length == 0 ? ( + + + + No Data + + + + ) : ( + + {dataTableRow?.map(item => ( + + ))} + + )} +
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Master/FormulariumV2/Type.ts b/frontend/dashboard/src/pages/Master/FormulariumV2/Type.ts new file mode 100644 index 00000000..3e16e32e --- /dev/null +++ b/frontend/dashboard/src/pages/Master/FormulariumV2/Type.ts @@ -0,0 +1,32 @@ +export type MasterFormularium = { + id: number + name: string + description: string + active: number +} + + +export type FormulariumData = { + id: number + code: string + name: string + description: string + manufacturer: string + category_name: string + kategori_obat: string + uom: string + general_indication: string + composition: string + atc_code: string + class: string + bpom_registration: string + classifications: string + cat_for: string + created_at: string + updated_at: string + deleted_at: any + created_by: number + updated_by: number + deleted_by: any + formularium_template_id: number + } \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Report/DoctorRating/index.tsx b/frontend/dashboard/src/pages/Report/DoctorRating/index.tsx deleted file mode 100644 index 374a2335..00000000 --- a/frontend/dashboard/src/pages/Report/DoctorRating/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Card, Grid, Container } from '@mui/material'; -import { useParams } from 'react-router-dom'; -import HeaderBreadcrumbs from '@/components/HeaderBreadcrumbs'; -import Page from '@/components/Page'; -import useSettings from '@/hooks/useSettings'; -import List from './List_2'; - -export default function DoctorRating(){ - const { themeStretch } = useSettings(); - - const { id } = useParams(); - - const pageTitle = 'Doctor Rating'; - - return( - - - - - - - - - - ); -} \ No newline at end of file diff --git a/frontend/dashboard/src/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index 455291c5..3d0a249c 100644 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -92,7 +92,7 @@ export default function Router() { element: , }, { - path: 'corporate', + path: 'corporates', element: , // Layout that use the context children: [ { @@ -135,6 +135,10 @@ export default function Router() { path: ':corporate_id/benefits/:benefit_id/history', element: , }, + { + path: ':corporate_id/benefits/:benefit_id/edit', + element: , + }, { path: ':corporate_id/members', element: , @@ -157,20 +161,47 @@ export default function Router() { element: , }, { - path: ':corporate_id/formularium', + path: ':corporate_id/formulariums', element: , }, + { + path: ':corporate_id/formulariums/create', + element: + }, + { + path: ':corporate_id/formulariums/:id/history', + element: + }, { path: ':corporate_id/diagnosis-exclusions', element: , }, + { + path: ':corporate_id/diagnosis-exclusions/:exclusion_id/edit', + element: , + }, + { + path: ':corporate_id/diagnosis-exclusions/history', + element: , + }, { path: ':corporate_id/hospitals', element: , }, - + { + path: ':corporate_id/hospitals/create', + element: , + }, + { + path: ':corporate_id/hospitals/edit/:id/:organization_id', + element: , + }, + { + path: ':corporate_id/hospitals/:id/history', + element: , + }, { path: ':corporate_id/claim-history', element: , @@ -185,7 +216,48 @@ export default function Router() { path: 'corporates/:corporate_id/edit', element: , }, - + { + path: 'case_management', // Case Management + element: '', + children: [ + { + path: 'daily_monitoring', // Daily Monitoring + element: + }, + { + path: 'daily_monitoring/:member_id/claims', + element: + }, + { + path: 'daily_monitoring/:member_id/claims/:claim_code/add_monitoring', + element: + }, + { + path: 'daily_monitoring/:member_id/claims/:claim_code/list_monitoring', + element: + }, + { + path: 'laboratorium_result', // Laboratorium Result + element: + }, + { + path: 'laboratorium_result/:member_id/claims', + element: + }, + { + path: 'laboratorium_result/:member_id/claims/:claim_code/add_lab_result', + element: + }, + { + path: 'laboratorium_result/:member_id/claims/:claim_code/list_lab_result', + element: + }, + { + path: 'inpatient_monitoring', // Inpatient Monitoring + element: + }, + ] + }, { path: 'corporates/:corporate_id/corporate-plans/create', element: , @@ -238,8 +310,29 @@ export default function Router() { }, { path: 'master/diagnosis', + element: , + }, + { + path: 'master/diagnosis/create', + element: , + }, + { + path: 'master/diagnosis-template/:id/diagnosis-template-history', + element: , + }, + { + path: 'master/diagnosis-template/:id/edit', + element: , + }, + + { + path: 'master/diagnosis/:diagnosis_template_id', element: , }, + { + path: 'master/diagnosis/:id/diagnosis-history', + element: , + }, { path: 'master/drugs', @@ -247,14 +340,51 @@ export default function Router() { }, { - path: 'master/formularium', + path: 'master/formularium/:formularium_template_id', element: , }, { - path: 'master/formularium/create', + path: 'master/formularium/create/:formularium_template_id', element: , }, + { + path: 'master/formularium-template', + element: , + }, + { + path: 'master/formularium-template/create', + element: , + }, + { + path: 'master/formularium-template/:id/formularium-template-history', + element: , + }, + { + path: 'master/formularium-template/:id/edit', + element: , + }, + { + path: 'master/formularium-template-v2', + element: + }, + { + path: 'master/formularium-template-v2/create', + element: + }, + { + path: 'master/formularium-template-v2/:id/edit', + element: + }, + { + path: 'master/formularium-template-v2/:id/history', + element: + }, + { + path: 'master/formularium-template-v2/:id/detail', + element: + }, + { path: 'report/appointments', element: , @@ -304,18 +434,38 @@ export default function Router() { path: 'claims', element: , }, - { - path: 'claim-requests', - element: , - }, { path: 'claims/create', element: , }, + { + path: 'claims/edit/:id', + element: , + }, + { + path: 'claims/detail/:id', + element: , + }, { path: 'claims/:id', element: , }, + { + path: 'claim-requests', + element: , + }, + { + path: 'claim-requests/create', + element: , + }, + { + path: 'claim-requests/edit/:id', + element: , + }, + { + path: 'claim-requests/detail/:id', + element: , + }, { path: 'profile', element: , @@ -324,6 +474,22 @@ export default function Router() { path: 'cs-membership', element: , }, + { + path: 'custormer-service/request', + element: , + }, + { + path: 'custormer-service/request/detail/:id', + element: , + }, + { + path: 'custormer-service/final-log', + element: , + }, + { + path: 'custormer-service/final-log/detail/:id', + element: , + }, ], }, // { @@ -384,7 +550,7 @@ const CorporateDivisionsCreate = Loadable( ); const CorporateMembers = Loadable(lazy(() => import('../pages/Corporates/Member/Index'))); -const CorporateHistoryMembers = Loadable(lazy(() => import('../pages/Corporates/Member/sections/History'))); +const CorporateHistoryMembers = Loadable(lazy(() => import('../pages/Corporates/Member/History'))); const BenefitCreate = Loadable(lazy(() => import('../pages/Corporates/Benefit/Create'))); const Benefits = Loadable(lazy(() => import('../pages/Corporates/Benefit/Index'))); @@ -398,6 +564,9 @@ const CorporateBenefits = Loadable( const CorporateBenefitsHistory = Loadable( lazy(() => import('../pages/Corporates/Benefit/sections/History')) ); +const CorporateBenefitsEdit = Loadable( + lazy(() => import('../pages/Corporates/Benefit/Create')) +); const CorporatePlanCreate = Loadable( lazy(() => import('../pages/Corporates/CorporatePlan/CreateUpdate')) @@ -411,10 +580,58 @@ const CorporatePlansHistory = Loadable(lazy(() => import('../pages/Corporates/Pl const DiagnosisExclusions = Loadable( lazy(() => import('../pages/Corporates/DiagnosisExclusion/Index')) ); +const EditDiagnosisExclusions = Loadable( + lazy(() => import('../pages/Corporates/DiagnosisExclusion/Edit')) +); +const DiagnosisExclusionsHistory = Loadable( + lazy(() => import('../pages/Corporates/DiagnosisExclusion/History')) +); + const CorporateFormularium = Loadable(lazy(() => import('../pages/Corporates/Formularium/Index'))); +const CorporateFormulariumCreate = Loadable(lazy(() => import('../pages/Corporates/Formularium/New/CreateForm'))); +const CorporateFormulariumHistory = Loadable(lazy(() => import('../pages/Corporates/Formularium/New/History'))) +/** + * Case Management + * ------------------------------- + */ +// Daily Monitoring +const DailyMonitoring = Loadable(lazy(() => import('../pages/CaseManagement/DailyMonitoring/index'))) +const DailyMonitoringClaims = Loadable(lazy(() => import('../pages/CaseManagement/DailyMonitoring/Claim'))) +const DetailMonitoringForm = Loadable(lazy(() => import('../pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm'))) +const DetailMonitoringList = Loadable(lazy(() => import('../pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList'))) +// Laboratorium Result +const LaboratoriumResult = Loadable(lazy(() => import('../pages/CaseManagement/LaboratoriumResult/index'))) +const LaboratoriumResultClaims = Loadable(lazy(() => import('../pages/CaseManagement/LaboratoriumResult/Claim'))) +const DetailLabResultForm = Loadable(lazy(() => import('../pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultForm'))) +const DetailLabResultList = Loadable(lazy(() => import('../pages/CaseManagement/LaboratoriumResult/Components/DetailLabResultList'))) +// Inpatient Monitoring +const InpatientMonitoring = Loadable(lazy(() => import('../pages/CaseManagement/InpatientMonitoring/Index'))) + + +/** + * Customer Service + */ +// Request +const RequestLog = Loadable(lazy(() => import('../pages/CustomerService/Request/Index'))) +const RequestLogDetail = Loadable(lazy(() => import('../pages/CustomerService/Request/Detail'))) +// Final LOG +const FinalLog = Loadable(lazy(() => import('../pages/CustomerService/FinalLog/Index'))) +const FinalLogDetail = Loadable(lazy(() => import('../pages/CustomerService/FinalLog/Detail'))) + + + + +const MasterDiagnosisTemplate = Loadable(lazy(() => import('../pages/Master/Diagnosis/Master/Index'))); +const MasterDiagnosisTemplateCreate = Loadable(lazy(() => import('../pages/Master/Diagnosis/Master/CreateUpdate'))); +const MasterDiagnosisTemplateHistories = Loadable( + lazy(() => import('../pages/Master/Diagnosis/Master/History')) +); const MasterDiagnosis = Loadable(lazy(() => import('../pages/Master/Diagnosis/Index'))); +const MasterDiagnosisHistories = Loadable( + lazy(() => import('../pages/Master/Diagnosis/History')) +); const MasterDoctors = Loadable(lazy(() => import('../pages/Master/Doctors/Index'))); const MasterDoctorsCreate = Loadable(lazy(() => import('../pages/Master/Doctors/Create'))); const MasterHospitals = Loadable(lazy(() => import('../pages/Master/Hospitals/Index'))); @@ -435,14 +652,25 @@ const MasterDrug = Loadable(lazy(() => import('../pages/Master/Drug/Index'))); const MasterFormularium = Loadable(lazy(() => import('../pages/Master/Formularium/Index'))); const MasterFormulariumCreate = Loadable(lazy(() => import('../pages/Master/Formularium/Create'))); +const MasterFormulariumTemplate = Loadable(lazy(() => import('../pages/Master/Formularium/Master/Index'))); +const MasterFormulariumTemplateCreate = Loadable(lazy(() => import('../pages/Master/Formularium/Master/CreateUpdate'))); +const MasterFormulariumTemplateHistories = Loadable(lazy(() => import('../pages/Master/Formularium/Master/History'))); + +const MasterFormulariumTemplateV2 = Loadable(lazy(() => import('../pages/Master/FormulariumV2/Index'))); +const MasterFormulariumTemplateCreateV2 = Loadable(lazy(() => import('../pages/Master/FormulariumV2/CreateUpdate'))); +const MasterFormulariumTemplateHistoriesV2 = Loadable(lazy(() => import('../pages/Master/FormulariumV2/History'))); +const MasterFormulariumTemplateDetailV2 = Loadable(lazy(() => import('../pages/Master/FormulariumV2/Detail/Index'))) + const CorporateServices = Loadable(lazy(() => import('../pages/Corporates/Services/Index'))); const CorporateServicesCreate = Loadable(lazy(() => import('../pages/Corporates/Services/Create'))); const CorporateServicesHistory = Loadable(lazy(() => import('../pages/Corporates/Services/sections/History'))); const CorporateHospitals = Loadable(lazy(() => import('../pages/Corporates/Hospital/Index'))); +const HospitalCreateUpdate = Loadable(lazy(() => import('../pages/Corporates/Hospital/CreateUpdate'))); const CorporateClaimHistories = Loadable( lazy(() => import('../pages/Corporates/ClaimHistory/Index')) ); +const HospitalHistory = Loadable(lazy(() => import('../pages/Corporates/Hospital/History'))); const CorporateHistories = Loadable( lazy(() => import('../pages/Corporates/History')) @@ -452,9 +680,12 @@ const Profile = Loadable(lazy(() => import('../pages/Profile/Index'))); const Claims = Loadable(lazy(() => import('../pages/Claims/Index'))); const ClaimsCreate = Loadable(lazy(() => import('../pages/Claims/CreateUpdate'))); +const ClaimsDetail = Loadable(lazy(() => import('../pages/Claims/Detail'))); const ClaimShow = Loadable(lazy(() => import('../pages/Claims/Show'))); const ClaimRequests = Loadable(lazy(() => import('../pages/ClaimRequests/Index'))); +const ClaimRequestsCreate = Loadable(lazy(() => import('../pages/ClaimRequests/CreateUpdate'))); +const ClaimRequestsDetail = Loadable(lazy(() => import('../pages/ClaimRequests/Detail'))); -const Membership = Loadable(lazy(() => import('../pages/Service/Membership/index'))); \ No newline at end of file +const Membership = Loadable(lazy(() => import('../pages/Service/Membership/index'))); diff --git a/frontend/dashboard/src/store/claimsHistorySlice.ts b/frontend/dashboard/src/store/claimsHistorySlice.ts new file mode 100644 index 00000000..b5ac604d --- /dev/null +++ b/frontend/dashboard/src/store/claimsHistorySlice.ts @@ -0,0 +1,18 @@ +import { createSlice } from "@reduxjs/toolkit"; + +const claimsHistory = createSlice({ + name:'claims-history', + + initialState:{ + claimsHistory: [] + }, + reducers:{ + setClaims(states, actions){ + states.claimsHistory = actions.payload + } + } +}) + +export const claimsHistoryAction = claimsHistory.actions + +export default claimsHistory.reducer \ No newline at end of file diff --git a/frontend/dashboard/src/store/index.ts b/frontend/dashboard/src/store/index.ts new file mode 100644 index 00000000..c0469eb4 --- /dev/null +++ b/frontend/dashboard/src/store/index.ts @@ -0,0 +1,14 @@ +import { configureStore } from '@reduxjs/toolkit'; +import claims from "./claimsHistorySlice" + +const store = configureStore({ + reducer: { + claimsHistory: claims + // auth: authReducer, + // nav: navReducer + } +}) + +export default store + + diff --git a/frontend/dashboard/src/theme/overrides/Aso.ts b/frontend/dashboard/src/theme/overrides/Aso.ts new file mode 100644 index 00000000..d60a4f21 --- /dev/null +++ b/frontend/dashboard/src/theme/overrides/Aso.ts @@ -0,0 +1,10 @@ +import { Button, Card, Paper, TableRow } from '@mui/material'; +import { TableCell, styled as materialStyled } from '@mui/material'; +import { LoadingButton } from '@mui/lab'; + +// export const HeaderCell = materialStyled(TableCell)(({ theme }) => ({ +// backgroundColor: theme.palette.background.neutral, +// borderBottom: 'none', +// paddingTop: '16px', +// paddingBottom: '16px', +// })); \ No newline at end of file diff --git a/frontend/dashboard/src/theme/overrides/Table.ts b/frontend/dashboard/src/theme/overrides/Table.ts index 0b8a6f9d..d4249380 100644 --- a/frontend/dashboard/src/theme/overrides/Table.ts +++ b/frontend/dashboard/src/theme/overrides/Table.ts @@ -44,10 +44,12 @@ export default function Table(theme: Theme) { body: { '&:first-of-type': { paddingLeft: theme.spacing(3), + // borderBottom: 'none', }, '&:last-of-type': { paddingRight: theme.spacing(3), }, + borderBottom: '1px solid rgba(145, 158, 171, 0.24)', }, }, }, diff --git a/frontend/dashboard/src/theme/palette.ts b/frontend/dashboard/src/theme/palette.ts index cc7367af..f2ca22ce 100644 --- a/frontend/dashboard/src/theme/palette.ts +++ b/frontend/dashboard/src/theme/palette.ts @@ -62,11 +62,11 @@ declare module '@mui/material' { // SETUP COLORS const PRIMARY = { - lighter: '#C8FACD', - light: '#5BE584', - main: '#00AB55', - dark: '#007B55', - darker: '#005249', + lighter: '#D1F1F1', + light: '#70EAD5', + main: '#19BBBB', + dark: '#0C7186', + darker: '#043C59', }; const SECONDARY = { lighter: '#D6E4FF', diff --git a/frontend/dashboard/src/utils/formatString.ts b/frontend/dashboard/src/utils/formatString.ts index 5589c2f4..1346b2e9 100644 --- a/frontend/dashboard/src/utils/formatString.ts +++ b/frontend/dashboard/src/utils/formatString.ts @@ -1,3 +1,5 @@ +import { string } from "yup"; + export function clearTag(htmlString: string | undefined) { return htmlString?.replace(/(<([^>]+)>)/gi, ""); } @@ -9,3 +11,9 @@ export function limitString(anyString: string | undefined, limit: number = 50) { export function makeExcerpt(htmlString: string | undefined, limit: number = 50) { return limitString(clearTag(htmlString ?? ''), limit); } + +export function capitalizeFirstLetter(text: string) { + return text.charAt(0).toUpperCase() + text.slice(1); +} + + diff --git a/frontend/dashboard/src/utils/formatTime.ts b/frontend/dashboard/src/utils/formatTime.ts index c2df7cc7..2bca0113 100644 --- a/frontend/dashboard/src/utils/formatTime.ts +++ b/frontend/dashboard/src/utils/formatTime.ts @@ -3,13 +3,17 @@ import { format, getTime, formatDistanceToNow } from 'date-fns'; // ---------------------------------------------------------------------- export function fDate(date: Date | string | number) { - return format(new Date(date), 'dd MMMM yyyy'); + return format(new Date(date), 'dd MMM yyyy'); } export function fDateTime(date: Date | string | number) { return format(new Date(date), 'dd MMM yyyy p'); } +export function fDateTimesecond(date: Date | string | number) { + return format(new Date(date), 'dd MMM yyyy HH:mm:ss'); +} + export function fTimestamp(date: Date | string | number) { return getTime(new Date(date)); } @@ -31,3 +35,9 @@ export function fPostFormat(date: Date | string | number) { export function fDateOnly(date: Date | string | number) { return format(new Date(date), 'yyyy-MM-dd'); } + +export function toTitleCase(str: string | null) { + return str.replace(/\w\S*/g, function(txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); +} diff --git a/frontend/dashboard/yarn.lock b/frontend/dashboard/yarn.lock index ddc53d29..e66587f0 100644 --- a/frontend/dashboard/yarn.lock +++ b/frontend/dashboard/yarn.lock @@ -3,6 +3,7 @@ "@aashutoshrathi/word-wrap@^1.2.3": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" "resolved" "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" @@ -19,6 +20,8 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "1.2.6" resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== @@ -36,6 +39,7 @@ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: <<<<<<< HEAD +<<<<<<< HEAD ======= ======= "integrity" "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" @@ -52,6 +56,8 @@ ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" @@ -65,6 +71,7 @@ jsonpointer "^5.0.0" leven "^3.1.0" +<<<<<<< HEAD <<<<<<< HEAD "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.5": "integrity" "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==" @@ -89,31 +96,28 @@ version "7.22.10" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz" integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== - dependencies: - "@babel/highlight" "^7.22.10" - chalk "^2.4.2" ======= -<<<<<<< HEAD -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +>>>>>>> origin/staging dependencies: - "@babel/highlight" "^7.22.5" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== -<<<<<<< HEAD -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.17.10", "@babel/core@^7.19.6", "@babel/core@^7.22.11", "@babel/core@^7.4.0-0": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== +"@babel/core@^7.11.1", "@babel/core@^7.16.0", "@babel/core@^7.17.10", "@babel/core@^7.19.6", "@babel/core@^7.22.11": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== dependencies: "@ampproject/remapping" "^2.2.0" +<<<<<<< HEAD ======= "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.17.10", "@babel/core@^7.19.6", "@babel/core@^7.20.12", "@babel/core@^7.4.0-0", "@babel/core@>=7.11.0": version "7.22.9" @@ -175,26 +179,38 @@ "@babel/traverse" "^7.22.11" "@babel/types" "^7.22.11" convert-source-map "^1.7.0" +======= + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" +>>>>>>> origin/staging debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" "@babel/eslint-parser@^7.16.3", "@babel/eslint-parser@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.11.tgz" - integrity sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w== + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz" + integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -203,6 +219,7 @@ version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +<<<<<<< HEAD ======= "@babel/helpers" "^7.22.10" "@babel/parser" "^7.22.10" @@ -270,6 +287,8 @@ ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: "@babel/types" "^7.22.5" @@ -282,6 +301,7 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" +<<<<<<< HEAD <<<<<<< HEAD "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.22.9": "integrity" "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==" @@ -306,13 +326,20 @@ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz" integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +>>>>>>> origin/staging dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" <<<<<<< HEAD +<<<<<<< HEAD ======= ======= "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.22.10": @@ -328,6 +355,8 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1", "@babel/helper-create-class-features-plugin@^7.17.6": version "7.17.6" @@ -364,6 +393,7 @@ resolve "^1.14.2" semver "^6.1.2" +<<<<<<< HEAD "@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.22.5": <<<<<<< HEAD "integrity" "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" @@ -386,6 +416,12 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +>>>>>>> origin/staging "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" @@ -394,6 +430,7 @@ dependencies: "@babel/types" "^7.16.7" +<<<<<<< HEAD "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.22.5": <<<<<<< HEAD "integrity" "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==" @@ -415,12 +452,19 @@ "version" "7.22.5" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== >>>>>>> origin/staging dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.16.7", "@babel/helper-hoist-variables@^7.22.5": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==" "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" @@ -441,6 +485,11 @@ "version" "7.22.5" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== >>>>>>> origin/staging dependencies: "@babel/types" "^7.22.5" @@ -452,6 +501,7 @@ dependencies: "@babel/types" "^7.16.7" +<<<<<<< HEAD "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": <<<<<<< HEAD "integrity" "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==" @@ -473,10 +523,17 @@ "version" "7.22.5" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== >>>>>>> origin/staging dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" +<<<<<<< HEAD "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.22.9": <<<<<<< HEAD "integrity" "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==" @@ -498,13 +555,19 @@ "version" "7.22.9" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== >>>>>>> origin/staging dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" @@ -514,6 +577,7 @@ "@babel/types" "^7.16.7" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" @@ -535,6 +599,11 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +>>>>>>> origin/staging "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" @@ -557,6 +626,7 @@ "@babel/types" "^7.16.7" "@babel/helper-simple-access@^7.16.7", "@babel/helper-simple-access@^7.22.5": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==" "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" @@ -577,6 +647,11 @@ "version" "7.22.5" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== >>>>>>> origin/staging dependencies: "@babel/types" "^7.22.5" @@ -589,6 +664,7 @@ "@babel/types" "^7.16.0" "@babel/helper-split-export-declaration@^7.16.7", "@babel/helper-split-export-declaration@^7.22.6": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==" "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" @@ -609,11 +685,17 @@ "version" "7.22.6" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== >>>>>>> origin/staging dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.22.5": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" @@ -633,15 +715,18 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +<<<<<<< HEAD "@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" @@ -665,6 +750,12 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +>>>>>>> origin/staging "@babel/helper-wrap-function@^7.16.8": version "7.16.8" @@ -676,6 +767,7 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" +<<<<<<< HEAD <<<<<<< HEAD "@babel/helpers@^7.22.6": "integrity" "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==" @@ -705,20 +797,27 @@ version "7.22.11" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz" integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== +======= +"@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== +>>>>>>> origin/staging dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" +<<<<<<< HEAD "@babel/parser@^7.1.0", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5": version "7.22.11" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz" @@ -773,6 +872,12 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +>>>>>>> origin/staging "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" @@ -971,17 +1076,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -<<<<<<< HEAD -"@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.16.7", "@babel/plugin-syntax-flow@^7.22.5": +"@babel/plugin-syntax-flow@^7.16.7", "@babel/plugin-syntax-flow@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz" integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== -======= -"@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.16.7", "@babel/plugin-syntax-flow@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" - integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -992,6 +1090,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +<<<<<<< HEAD <<<<<<< HEAD "@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.22.5": "integrity" "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==" @@ -999,10 +1098,13 @@ "version" "7.22.5" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "@babel/plugin-syntax-jsx@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== +<<<<<<< HEAD ======= "@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.22.5": <<<<<<< HEAD @@ -1015,6 +1117,8 @@ "version" "7.22.5" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1303,6 +1407,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +<<<<<<< HEAD <<<<<<< HEAD "@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.3", "@babel/plugin-transform-react-jsx@^7.20.7": "integrity" "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==" @@ -1326,6 +1431,12 @@ "version" "7.22.5" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= +"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.3", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== >>>>>>> origin/staging dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -1548,6 +1659,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" +<<<<<<< HEAD <<<<<<< HEAD "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": "integrity" "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==" @@ -1566,29 +1678,34 @@ version "7.22.11" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz" integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== +======= +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.15", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.23.1" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== +>>>>>>> origin/staging dependencies: regenerator-runtime "^0.14.0" -======= -<<<<<<< HEAD -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== - dependencies: - regenerator-runtime "^0.13.11" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +<<<<<<< HEAD "@babel/template@^7.16.7", "@babel/template@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== <<<<<<< HEAD +>>>>>>> origin/staging +======= +"@babel/template@^7.16.7", "@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== >>>>>>> origin/staging dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" +<<<<<<< HEAD <<<<<<< HEAD "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": "integrity" "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==" @@ -1661,16 +1778,31 @@ <<<<<<< HEAD "@babel/parser" "^7.22.11" "@babel/types" "^7.22.11" +======= +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.23.0": + version "7.23.2" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" +>>>>>>> origin/staging debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.20.0", "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.3.0", "@babel/types@^7.4.4": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@date-io/core@^2.14.0", "@date-io/core@^2.16.0", "@date-io/core@^2.17.0": @@ -1682,6 +1814,7 @@ version "2.17.0" resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.17.0.tgz" integrity sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng== +<<<<<<< HEAD ======= <<<<<<< HEAD "@babel/parser" "^7.22.7" @@ -1733,6 +1866,8 @@ "version" "2.16.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: "@date-io/core" "^2.17.0" @@ -1757,35 +1892,21 @@ dependencies: "@date-io/core" "^2.16.0" -<<<<<<< HEAD "@emotion/babel-plugin@^11.11.0": version "11.11.0" resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== -======= -"@emotion/babel-plugin@^11.10.5": - version "11.10.5" - resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz" - integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/runtime" "^7.18.3" -<<<<<<< HEAD "@emotion/hash" "^0.9.1" "@emotion/memoize" "^0.8.1" "@emotion/serialize" "^1.1.2" -======= - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" -<<<<<<< HEAD stylis "4.2.0" <<<<<<< HEAD @@ -1798,6 +1919,7 @@ version "11.11.0" resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== +<<<<<<< HEAD ======= stylis "4.1.3" @@ -1812,22 +1934,28 @@ "version" "11.11.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: "@emotion/memoize" "^0.8.1" "@emotion/sheet" "^1.2.2" "@emotion/utils" "^1.2.1" "@emotion/weak-memoize" "^0.3.1" +<<<<<<< HEAD <<<<<<< HEAD "stylis" "4.2.0" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging stylis "4.2.0" "@emotion/hash@^0.9.1": version "0.9.1" resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== +<<<<<<< HEAD ======= <<<<<<< HEAD stylis "4.2.0" @@ -1841,6 +1969,8 @@ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "@emotion/is-prop-valid@^0.8.2": version "0.8.8" @@ -1849,6 +1979,7 @@ dependencies: "@emotion/memoize" "0.7.4" +<<<<<<< HEAD <<<<<<< HEAD "@emotion/is-prop-valid@^1.1.2", "@emotion/is-prop-valid@^1.2.0", "@emotion/is-prop-valid@^1.2.1": "integrity" "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==" @@ -1863,6 +1994,8 @@ "version" "0.8.1" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "@emotion/is-prop-valid@^1.1.2", "@emotion/is-prop-valid@^1.2.1": version "1.2.1" resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz" @@ -1870,6 +2003,7 @@ dependencies: "@emotion/memoize" "^0.8.1" +<<<<<<< HEAD "@emotion/memoize@^0.8.1": version "0.8.1" resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" @@ -1901,16 +2035,27 @@ >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging "@emotion/memoize@0.7.4": version "0.7.4" resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== +<<<<<<< HEAD <<<<<<< HEAD "@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.10.5", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0": ======= <<<<<<< HEAD "@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.11.1", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0": +======= +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.11.1": +>>>>>>> origin/staging version "11.11.1" resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz" integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== @@ -1936,6 +2081,7 @@ csstype "^3.0.2" "@emotion/sheet@^1.2.2": +<<<<<<< HEAD ======= "@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.10.5", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0": <<<<<<< HEAD @@ -1978,15 +2124,17 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "1.2.2" resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== -<<<<<<< HEAD -"@emotion/styled@^11.11.0", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": +"@emotion/styled@^11.11.0": version "11.11.0" resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== +<<<<<<< HEAD ======= "@emotion/styled@^11.10.5", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": version "11.10.5" @@ -2004,6 +2152,8 @@ "version" "11.10.5" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.11.0" @@ -2012,7 +2162,6 @@ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" "@emotion/utils" "^1.2.1" -<<<<<<< HEAD "@emotion/unitless@^0.8.1": version "0.8.1" resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" @@ -2024,6 +2173,7 @@ integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== "@emotion/utils@^1.2.1": +<<<<<<< HEAD ======= "@emotion/unitless@^0.8.0": version "0.8.0" @@ -2050,36 +2200,148 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "1.2.1" resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== -<<<<<<< HEAD "@emotion/weak-memoize@^0.3.1": -======= -"@emotion/weak-memoize@^0.3.0", "@emotion/weak-memoize@^0.3.1": ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 version "0.3.1" resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + +"@esbuild/android-arm@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" + integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw== + +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + +"@esbuild/linux-loong64@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" + integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== + +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + "@esbuild/linux-x64@0.17.19": version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== -<<<<<<< HEAD dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.8.0" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + version "4.8.2" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz" + integrity sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g== "@eslint/eslintrc@^2.1.2": version "2.1.2" @@ -2096,43 +2358,44 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.48.0": - version "8.48.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz" - integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== +"@eslint/js@8.50.0": + version "8.50.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz" + integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== -"@floating-ui/core@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz" - integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ== +"@floating-ui/core@^1.4.2": + version "1.5.0" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz" + integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== dependencies: - "@floating-ui/utils" "^0.1.1" + "@floating-ui/utils" "^0.1.3" -"@floating-ui/dom@^1.3.0": - version "1.5.1" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz" - integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw== +"@floating-ui/dom@^1.5.1": + version "1.5.3" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz" + integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== dependencies: - "@floating-ui/core" "^1.4.1" - "@floating-ui/utils" "^0.1.1" + "@floating-ui/core" "^1.4.2" + "@floating-ui/utils" "^0.1.3" -"@floating-ui/react-dom@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz" - integrity sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA== +"@floating-ui/react-dom@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== dependencies: - "@floating-ui/dom" "^1.3.0" + "@floating-ui/dom" "^1.5.1" -"@floating-ui/utils@^0.1.1": - version "0.1.1" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz" - integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw== +"@floating-ui/utils@^0.1.3": + version "0.1.4" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz" + integrity sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA== "@hookform/resolvers@^2.9.11": version "2.9.11" resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz" integrity sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ== +<<<<<<< HEAD "@humanwhocodes/config-array@^0.11.10": version "0.11.10" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" @@ -2254,6 +2517,12 @@ ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== >>>>>>> origin/staging dependencies: "@humanwhocodes/object-schema" "^1.2.1" @@ -2277,6 +2546,7 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD version "0.3.2" @@ -2294,6 +2564,11 @@ "version" "0.3.2" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +>>>>>>> origin/staging dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -2309,13 +2584,22 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD version "0.3.17" @@ -2333,6 +2617,11 @@ "version" "0.3.17" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +>>>>>>> origin/staging dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -2392,9 +2681,9 @@ integrity sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw== dependencies: "@motionone/types" "^10.14.0" -<<<<<<< HEAD hey-listen "^1.0.8" tslib "^2.3.1" +<<<<<<< HEAD ======= <<<<<<< HEAD hey-listen "^1.0.8" @@ -2407,6 +2696,8 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging "@mui/base@5.0.0-alpha.79": version "5.0.0-alpha.79" @@ -2422,6 +2713,7 @@ prop-types "^15.7.2" react-is "^17.0.2" +<<<<<<< HEAD <<<<<<< HEAD "@mui/base@5.0.0-beta.8": "integrity" "sha512-b4vVjMZx5KzzEMf4arXKoeV5ZegAMOoPwoy1vfUBwhvXc2QtaaAyBp50U7OA2L06Leubc1A+lEp3eqwZoFn87g==" @@ -2454,27 +2746,32 @@ version "5.0.0-beta.12" resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.12.tgz" integrity sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ== +======= +"@mui/base@5.0.0-beta.16": + version "5.0.0-beta.16" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.16.tgz" + integrity sha512-OYxhC81c9bO0wobGcM8rrY5bRwpCXAI21BL0P2wz/2vTv4ek7ALz9+U5M8wgdmtRNUhmCmAB4L2WRwFRf5Cd8Q== +>>>>>>> origin/staging dependencies: - "@babel/runtime" "^7.22.10" - "@emotion/is-prop-valid" "^1.2.1" - "@floating-ui/react-dom" "^2.0.1" + "@babel/runtime" "^7.22.15" + "@floating-ui/react-dom" "^2.0.2" "@mui/types" "^7.2.4" - "@mui/utils" "^5.14.6" + "@mui/utils" "^5.14.10" "@popperjs/core" "^2.11.8" clsx "^2.0.0" prop-types "^15.8.1" - react-is "^18.2.0" -"@mui/core-downloads-tracker@^5.14.6": - version "5.14.6" - resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.6.tgz" - integrity sha512-QZEU3pyGWLuaHbxvOlShol7U1FVgzWBR0OH9H8D7L8w4/vto5N5jJVvlqFQS3T0zbR6YGHxFaiL6Ky87jQg7aw== +"@mui/core-downloads-tracker@^5.14.10": + version "5.14.10" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.10.tgz" + integrity sha512-kPHu/NhZq1k+vSZR5wq3AyUfD4bnfWAeuKpps0+8PS7ZHQ2Lyv1cXJh+PlFdCIOa0PK98rk3JPwMzS8BMhdHwQ== "@mui/icons-material@^5.14.6": - version "5.14.6" - resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.6.tgz" - integrity sha512-7Cujy7lRGTj2T3SvY9C9ZOTFDtrXJogeNnRcU/ODyNoxwskMNPFOcc15F+98MAdJenBVLJPYu+vPP6DUvEpNrA== + version "5.14.9" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.9.tgz" + integrity sha512-xTRQbDsogsJo7tY5Og8R9zbuG2q+KIPVIM6JQoKxtJlz9DPOw1u0T2fGrvwD+XAOVifQf6epNMcGCDLfJAz4Nw== dependencies: +<<<<<<< HEAD "@babel/runtime" "^7.22.10" ======= <<<<<<< HEAD @@ -2529,6 +2826,9 @@ "@babel/runtime" "^7.22.6" >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= + "@babel/runtime" "^7.22.15" +>>>>>>> origin/staging "@mui/lab@5.0.0-alpha.80": version "5.0.0-alpha.80" @@ -2546,6 +2846,7 @@ react-transition-group "^4.4.2" rifm "^0.12.1" +<<<<<<< HEAD <<<<<<< HEAD "@mui/material@^5.0.0", "@mui/material@^5.11.5", "@mui/material@^5.2.3", "@mui/material@^5.4.1": "integrity" "sha512-TgNR4/YRL11RifsnMWNhITNCkGJYVz20SCvVJBBoU5Y/KhUNSSJxjDpEB8VrnY+sUsV0NigLCkHZJglfsiS3Pw==" @@ -2561,15 +2862,22 @@ version "5.14.6" resolved "https://registry.npmjs.org/@mui/material/-/material-5.14.6.tgz" integrity sha512-C3UgGrmtvcGkQkm0ONBU7bTdapTjQc2Se3b2354xMmU7lgSgW7VM6EP9wIH5XqqoJ60m9l/s9kbTWX0Y+EaWvA== +======= +"@mui/material@^5.14.6": + version "5.14.10" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.14.10.tgz" + integrity sha512-ejFMppnO+lzBXpzju+N4SSz0Mhmi5sihXUGcr5FxpgB6bfUP0Lpe32O0Sw/3s8xlmLEvG1fqVT0rRyAVMlCA+A== +>>>>>>> origin/staging dependencies: - "@babel/runtime" "^7.22.10" - "@mui/base" "5.0.0-beta.12" - "@mui/core-downloads-tracker" "^5.14.6" - "@mui/system" "^5.14.6" + "@babel/runtime" "^7.22.15" + "@mui/base" "5.0.0-beta.16" + "@mui/core-downloads-tracker" "^5.14.10" + "@mui/system" "^5.14.10" "@mui/types" "^7.2.4" - "@mui/utils" "^5.14.6" + "@mui/utils" "^5.14.10" "@types/react-transition-group" "^4.4.6" clsx "^2.0.0" +<<<<<<< HEAD ======= "@mui/material@^5.0.0", "@mui/material@^5.11.5", "@mui/material@^5.2.3", "@mui/material@^5.4.1": <<<<<<< HEAD @@ -2590,41 +2898,42 @@ ======= clsx "^1.2.1" >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging csstype "^3.1.2" prop-types "^15.8.1" react-is "^18.2.0" react-transition-group "^4.4.5" -<<<<<<< HEAD -"@mui/private-theming@^5.14.6": - version "5.14.6" - resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.6.tgz" - integrity sha512-3VBLFGizBXfofyk33bwRg6t9L648aKnLmOKPfY1wFuiXq3AEYwobK65iDci/tHKxm/VKbZ6A7PFjLejvB3EvRQ== +"@mui/private-theming@^5.14.10": + version "5.14.10" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.10.tgz" + integrity sha512-f67xOj3H06wWDT9xBg7hVL/HSKNF+HG1Kx0Pm23skkbEqD2Ef2Lif64e5nPdmWVv+7cISCYtSuE2aeuzrZe78w== dependencies: - "@babel/runtime" "^7.22.10" - "@mui/utils" "^5.14.6" + "@babel/runtime" "^7.22.15" + "@mui/utils" "^5.14.10" prop-types "^15.8.1" -"@mui/styled-engine@^5.14.6": - version "5.14.6" - resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.6.tgz" - integrity sha512-I6zeu/OP1Hk4NsX1Oj85TiYl1dER0JMsLJVn76J1Ihl24A5EbiZQKJp3Mn+ufA79ypkdAvM9aQCAQyiVBFcUHg== +"@mui/styled-engine@^5.14.10": + version "5.14.10" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.10.tgz" + integrity sha512-EJckxmQHrsBvDbFu1trJkvjNw/1R7jfNarnqPSnL+jEQawCkQIqVELWLrlOa611TFtxSJGkdUfCFXeJC203HVg== dependencies: - "@babel/runtime" "^7.22.10" + "@babel/runtime" "^7.22.15" "@emotion/cache" "^11.11.0" csstype "^3.1.2" prop-types "^15.8.1" -"@mui/system@^5.14.6", "@mui/system@^5.2.3", "@mui/system@^5.4.1", "@mui/system@^5.6.4": - version "5.14.6" - resolved "https://registry.npmjs.org/@mui/system/-/system-5.14.6.tgz" - integrity sha512-/n0ae1MegWjiV1BpRU8jgg4E0zBjeB2VYsT/68ag/xaDuq3/TaDKJeT9REIvyBvwlG3CI3S2O+tRELktxCD1kg== +"@mui/system@^5.14.10", "@mui/system@^5.14.6", "@mui/system@^5.6.4": + version "5.14.10" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.14.10.tgz" + integrity sha512-QQmtTG/R4gjmLiL5ECQ7kRxLKDm8aKKD7seGZfbINtRVJDyFhKChA1a+K2bfqIAaBo1EMDv+6FWNT1Q5cRKjFA== dependencies: - "@babel/runtime" "^7.22.10" - "@mui/private-theming" "^5.14.6" - "@mui/styled-engine" "^5.14.6" + "@babel/runtime" "^7.22.15" + "@mui/private-theming" "^5.14.10" + "@mui/styled-engine" "^5.14.10" "@mui/types" "^7.2.4" - "@mui/utils" "^5.14.6" + "@mui/utils" "^5.14.10" clsx "^2.0.0" csstype "^3.1.2" prop-types "^15.8.1" @@ -2634,14 +2943,13 @@ resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz" integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== -"@mui/utils@^5.10.3", "@mui/utils@^5.14.6", "@mui/utils@^5.2.3", "@mui/utils@^5.4.1", "@mui/utils@^5.6.1": - version "5.14.6" - resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.6.tgz" - integrity sha512-AznpqLu6hrFnpHgcvsSSMCG+cDbkcCYfo+daUwBVReNYv4l+NQ8+wvBAF4aUMi155N7xWbbgh0cyKs6Wdsm3aA== +"@mui/utils@^5.10.3", "@mui/utils@^5.14.10", "@mui/utils@^5.2.3", "@mui/utils@^5.4.1", "@mui/utils@^5.6.1": + version "5.14.10" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.10.tgz" + integrity sha512-Rn+vYQX7FxkcW0riDX/clNUwKuOJFH45HiULxwmpgnzQoQr3A0lb+QYwaZ+FAkZrR7qLoHKmLQlcItu6LT0y/Q== dependencies: - "@babel/runtime" "^7.22.10" + "@babel/runtime" "^7.22.15" "@types/prop-types" "^15.7.5" - "@types/react-is" "^18.2.1" prop-types "^15.8.1" react-is "^18.2.0" @@ -2649,6 +2957,7 @@ version "5.17.26" resolved "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-5.17.26.tgz" integrity sha512-eGJq9J0g9cDGLFfMmugOadZx0mJeOd/yQpHwEa5gUXyONS6qF0OhXSWyDOhDdA3l2TOoQzotMN5dY/T4Wl1KYA== +<<<<<<< HEAD ======= "@mui/private-theming@^5.13.7": @@ -2813,6 +3122,8 @@ ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: "@babel/runtime" "^7.18.9" @@ -2869,7 +3180,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2883,6 +3194,7 @@ fastq "^1.6.0" "@popperjs/core@^2.11.5", "@popperjs/core@^2.11.8": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" @@ -2893,25 +3205,23 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "2.11.8" resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -<<<<<<< HEAD -"@remix-run/router@1.8.0": - version "1.8.0" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz" - integrity sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg== -======= -"@remix-run/router@1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz" - integrity sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A== -======= - "integrity" "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" - "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" - "version" "2.11.8" +"@reduxjs/toolkit@^1.9.6": + version "1.9.6" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.6.tgz" + integrity sha512-Gc4ikl90ORF4viIdAkY06JNUnODjKfGxZRwATM30EdHq8hLSVoSrwXne5dd739yenP5bJxAX7tLuOWK5RPGtrw== + dependencies: + immer "^9.0.21" + redux "^4.2.1" + redux-thunk "^2.4.2" + reselect "^4.1.8" +<<<<<<< HEAD >>>>>>> origin/staging "@remix-run/router@1.7.2": "integrity" "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==" @@ -2922,6 +3232,12 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +"@remix-run/router@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz" + integrity sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA== +>>>>>>> origin/staging "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2970,6 +3286,7 @@ "@rollup/pluginutils@^5.0.2": <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD version "5.0.2" @@ -2987,6 +3304,11 @@ "version" "5.0.2" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + version "5.0.2" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== +>>>>>>> origin/staging dependencies: "@types/estree" "^1.0.0" estree-walker "^2.0.2" @@ -3061,6 +3383,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" +<<<<<<< HEAD "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": <<<<<<< HEAD ======= @@ -3080,6 +3403,12 @@ "version" "6.5.1" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +"@svgr/core@^6.5.1": + version "6.5.1" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== +>>>>>>> origin/staging dependencies: "@babel/core" "^7.19.6" "@svgr/babel-preset" "^6.5.1" @@ -3105,48 +3434,23 @@ "@svgr/hast-util-to-babel-ast" "^6.5.1" svg-parser "^2.0.4" -"@types/babel__core@^7.1.9": - version "7.1.18" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.14.2" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== - dependencies: - "@babel/types" "^7.3.0" +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/estree@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.2" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" "@types/json-schema@^7.0.9": version "7.0.9" @@ -3158,6 +3462,7 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +<<<<<<< HEAD <<<<<<< HEAD "@types/lodash@^4.14.175", "@types/lodash@^4.14.191": "integrity" "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==" @@ -3182,8 +3487,14 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +"@types/lodash@^4.14.175", "@types/lodash@^4.14.197": + version "4.14.199" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz" + integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== +>>>>>>> origin/staging -"@types/node@*", "@types/node@>= 14": +"@types/node@*": version "17.0.21" resolved "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz" integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== @@ -3210,14 +3521,18 @@ dependencies: parchment "^1.1.2" +<<<<<<< HEAD <<<<<<< HEAD "@types/react-dom@^17.0.18": ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging "@types/react-dom@^17.0.20": version "17.0.20" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz" integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA== +<<<<<<< HEAD ======= "@types/react-dom@^17.0.18": <<<<<<< HEAD @@ -3270,11 +3585,21 @@ resolved "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.2.tgz" integrity sha512-4NLJsMJVrMv18FuMIkUUBVj/PH9A+BvLKrZC75EWiEFn1IsMrZHgL1tVKw5QBfoa0Qjz6SkWIzEvwcyZ8PgnIg== >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + dependencies: + "@types/react" "^17" + +"@types/react-lazy-load-image-component@^1.5.3": + version "1.6.0" + resolved "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz" + integrity sha512-KIwp3KA2o6vtX1nN80tOCnr9Knx1a+QATUw/+fv2hBnAWuC9TWtWXtgJK8tsiFnK5o1u70veqI+3z6Rt3YhhKA== +>>>>>>> origin/staging dependencies: "@types/react" "*" csstype "^3.0.2" "@types/react-transition-group@^4.4.5", "@types/react-transition-group@^4.4.6": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==" "resolved" "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz" @@ -3288,16 +3613,19 @@ "version" "17.0.62" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging version "4.4.6" resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz" integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^17.0.65": +"@types/react@*", "@types/react@^17", "@types/react@^17.0.65": version "17.0.65" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz" integrity sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ== +<<<<<<< HEAD ======= <<<<<<< HEAD version "4.4.6" @@ -3322,6 +3650,8 @@ "version" "17.0.63" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: "@types/prop-types" "*" @@ -3341,17 +3671,21 @@ integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/semver@^7.3.12": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" "resolved" "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" "version" "7.5.0" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging version "7.5.0" resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== "@types/stylis@^4.2.0": +<<<<<<< HEAD version "4.2.0" resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz" integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== @@ -3372,12 +3706,18 @@ resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.0.2.tgz" integrity sha512-wtckGuk1eXUlUz0Qb1eXHG37Z7HWT2GfMdqRf8F/ifddTwadSS9Jwsqi4qtXk7cP7MtoyGVIHPElFCLc6HItbg== >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + version "4.2.1" + resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.1.tgz" + integrity sha512-OSaMrXUKxVigGlKRrET39V2xdhzlztQ9Aqumn1WbCBKHOi9ry7jKSd7rkyj0GzmWaU960Rd+LpOFpLfx5bMQAg== +>>>>>>> origin/staging "@types/trusted-types@^2.0.2": version "2.0.2" resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== +<<<<<<< HEAD <<<<<<< HEAD "@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.48.2", "@typescript-eslint/eslint-plugin@^5.5.0": "integrity" "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==" @@ -3401,6 +3741,17 @@ "version" "5.62.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + +"@typescript-eslint/eslint-plugin@^5.5.0", "@typescript-eslint/eslint-plugin@^5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== >>>>>>> origin/staging dependencies: "@eslint-community/regexpp" "^4.4.0" @@ -3408,11 +3759,14 @@ "@typescript-eslint/type-utils" "5.62.0" "@typescript-eslint/utils" "5.62.0" <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.0" @@ -3420,6 +3774,7 @@ semver "^7.3.7" tsutils "^3.21.0" <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -3431,6 +3786,8 @@ "tsutils" "^3.21.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "@typescript-eslint/experimental-utils@^5.0.0": version "5.12.1" @@ -3439,6 +3796,7 @@ dependencies: "@typescript-eslint/utils" "5.12.1" +<<<<<<< HEAD <<<<<<< HEAD "@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.48.2", "@typescript-eslint/parser@^5.5.0": "integrity" "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==" @@ -3462,12 +3820,19 @@ "version" "5.62.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= +"@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== >>>>>>> origin/staging dependencies: "@typescript-eslint/scope-manager" "5.62.0" "@typescript-eslint/types" "5.62.0" "@typescript-eslint/typescript-estree" "5.62.0" <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD debug "^4.3.4" @@ -3479,6 +3844,9 @@ "debug" "^4.3.4" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + debug "^4.3.4" +>>>>>>> origin/staging "@typescript-eslint/scope-manager@5.12.1": version "5.12.1" @@ -3489,6 +3857,7 @@ "@typescript-eslint/visitor-keys" "5.12.1" "@typescript-eslint/scope-manager@5.62.0": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==" "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" @@ -3509,12 +3878,18 @@ "version" "5.62.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== >>>>>>> origin/staging dependencies: "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" "@typescript-eslint/type-utils@5.62.0": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==" "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" @@ -3527,6 +3902,8 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== @@ -3536,6 +3913,7 @@ debug "^4.3.4" tsutils "^3.21.0" <<<<<<< HEAD +<<<<<<< HEAD ======= ======= "integrity" "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==" @@ -3549,6 +3927,8 @@ "tsutils" "^3.21.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "@typescript-eslint/types@5.12.1": version "5.12.1" @@ -3556,6 +3936,7 @@ integrity sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA== "@typescript-eslint/types@5.62.0": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==" "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" @@ -3577,6 +3958,11 @@ >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +>>>>>>> origin/staging "@typescript-eslint/typescript-estree@5.12.1": version "5.12.1" @@ -3592,6 +3978,7 @@ tsutils "^3.21.0" "@typescript-eslint/typescript-estree@5.62.0": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==" "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" @@ -3604,6 +3991,8 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== @@ -3616,6 +4005,7 @@ semver "^7.3.7" tsutils "^3.21.0" <<<<<<< HEAD +<<<<<<< HEAD ======= ======= "integrity" "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==" @@ -3632,8 +4022,10 @@ "tsutils" "^3.21.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging -"@typescript-eslint/utils@^5.10.2", "@typescript-eslint/utils@5.12.1": +"@typescript-eslint/utils@5.12.1", "@typescript-eslint/utils@^5.10.2": version "5.12.1" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.12.1.tgz" integrity sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ== @@ -3646,6 +4038,7 @@ eslint-utils "^3.0.0" "@typescript-eslint/utils@5.62.0": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==" "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" @@ -3666,6 +4059,11 @@ "version" "5.62.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== >>>>>>> origin/staging dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -3675,6 +4073,7 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/typescript-estree" "5.62.0" <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD eslint-scope "^5.1.1" @@ -3689,6 +4088,10 @@ "semver" "^7.3.7" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= + eslint-scope "^5.1.1" + semver "^7.3.7" +>>>>>>> origin/staging "@typescript-eslint/visitor-keys@5.12.1": version "5.12.1" @@ -3699,6 +4102,7 @@ eslint-visitor-keys "^3.0.0" "@typescript-eslint/visitor-keys@5.62.0": +<<<<<<< HEAD <<<<<<< HEAD "integrity" "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==" "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" @@ -3710,6 +4114,8 @@ ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== @@ -3717,6 +4123,7 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" <<<<<<< HEAD +<<<<<<< HEAD ======= ======= "integrity" "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==" @@ -3728,6 +4135,8 @@ "eslint-visitor-keys" "^3.3.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "@vitejs/plugin-react@^1.3.2": version "1.3.2" @@ -3743,7 +4152,6 @@ react-refresh "^0.13.0" resolve "^1.22.0" -<<<<<<< HEAD "@yr/monotone-cubic-spline@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz" @@ -3762,7 +4170,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.5.0, acorn@^8.9.0: +acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -3771,6 +4179,7 @@ ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +<<<<<<< HEAD ======= acorn-jsx@^5.3.2: version "5.3.2" @@ -3800,12 +4209,15 @@ ajv@^6.10.0: "version" "6.12.6" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" +<<<<<<< HEAD <<<<<<< HEAD "ajv@^6.12.4": "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" @@ -3824,6 +4236,9 @@ ajv@^6.10.0: ======= <<<<<<< HEAD ajv@^8.6.0, ajv@>=8: +======= +ajv@^8.6.0: +>>>>>>> origin/staging version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -3853,9 +4268,13 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +<<<<<<< HEAD <<<<<<< HEAD ======= apexcharts@^3.41.0, apexcharts@^3.42.0: +======= +apexcharts@^3.42.0: +>>>>>>> origin/staging version "3.42.0" resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-3.42.0.tgz" integrity sha512-hYhzZqh2Efny9uiutkGU2M/EarJ4Nn8s6dxZ0C7E7N+SV4d1xjTioXi2NLn4UKVJabZkb3HnpXDoumXgtAymwg== @@ -3873,6 +4292,7 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +<<<<<<< HEAD ======= <<<<<<< HEAD ajv@^6.12.4: @@ -3946,6 +4366,8 @@ argparse@^2.0.1: integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging aria-query@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" @@ -3954,9 +4376,12 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" @@ -3982,6 +4407,7 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.findlastindex@^1.2.2: +<<<<<<< HEAD version "1.2.2" resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz" integrity sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw== @@ -4006,13 +4432,19 @@ array-includes@^3.1.3, array-includes@^3.1.4, array-includes@^3.1.6: "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" "version" "3.1.6" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 +======= + version "1.2.3" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== +>>>>>>> origin/staging dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" +<<<<<<< HEAD array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -4035,6 +4467,8 @@ array-union@^2.1.0: "version" "1.3.1" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" @@ -4049,6 +4483,7 @@ array.prototype.flatmap@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +<<<<<<< HEAD ======= "array.prototype.findlastindex@^1.2.2": "integrity" "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==" @@ -4183,6 +4618,8 @@ array.prototype.flatmap@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +======= +>>>>>>> origin/staging dependencies: call-bind "^1.0.2" define-properties "^1.1.4" @@ -4200,14 +4637,15 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -4217,10 +4655,10 @@ ast-types-flow@^0.0.7: resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -async@0.9.x: - version "0.9.2" - resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" - integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynciterator.prototype@^1.0.0: version "1.0.0" @@ -4262,48 +4700,6 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -======= - get-intrinsic "^1.1.3" - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - -async@0.9.x: - version "0.9.2" - resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" - integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -attr-accept@^2.2.2: - version "2.2.2" - resolved "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== - -axe-core@^4.3.5: - version "4.4.1" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz" - integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== - -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" @@ -4389,6 +4785,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" @@ -4396,6 +4799,7 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" +<<<<<<< HEAD <<<<<<< HEAD "browserslist@^4.19.1", "browserslist@^4.21.9", "browserslist@>= 4.21.0": "integrity" "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==" @@ -4412,12 +4816,22 @@ browserslist@^4.19.1, browserslist@^4.21.9, "browserslist@>= 4.21.0": version "4.21.10" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +======= +browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +>>>>>>> origin/staging dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" +<<<<<<< HEAD update-browserslist-db "^1.0.11" >>>>>>> origin/staging +======= + update-browserslist-db "^1.0.13" +>>>>>>> origin/staging buffer-from@^1.0.0: version "1.1.2" @@ -4460,6 +4874,7 @@ can-use-dom@^0.1.0: resolved "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz" integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= +<<<<<<< HEAD <<<<<<< HEAD "caniuse-lite@^1.0.30001503": "integrity" "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==" @@ -4471,6 +4886,12 @@ caniuse-lite@^1.0.30001517: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz" integrity sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA== >>>>>>> origin/staging +======= +caniuse-lite@^1.0.30001541: + version "1.0.30001554" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz" + integrity sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ== +>>>>>>> origin/staging capital-case@^1.0.4: version "1.0.4" @@ -4485,109 +4906,12 @@ chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== -======= -<<<<<<< HEAD -browserslist@^4.19.1, browserslist@^4.21.9, "browserslist@>= 4.21.0": - version "4.21.9" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" -======= -"browserslist@^4.19.1", "browserslist@^4.21.9", "browserslist@>= 4.21.0": - "integrity" "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" - "version" "4.21.10" - dependencies: - "caniuse-lite" "^1.0.30001517" - "electron-to-chromium" "^1.4.477" - "node-releases" "^2.0.13" - "update-browserslist-db" "^1.0.11" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtin-modules@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -can-use-dom@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz" - integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= - -<<<<<<< HEAD -caniuse-lite@^1.0.30001503: - version "1.0.30001517" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz" - integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== -======= -"caniuse-lite@^1.0.30001517": - "integrity" "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz" - "version" "1.0.30001519" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -<<<<<<< HEAD -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== -======= -"chalk@^2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.0.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4627,7 +4951,6 @@ clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -<<<<<<< HEAD clsx@^2.0.0: version "2.0.0" @@ -4638,25 +4961,6 @@ color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== -======= - -<<<<<<< HEAD -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== -======= -"clsx@^2.0.0": - "integrity" "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" - "resolved" "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" - "version" "2.0.0" - -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 dependencies: color-name "1.1.3" @@ -4667,16 +4971,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -4713,20 +5017,22 @@ constant-case@^3.0.4: tslib "^2.0.3" upper-case "^2.0.2" -convert-source-map@^1.5.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.21.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz" - integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== + version "3.33.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz" + integrity sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ== dependencies: - browserslist "^4.19.1" - semver "7.0.0" + browserslist "^4.22.1" core-js-pure@^3.20.2: version "3.21.1" @@ -4738,18 +5044,7 @@ core-js@^3.0.1: resolved "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz" integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^7.0.1: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== @@ -4779,6 +5074,7 @@ cssjanus@^2.0.1: resolved "https://registry.npmjs.org/cssjanus/-/cssjanus-2.1.0.tgz" integrity sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD @@ -4803,34 +5099,36 @@ csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.1, csstype@^3.1.2: >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +>>>>>>> origin/staging damerau-levenshtein@^1.0.7: version "1.0.8" resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD date-fns@^2.0.0, date-fns@^2.25.0, date-fns@^2.30.0: +======= +date-fns@^2.30.0: +>>>>>>> origin/staging version "2.30.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== dependencies: "@babel/runtime" "^7.21.0" -======= -<<<<<<< HEAD -date-fns@^2.0.0, date-fns@^2.25.0, date-fns@^2.29.3: - version "2.29.3" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== -<<<<<<< HEAD dependencies: ms "^2.1.1" @@ -4863,11 +5161,21 @@ deepmerge@^4.2.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -4897,6 +5205,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +<<<<<<< HEAD ======= dependencies: ms "^2.1.1" @@ -4989,6 +5298,8 @@ doctrine@^3.0.0: esutils "^2.0.2" >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" @@ -5006,12 +5317,13 @@ dot-case@^3.0.4: tslib "^2.0.3" ejs@^3.1.6: - version "3.1.6" - resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz" - integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + version "3.1.9" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: - jake "^10.6.1" + jake "^10.8.5" +<<<<<<< HEAD <<<<<<< HEAD "electron-to-chromium@^1.4.431": "integrity" "sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA==" @@ -5037,6 +5349,12 @@ electron-to-chromium@^1.4.431: >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +electron-to-chromium@^1.4.535: + version "1.4.568" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.568.tgz" + integrity sha512-3TCOv8+BY6Ltpt1/CmGBMups2IdKOyfEmz4J8yIS4xLSeMm0Rf+psSaxLuswG9qMKt+XbNbmADybtXGpTFlbDg== +>>>>>>> origin/staging emoji-regex@^9.2.2: version "9.2.2" @@ -5055,6 +5373,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +<<<<<<< HEAD <<<<<<< HEAD "es-abstract@^1.19.0", "es-abstract@^1.20.4": "integrity" "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==" @@ -5066,15 +5385,21 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.22 version "1.22.1" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz" integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +>>>>>>> origin/staging +======= +es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== >>>>>>> origin/staging dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" + function.prototype.name "^1.1.6" get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" @@ -5085,56 +5410,37 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.22 has-symbols "^1.0.3" internal-slot "^1.0.5" is-array-buffer "^3.0.2" -======= -<<<<<<< HEAD -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" -<<<<<<< HEAD - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" typed-array-buffer "^1.0.0" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.11" es-iterator-helpers@^1.0.12: - version "1.0.14" - resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz" - integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== + version "1.0.15" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== dependencies: asynciterator.prototype "^1.0.0" call-bind "^1.0.2" - define-properties "^1.2.0" + define-properties "^1.2.1" es-abstract "^1.22.1" es-set-tostringtag "^2.0.1" function-bind "^1.1.1" @@ -5144,8 +5450,8 @@ es-iterator-helpers@^1.0.12: has-proto "^1.0.1" has-symbols "^1.0.3" internal-slot "^1.0.5" - iterator.prototype "^1.1.0" - safe-array-concat "^1.0.0" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" es-set-tostringtag@^2.0.1: version "2.0.1" @@ -5172,11 +5478,106 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild-android-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5" + integrity sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA== + +esbuild-android-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz#9cc0ec60581d6ad267568f29cf4895ffdd9f2f04" + integrity sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ== + +esbuild-darwin-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz#428e1730ea819d500808f220fbc5207aea6d4410" + integrity sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg== + +esbuild-darwin-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz#b6dfc7799115a2917f35970bfbc93ae50256b337" + integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA== + +esbuild-freebsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz#4e190d9c2d1e67164619ae30a438be87d5eedaf2" + integrity sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA== + +esbuild-freebsd-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz#18a4c0344ee23bd5a6d06d18c76e2fd6d3f91635" + integrity sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA== + +esbuild-linux-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz#9a329731ee079b12262b793fb84eea762e82e0ce" + integrity sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg== + esbuild-linux-64@0.15.18: version "0.15.18" - resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz#532738075397b994467b514e524aeb520c191b6c" integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw== +esbuild-linux-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz#5372e7993ac2da8f06b2ba313710d722b7a86e5d" + integrity sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug== + +esbuild-linux-arm@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz#e734aaf259a2e3d109d4886c9e81ec0f2fd9a9cc" + integrity sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA== + +esbuild-linux-mips64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz#c0487c14a9371a84eb08fab0e1d7b045a77105eb" + integrity sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ== + +esbuild-linux-ppc64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz#af048ad94eed0ce32f6d5a873f7abe9115012507" + integrity sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w== + +esbuild-linux-riscv64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz#423ed4e5927bd77f842bd566972178f424d455e6" + integrity sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg== + +esbuild-linux-s390x@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz#21d21eaa962a183bfb76312e5a01cc5ae48ce8eb" + integrity sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ== + +esbuild-netbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz#ae75682f60d08560b1fe9482bfe0173e5110b998" + integrity sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg== + +esbuild-openbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz#79591a90aa3b03e4863f93beec0d2bab2853d0a8" + integrity sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ== + +esbuild-sunos-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz#fd528aa5da5374b7e1e93d36ef9b07c3dfed2971" + integrity sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw== + +esbuild-windows-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz#0e92b66ecdf5435a76813c4bc5ccda0696f4efc3" + integrity sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ== + +esbuild-windows-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz#0fc761d785414284fc408e7914226d33f82420d0" + integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw== + +esbuild-windows-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz#5b5bdc56d341d0922ee94965c89ee120a6a86eb7" + integrity sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ== + esbuild@^0.15.9: version "0.15.18" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz" @@ -5209,6 +5610,7 @@ esbuild@^0.17.19: version "0.17.19" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== +<<<<<<< HEAD ======= is-weakref "^1.0.2" object-inspect "^1.12.2" @@ -5439,6 +5841,8 @@ esbuild@^0.17.18: version "0.17.19" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== +======= +>>>>>>> origin/staging optionalDependencies: "@esbuild/android-arm" "0.17.19" "@esbuild/android-arm64" "0.17.19" @@ -5473,7 +5877,6 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" @@ -5505,6 +5908,7 @@ eslint-config-airbnb@19.0.4: object.assign "^4.1.2" object.entries "^1.1.5" +<<<<<<< HEAD <<<<<<< HEAD "eslint-config-prettier@^8.6.0": "integrity" "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==" @@ -5512,10 +5916,13 @@ eslint-config-airbnb@19.0.4: "version" "8.8.0" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging eslint-config-prettier@^8.10.0: version "8.10.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== +<<<<<<< HEAD ======= <<<<<<< HEAD eslint-config-prettier@^8.6.0: @@ -5530,6 +5937,8 @@ eslint-config-prettier@^8.6.0: >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging eslint-config-react-app@7.0.0: version "7.0.0" @@ -5551,6 +5960,7 @@ eslint-config-react-app@7.0.0: eslint-plugin-react-hooks "^4.3.0" eslint-plugin-testing-library "^5.0.1" +<<<<<<< HEAD <<<<<<< HEAD "eslint-import-resolver-node@^0.3.7": "integrity" "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==" @@ -5572,6 +5982,8 @@ eslint-import-resolver-node@^0.3.7: resolve "^1.22.4" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging eslint-import-resolver-node@^0.3.7: version "0.3.7" resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" @@ -5580,6 +5992,7 @@ eslint-import-resolver-node@^0.3.7: debug "^3.2.7" is-core-module "^2.11.0" resolve "^1.22.1" +<<<<<<< HEAD ======= "eslint-import-resolver-node@^0.3.7": "integrity" "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==" @@ -5592,6 +6005,8 @@ eslint-import-resolver-node@^0.3.7: >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging eslint-import-resolver-typescript@^2.7.1: version "2.7.1" @@ -5604,16 +6019,20 @@ eslint-import-resolver-typescript@^2.7.1: resolve "^1.22.0" tsconfig-paths "^3.14.1" +<<<<<<< HEAD <<<<<<< HEAD "eslint-module-utils@^2.7.4": ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" +<<<<<<< HEAD ======= <<<<<<< HEAD eslint-module-utils@^2.7.4: @@ -5635,6 +6054,8 @@ eslint-module-utils@^2.7.4: >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging eslint-plugin-flowtype@^8.0.3: version "8.0.3" @@ -5644,6 +6065,7 @@ eslint-plugin-flowtype@^8.0.3: lodash "^4.17.21" string-natural-compare "^3.0.1" +<<<<<<< HEAD <<<<<<< HEAD "eslint-plugin-import@*", "eslint-plugin-import@^2.25.2", "eslint-plugin-import@^2.25.3", "eslint-plugin-import@^2.27.5": "integrity" "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==" @@ -5654,27 +6076,20 @@ eslint-plugin-flowtype@^8.0.3: ======= <<<<<<< HEAD eslint-plugin-import@*, eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.28.1: +======= +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.28.1: +>>>>>>> origin/staging version "2.28.1" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz" integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== dependencies: array-includes "^3.1.6" array.prototype.findlastindex "^1.2.2" -======= -<<<<<<< HEAD -eslint-plugin-import@*, eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: - version "2.27.5" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 array.prototype.flat "^1.3.1" array.prototype.flatmap "^1.3.1" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.7" -<<<<<<< HEAD eslint-module-utils "^2.8.0" has "^1.0.3" is-core-module "^2.13.0" @@ -5685,6 +6100,7 @@ eslint-plugin-import@*, eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25 object.values "^1.1.6" semver "^6.3.1" tsconfig-paths "^3.14.2" +<<<<<<< HEAD ======= eslint-module-utils "^2.7.4" has "^1.0.3" @@ -5734,6 +6150,8 @@ eslint-plugin-import@*, eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25 >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging eslint-plugin-jest@^25.3.0: version "25.7.0" @@ -5742,7 +6160,7 @@ eslint-plugin-jest@^25.3.0: dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" -eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@6.5.1: +eslint-plugin-jsx-a11y@6.5.1, eslint-plugin-jsx-a11y@^6.5.1: version "6.5.1" resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz" integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== @@ -5767,11 +6185,12 @@ eslint-plugin-prettier@^4.2.1: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@4.3.0: +eslint-plugin-react-hooks@4.3.0, eslint-plugin-react-hooks@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz" integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== +<<<<<<< HEAD <<<<<<< HEAD "eslint-plugin-react@^7.27.1", "eslint-plugin-react@^7.28.0", "eslint-plugin-react@^7.32.1": "integrity" "sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==" @@ -5781,25 +6200,18 @@ eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@4.3.0: ======= <<<<<<< HEAD eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.33.2: +======= +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.33.2: +>>>>>>> origin/staging version "7.33.2" resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz" integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== -======= -<<<<<<< HEAD -eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.32.1: - version "7.33.0" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz" - integrity sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw== ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" -<<<<<<< HEAD es-iterator-helpers "^1.0.12" -======= ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -5812,6 +6224,7 @@ eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0, eslint-plugin-react@^7 semver "^6.3.1" string.prototype.matchall "^4.0.8" <<<<<<< HEAD +<<<<<<< HEAD ======= ======= "eslint-plugin-react@^7.27.1", "eslint-plugin-react@^7.28.0", "eslint-plugin-react@^7.32.1": @@ -5840,6 +6253,8 @@ eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0, eslint-plugin-react@^7 >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +>>>>>>> origin/staging eslint-plugin-testing-library@^5.0.1: version "5.0.5" @@ -5848,7 +6263,7 @@ eslint-plugin-testing-library@^5.0.1: dependencies: "@typescript-eslint/utils" "^5.10.2" -eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5856,6 +6271,7 @@ eslint-scope@^5.1.1, eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +<<<<<<< HEAD <<<<<<< HEAD "eslint-scope@^7.2.0": "integrity" "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==" @@ -5863,10 +6279,13 @@ eslint-scope@^5.1.1, eslint-scope@5.1.1: "version" "7.2.1" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +<<<<<<< HEAD ======= <<<<<<< HEAD eslint-scope@^7.2.0: @@ -5880,6 +6299,8 @@ eslint-scope@^7.2.0: "version" "7.2.2" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: esrecurse "^4.3.0" @@ -5902,6 +6323,7 @@ eslint-visitor-keys@^3.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +<<<<<<< HEAD <<<<<<< HEAD "eslint-visitor-keys@^3.3.0": "integrity" "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" @@ -5924,75 +6346,45 @@ eslint-visitor-keys@^3.0.0: "@eslint/js" "8.44.0" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging eslint-visitor-keys@^3.3.0: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^3.4.1: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.32.0 || ^8.2.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.48.0, eslint@>=5, eslint@>=7.0.0, eslint@>=7.28.0: - version "8.48.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz" - integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== +eslint@^8.48.0: + version "8.50.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz" + integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" +<<<<<<< HEAD "@eslint/js" "8.48.0" >>>>>>> origin/staging "@humanwhocodes/config-array" "^0.11.10" +======= + "@eslint/js" "8.50.0" + "@humanwhocodes/config-array" "^0.11.11" +>>>>>>> origin/staging "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.12.4" -======= -<<<<<<< HEAD -eslint-visitor-keys@^3.3.0: - version "3.4.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.32.0 || ^8.2.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.32.0, eslint@>=5, eslint@>=7.0.0, eslint@>=7.28.0: - version "8.45.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz" - integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.1.0" - "@eslint/js" "8.44.0" - "@humanwhocodes/config-array" "^0.11.10" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" -<<<<<<< HEAD eslint-scope "^7.2.2" eslint-visitor-keys "^3.4.3" espree "^9.6.1" -======= - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -6014,7 +6406,6 @@ eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 optionator "^0.9.3" strip-ansi "^6.0.1" text-table "^0.2.0" -<<<<<<< HEAD espree@^9.6.0, espree@^9.6.1: version "9.6.1" @@ -6029,6 +6420,7 @@ esquery@^1.4.2: version "1.5.0" resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== +<<<<<<< HEAD ======= espree@^9.6.0: @@ -6130,6 +6522,8 @@ esquery@^1.4.2: ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: estraverse "^5.1.0" @@ -6156,12 +6550,7 @@ estree-walker@^1.0.1: resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -estree-walker@^2.0.2: +estree-walker@^2.0.1, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== @@ -6186,16 +6575,16 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - fast-diff@1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz" integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" @@ -6212,23 +6601,10 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -<<<<<<< HEAD -======= -<<<<<<< HEAD ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -<<<<<<< HEAD -======= -======= -"fast-levenshtein@^2.0.6": - "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 fastq@^1.6.0: version "1.13.0" @@ -6251,12 +6627,12 @@ file-selector@^0.6.0: dependencies: tslib "^2.4.0" -filelist@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz" - integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: - minimatch "^3.0.4" + minimatch "^5.0.1" fill-range@^7.0.1: version "7.0.1" @@ -6270,12 +6646,15 @@ find-root@^1.1.0: resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -6289,6 +6668,7 @@ flat-cache@^3.0.4: resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -6298,6 +6678,8 @@ flat-cache@^3.0.4: "version" "5.0.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: flatted "^3.1.0" rimraf "^3.0.2" @@ -6312,7 +6694,6 @@ follow-redirects@^1.14.9: resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== -<<<<<<< HEAD for-each@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" @@ -6320,11 +6701,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== -======= form-data@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" @@ -6334,51 +6710,10 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -<<<<<<< HEAD framer-motion@^6.5.1: version "6.5.1" resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== -======= -"flatted@^3.1.0": - "integrity" "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" - "version" "3.2.5" - -"follow-redirects@^1.14.9": - "integrity" "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz" - "version" "1.14.9" - -"for-each@^0.3.3": - "integrity" "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==" - "resolved" "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - "version" "0.3.3" - dependencies: - "is-callable" "^1.1.3" - -"form-data@^4.0.0": - "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - "version" "4.0.0" ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -<<<<<<< HEAD -framer-motion@^6.5.1: - version "6.5.1" - resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" - integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== -======= -"framer-motion@^6.5.1": - "integrity" "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==" - "resolved" "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" - "version" "6.5.1" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 dependencies: "@motionone/dom" "10.12.0" framesync "6.0.1" @@ -6411,46 +6746,36 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -<<<<<<< HEAD -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -======= -<<<<<<< HEAD -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -======= -"functions-have-names@^1.2.2", "functions-have-names@^1.2.3": - "integrity" "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - "resolved" "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - "version" "1.2.3" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -<<<<<<< HEAD get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" @@ -6460,28 +6785,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has "^1.0.3" has-proto "^1.0.1" has-symbols "^1.0.3" -======= -<<<<<<< HEAD -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" -======= -"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1", "get-intrinsic@^1.1.3", "get-intrinsic@^1.2.0", "get-intrinsic@^1.2.1": - "integrity" "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==" - "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "function-bind" "^1.1.1" - "has" "^1.0.3" - "has-proto" "^1.0.1" - "has-symbols" "^1.0.3" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -6527,6 +6830,7 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +<<<<<<< HEAD <<<<<<< HEAD "globals@^13.19.0": "integrity" "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==" @@ -6538,6 +6842,12 @@ globals@^13.19.0: version "13.21.0" resolved "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz" integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== +>>>>>>> origin/staging +======= +globals@^13.19.0: + version "13.22.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz" + integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== >>>>>>> origin/staging dependencies: type-fest "^0.20.2" @@ -6647,6 +6957,7 @@ highlight.js@^11.8.0: resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz" integrity sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg== +<<<<<<< HEAD ======= <<<<<<< HEAD globals@^13.19.0: @@ -6810,6 +7121,8 @@ highlight.js@^11.7.0: >>>>>>> origin/staging >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging history@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz" @@ -6817,7 +7130,7 @@ history@^5.3.0: dependencies: "@babel/runtime" "^7.7.6" -hoist-non-react-statics@^3.3.1: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -6834,17 +7147,26 @@ ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +immer@^9.0.21: + version "9.0.21" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +>>>>>>> origin/staging import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -6854,6 +7176,8 @@ import-fresh@^3.2.1: "version" "3.3.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -6876,7 +7200,6 @@ inherits@2: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -<<<<<<< HEAD internal-slot@^1.0.3, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" @@ -6885,27 +7208,6 @@ internal-slot@^1.0.3, internal-slot@^1.0.5: get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" -======= -<<<<<<< HEAD -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" -======= -"internal-slot@^1.0.3", "internal-slot@^1.0.5": - "integrity" "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==" - "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "get-intrinsic" "^1.2.0" - "has" "^1.0.3" - "side-channel" "^1.0.4" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 invariant@^2.2.4: version "2.2.4" @@ -6918,7 +7220,6 @@ is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== -<<<<<<< HEAD dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" @@ -6964,7 +7265,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.9.0: version "2.13.0" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== @@ -7085,7 +7386,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -7122,68 +7423,18 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -iterator.prototype@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz" - integrity sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: - define-properties "^1.1.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - has-tostringtag "^1.0.0" - reflect.getprototypeof "^1.0.3" - -jake@^10.6.1: - version "10.8.2" - resolved "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" - integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== - dependencies: - async "0.9.x" - chalk "^2.4.2" - filelist "^1.0.1" - minimatch "^3.0.4" - -======= - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" <<<<<<< HEAD -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -======= -"is-array-buffer@^3.0.1", "is-array-buffer@^3.0.2": - "integrity" "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==" - "resolved" "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "call-bind" "^1.0.2" - "get-intrinsic" "^1.2.0" - "is-typed-array" "^1.1.10" - -"is-arrayish@^0.2.1": - "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - <<<<<<< HEAD is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" @@ -7212,148 +7463,18 @@ is-core-module@^2.11.0, is-core-module@^2.9.0: "version" "2.13.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> origin/staging - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.0.4, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -<<<<<<< HEAD -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== ======= -"is-typed-array@^1.1.10", "is-typed-array@^1.1.9": - "integrity" "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==" - "resolved" "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" - "version" "1.1.12" +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== +>>>>>>> origin/staging dependencies: - "which-typed-array" "^1.1.11" + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" -"is-weakref@^1.0.2": - "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==" - "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - "version" "1.0.2" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - dependencies: - call-bind "^1.0.2" - -<<<<<<< HEAD -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -======= -"isarray@^2.0.5": - "integrity" "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - "version" "2.0.5" - -"isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - -jake@^10.6.1: - version "10.8.2" - resolved "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" - integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== - dependencies: - async "0.9.x" - chalk "^2.4.2" - filelist "^1.0.1" - minimatch "^3.0.4" - ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" @@ -7363,12 +7484,15 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -7379,6 +7503,7 @@ js-yaml@^4.1.0: resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -7393,6 +7518,8 @@ js-yaml@^4.1.0: "version" "4.1.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: argparse "^2.0.1" @@ -7431,7 +7558,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -<<<<<<< HEAD json5@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" @@ -7454,6 +7580,7 @@ json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +<<<<<<< HEAD ======= <<<<<<< HEAD json5@^1.0.1: @@ -7482,6 +7609,8 @@ json5@^2.2.0, json5@^2.2.2: "version" "2.2.3" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging jsonfile@^6.0.1: version "6.1.0" @@ -7542,12 +7671,15 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -7585,7 +7717,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@4.17.21: +lodash@4.17.21, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7595,6 +7727,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -7604,6 +7737,8 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: "version" "6.0.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: js-tokens "^3.0.0 || ^4.0.0" @@ -7662,12 +7797,12 @@ lru-cache@^5.1.1: integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" -<<<<<<< HEAD lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== +<<<<<<< HEAD ======= <<<<<<< HEAD @@ -7696,6 +7831,8 @@ lru-cache@^6.0.0: "version" "6.0.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: yallist "^4.0.0" @@ -7743,41 +7880,38 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -<<<<<<< HEAD +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -======= -<<<<<<< HEAD -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -======= -"minimist@^1.2.0", "minimist@^1.2.6": - "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - "version" "1.2.8" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 -ms@^2.1.1, ms@2.1.2: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging nanoclone@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== +<<<<<<< HEAD nanoid@^3.3.4: version "3.3.4" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" @@ -7792,6 +7926,12 @@ nanoid@^3.3.4: "version" "0.2.1" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +>>>>>>> origin/staging natural-compare-lite@^1.4.0: version "1.4.0" @@ -7811,6 +7951,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +<<<<<<< HEAD <<<<<<< HEAD "node-releases@^2.0.12": "integrity" "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" @@ -7819,11 +7960,9 @@ no-case@^3.0.4: ======= <<<<<<< HEAD -node-releases@^2.0.13: ======= -<<<<<<< HEAD -node-releases@^2.0.12: ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +>>>>>>> origin/staging +node-releases@^2.0.13: version "2.0.13" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== @@ -7833,6 +7972,7 @@ notistack@3.0.0-alpha.11: resolved "https://registry.npmjs.org/notistack/-/notistack-3.0.0-alpha.11.tgz" integrity sha512-QfiVC1On1Zfs1UADxgRRhcVhAWveD3lBUKhDwx0GdXoSKii0UARz0tfJyIwwOxy5Lr+DOeAHz8Mvl1GwpeVnQQ== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= "node-releases@^2.0.13": @@ -7847,6 +7987,8 @@ notistack@3.0.0-alpha.11: "version" "3.0.0-alpha.11" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: clsx "^1.1.0" goober "^2.0.33" @@ -7871,30 +8013,15 @@ object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -<<<<<<< HEAD object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -======= -<<<<<<< HEAD -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -======= -"object-inspect@^1.12.3", "object-inspect@^1.9.0": - "integrity" "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - "version" "1.12.3" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 object-is@^1.0.1: version "1.1.5" resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== -<<<<<<< HEAD dependencies: call-bind "^1.0.2" define-properties "^1.1.3" @@ -7933,13 +8060,13 @@ object.fromentries@^2.0.6: es-abstract "^1.20.4" object.groupby@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz" - integrity sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw== + version "1.0.1" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.21.2" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" object.hasown@^1.1.2: @@ -8009,6 +8136,7 @@ parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== +<<<<<<< HEAD ======= dependencies: call-bind "^1.0.2" @@ -8245,6 +8373,8 @@ parent-module@^1.0.0: "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" "version" "5.0.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 +======= +>>>>>>> origin/staging dependencies: <<<<<<< HEAD "p-limit" "^3.0.2" @@ -8252,11 +8382,11 @@ parent-module@^1.0.0: ======= callsites "^3.0.0" -<<<<<<< HEAD parse-json@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== +<<<<<<< HEAD ======= >>>>>>> origin/staging "param-case@^3.0.4": @@ -8291,6 +8421,8 @@ parse-json@^5.0.0: "version" "5.2.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" @@ -8313,12 +8445,15 @@ path-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging path-exists@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" @@ -8329,6 +8464,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -8338,6 +8474,8 @@ path-is-absolute@^1.0.0: "version" "4.0.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging path-key@^3.1.0: version "3.1.1" @@ -8349,17 +8487,21 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -8369,6 +8511,8 @@ path-type@^4.0.0: "version" "1.0.7" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging picocolors@^1.0.0: version "1.0.0" @@ -8380,33 +8524,15 @@ picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -<<<<<<< HEAD -======= -<<<<<<< HEAD ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +pnpm@^8.6.12: + version "8.7.6" + resolved "https://registry.npmjs.org/pnpm/-/pnpm-8.7.6.tgz" + integrity sha512-ZJ/LpDy+IGYpCPYo2INfnw2MopUOTHQ3HcnhbiSqVLtV5rTmsrbFHe4i35ITLpcgvIWptWbzUTZ8efDYXWpFew== + popmotion@11.0.3: version "11.0.3" resolved "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== -<<<<<<< HEAD -======= -======= -"picomatch@^2.2.2", "picomatch@^2.2.3", "picomatch@^2.3.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" - -"pnpm@^8.6.12": - "integrity" "sha512-Eza4C5SO/Xl5IYozupbZ5NOA5leBRPYxmXmXfe7G4/4uCkRLhks84rB33aitxNZU/uMrnDGGjwrLktoKvPjqHA==" - "resolved" "https://registry.npmjs.org/pnpm/-/pnpm-8.6.12.tgz" - "version" "8.6.12" - -"popmotion@11.0.3": - "integrity" "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==" - "resolved" "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" - "version" "11.0.3" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 dependencies: framesync "6.0.1" hey-listen "^1.0.8" @@ -8414,11 +8540,11 @@ popmotion@11.0.3: tslib "^2.1.0" postcss@^8.4.18: - version "8.4.18" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz" - integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== + version "8.4.31" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -8434,6 +8560,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD @@ -8458,6 +8585,12 @@ prettier@^2.8.3, prettier@>=2.0.0: >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +prettier@^2.8.8: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +>>>>>>> origin/staging pretty-bytes@^5.3.0: version "5.6.0" @@ -8469,11 +8602,7 @@ pretty-bytes@^6.0.0: resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz" integrity sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg== -<<<<<<< HEAD prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: -======= -prop-types@^15.5.7, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -8525,7 +8654,6 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -<<<<<<< HEAD react-apexcharts@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.1.tgz" @@ -8533,6 +8661,7 @@ react-apexcharts@^1.4.1: dependencies: prop-types "^15.8.1" +<<<<<<< HEAD "react-dom@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react-dom@^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", "react-dom@^16 || ^17", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^17.0.2, "react-dom@^17.0.2 || ^18.0.0", react-dom@>=16.6.0, react-dom@>=16.8, "react-dom@>=16.8 || ^17.0.0 || ^18.0.0", react-dom@>=16.8.0: ======= react-apexcharts@^1.4.0: @@ -8546,6 +8675,9 @@ react-apexcharts@^1.4.0: ======= "react-dom@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react-dom@^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", "react-dom@^16 || ^17", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^17.0.2, "react-dom@^17.0.2 || ^18.0.0", react-dom@>=16.6.0, react-dom@>=16.8, "react-dom@>=16.8 || ^17.0.0 || ^18.0.0": >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +react-dom@^17.0.2: +>>>>>>> origin/staging version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -8554,15 +8686,12 @@ react-apexcharts@^1.4.0: object-assign "^4.1.1" scheduler "^0.20.2" -<<<<<<< HEAD -======= -<<<<<<< HEAD ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 react-dropzone@^14.2.3: version "14.2.3" resolved "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz" integrity sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -8572,6 +8701,8 @@ react-dropzone@^14.2.3: "version" "14.2.3" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: attr-accept "^2.2.2" file-selector "^0.6.0" @@ -8593,6 +8724,7 @@ react-helmet-async@^1.3.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +<<<<<<< HEAD <<<<<<< HEAD "react-hook-form@^7.0.0", "react-hook-form@^7.42.1": "integrity" "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==" @@ -8618,18 +8750,19 @@ react-hook-form@^7.0.0, react-hook-form@^7.42.1: >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 >>>>>>> origin/staging +======= +react-hook-form@^7.45.4: + version "7.46.2" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.46.2.tgz" + integrity sha512-x1DWmHQchV7x2Rq9l99M/cQHC8JGchAnw9Z0uTz5KrPa0bTl/Inm1NR7ceOARfIrkNuQNAhuSuZPYa6k7QYn3Q== +>>>>>>> origin/staging react-intersection-observer@^8.34.0: version "8.34.0" resolved "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz" integrity sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw== -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -8639,18 +8772,22 @@ react-is@^17.0.2: resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.2.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging react-lazy-load-image-component@^1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz" integrity sha512-8KFkDTgjh+0+PVbH+cx0AgxLGbdTsxWMnxXzU5HEUztqewk9ufQAu8cstjZhyvtMIPsdMcPZfA0WAa7HtjQbBQ== +<<<<<<< HEAD ======= <<<<<<< HEAD react-lazy-load-image-component@^1.5.6: @@ -8665,6 +8802,8 @@ react-lazy-load-image-component@^1.5.6: "version" "1.5.6" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: lodash.debounce "^4.0.8" lodash.throttle "^4.1.1" @@ -8678,11 +8817,24 @@ react-quill@2.0.0-beta.4: lodash "^4.17.4" quill "^1.3.7" +react-redux@^8.1.2: + version "8.1.2" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.1.2.tgz" + integrity sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" + react-refresh@^0.13.0: version "0.13.0" resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz" integrity sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg== +<<<<<<< HEAD <<<<<<< HEAD "react-router-dom@^6.7.0": "integrity" "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==" @@ -8700,54 +8852,28 @@ react-refresh@^0.13.0: "@remix-run/router" "1.7.2" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging react-router-dom@^6.15.0: - version "6.15.0" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz" - integrity sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ== + version "6.16.0" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz" + integrity sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg== dependencies: - "@remix-run/router" "1.8.0" - react-router "6.15.0" + "@remix-run/router" "1.9.0" + react-router "6.16.0" -react-router@^6.15.0, react-router@6.15.0: - version "6.15.0" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz" - integrity sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg== +react-router@6.16.0, react-router@^6.15.0: + version "6.16.0" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz" + integrity sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA== dependencies: +<<<<<<< HEAD "@remix-run/router" "1.8.0" >>>>>>> origin/staging - ======= -<<<<<<< HEAD -react-router-dom@^6.7.0: - version "6.14.2" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz" - integrity sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg== - dependencies: - "@remix-run/router" "1.7.2" - react-router "6.14.2" + "@remix-run/router" "1.9.0" +>>>>>>> origin/staging -react-router@^6.7.0, react-router@6.14.2: - version "6.14.2" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz" - integrity sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ== -======= -"react-router-dom@^6.7.0": - "integrity" "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==" - "resolved" "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz" - "version" "6.14.2" - dependencies: - "@remix-run/router" "1.7.2" - "react-router" "6.14.2" - -"react-router@^6.7.0", "react-router@6.14.2": - "integrity" "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==" - "resolved" "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz" - "version" "6.14.2" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - dependencies: - "@remix-run/router" "1.7.2" - ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 react-transition-group@^4.4.2, react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" @@ -8758,7 +8884,7 @@ react-transition-group@^4.4.2, react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -"react@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0", "react@^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", "react@^16 || ^17", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0", react@^17.0.2, "react@^17.0.2 || ^18.0.0", "react@>= 16.8 || 18.0.0", react@>=0.13, react@>=16, react@>=16.6.0, react@>=16.8, "react@>=16.8 || ^17.0.0 || ^18.0.0", react@>=16.8.0, react@17.0.2: +react@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -8766,16 +8892,27 @@ react-transition-group@^4.4.2, react-transition-group@^4.4.5: loose-envify "^1.1.0" object-assign "^4.1.1" -<<<<<<< HEAD -reflect.getprototypeof@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz" - integrity sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw== +redux-thunk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" + integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== + +redux@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== + dependencies: + "@babel/runtime" "^7.9.2" + +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.1" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" globalthis "^1.0.3" which-builtin-type "^1.1.3" @@ -8798,9 +8935,9 @@ regenerate@^1.4.2: integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.10" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-runtime@^0.14.0: version "0.14.0" @@ -8814,19 +8951,20 @@ regenerator-transform@^0.14.2: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpu-core@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz" integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== +<<<<<<< HEAD ======= regenerate-unicode-properties@^10.0.1: version "10.0.1" @@ -8905,6 +9043,8 @@ regexpu-core@^5.0.1: "version" "5.0.1" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.0.1" @@ -8930,41 +9070,34 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -reselect@^4.1.6: - version "4.1.7" - resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" - integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== +reselect@^4.1.6, reselect@^4.1.8: + version "4.1.8" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== -<<<<<<< HEAD dependencies: is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.22.4: - version "1.22.4" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" @@ -8991,6 +9124,7 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -9071,6 +9205,8 @@ rimraf@^3.0.2: >>>>>>> origin/staging >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging rollup-plugin-terser@^7.0.0: version "7.0.2" resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" @@ -9081,7 +9217,7 @@ rollup-plugin-terser@^7.0.0: serialize-javascript "^4.0.0" terser "^5.0.0" -"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^1.20.0||^2.0.0||^3.0.0, rollup@^2.0.0, rollup@^2.43.1, rollup@^2.75.7, rollup@^2.79.1: +rollup@^2.43.1, rollup@^2.75.7, rollup@^2.79.1: version "2.79.1" resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== @@ -9094,19 +9230,18 @@ run-parallel@^1.1.9: integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -<<<<<<< HEAD -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -9128,35 +9263,18 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^6.3.1: +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7: +semver@^7.3.5, semver@^7.3.7: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -semver@7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - sentence-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz" @@ -9173,6 +9291,15 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" @@ -9207,6 +9334,7 @@ simplebar-react@^2.4.3: prop-types "^15.6.1" simplebar "^5.3.9" +<<<<<<< HEAD ======= <<<<<<< HEAD @@ -9368,11 +9496,14 @@ simplebar-react@^2.4.3: ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging simplebar@^5.3.9: version "5.3.9" resolved "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz" integrity sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag== <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> origin/staging @@ -9382,6 +9513,8 @@ simplebar@^5.3.9: "version" "5.3.9" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging dependencies: "@juggle/resize-observer" "^3.3.1" can-use-dom "^0.1.0" @@ -9433,11 +9566,6 @@ source-map@^0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" @@ -9448,17 +9576,19 @@ string-natural-compare@^3.0.1: resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= <<<<<<< HEAD >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== -<<<<<<< HEAD dependencies: call-bind "^1.0.2" define-properties "^1.1.4" @@ -9469,6 +9599,7 @@ string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" +<<<<<<< HEAD string.prototype.trim@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" @@ -9481,74 +9612,34 @@ string.prototype.trim@^1.2.7: "resolved" "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" "version" "4.0.8" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - -<<<<<<< HEAD -string.prototype.trimend@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== ======= -"string.prototype.trim@^1.2.7": - "integrity" "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==" - "resolved" "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" - "version" "1.2.7" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - -"string.prototype.trimend@^1.0.6": - "integrity" "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==" - "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" - "version" "1.0.6" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +>>>>>>> origin/staging dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -<<<<<<< HEAD -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== -======= -<<<<<<< HEAD -string.prototype.trimstart@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== -======= -"string.prototype.trimstart@^1.0.6": - "integrity" "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==" - "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" - "version" "1.0.6" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -<<<<<<< HEAD -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" stringify-object@^3.3.0: version "3.3.0" @@ -9598,16 +9689,16 @@ stylis-plugin-rtl@^2.1.1: dependencies: cssjanus "^2.0.1" -stylis@^4.3.0, stylis@4.x: - version "4.3.0" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz" - integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== - stylis@4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== +stylis@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz" + integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -9615,6 +9706,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +<<<<<<< HEAD supports-color@^7.0.0: ======= stringify-object@^3.3.0: @@ -9725,6 +9817,9 @@ supports-color@^7.1.0: <<<<<<< HEAD supports-color@^7.1.0: +======= +supports-color@^7.0.0, supports-color@^7.1.0: +>>>>>>> origin/staging version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -9762,7 +9857,7 @@ svg.filter.js@^2.0.2: dependencies: svg.js "^2.2.5" -svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5, svg.js@>=2.3.x: +svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: version "2.7.1" resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== @@ -9811,14 +9906,14 @@ tempy@^0.6.0: type-fest "^0.16.0" unique-string "^2.0.0" -terser@^5.0.0, terser@^5.4.0: - version "5.11.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz" - integrity sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A== +terser@^5.0.0: + version "5.22.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz" + integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== dependencies: - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" - source-map "~0.7.2" source-map-support "~0.5.20" text-table@^0.2.0: @@ -9859,148 +9954,6 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.14.2: json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" -======= -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svg.draggable.js@^2.2.2: - version "2.2.2" - resolved "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz" - integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== - dependencies: - svg.js "^2.0.1" - -svg.easing.js@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz" - integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== - dependencies: - svg.js ">=2.3.x" - -svg.filter.js@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz" - integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== - dependencies: - svg.js "^2.2.5" - -svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5, svg.js@>=2.3.x: - version "2.7.1" - resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" - integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== - -svg.pathmorphing.js@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz" - integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== - dependencies: - svg.js "^2.4.0" - -svg.resize.js@^1.4.3: - version "1.4.3" - resolved "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz" - integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== - dependencies: - svg.js "^2.6.5" - svg.select.js "^2.1.2" - -svg.select.js@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz" - integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== - dependencies: - svg.js "^2.2.5" - -svg.select.js@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz" - integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== - dependencies: - svg.js "^2.6.5" - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -tempy@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" - integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== - dependencies: - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - -terser@^5.0.0, terser@^5.4.0: - version "5.11.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz" - integrity sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A== - dependencies: - acorn "^8.5.0" - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" - integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== - dependencies: - punycode "^2.1.0" - -<<<<<<< HEAD -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" -======= -"tsconfig-paths@^3.14.1", "tsconfig-paths@^3.14.2": - "integrity" "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==" - "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" - "version" "3.14.2" - dependencies: - "@types/json5" "^0.0.29" - "json5" "^1.0.2" - "minimist" "^1.2.6" - "strip-bom" "^3.0.0" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 tslib@^1.8.1: version "1.14.1" @@ -10036,6 +9989,7 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +<<<<<<< HEAD <<<<<<< HEAD "typescript@^4.9.4", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": "integrity" "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" @@ -10043,6 +9997,8 @@ type-fest@^0.20.2: "version" "4.9.5" ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" @@ -10083,7 +10039,7 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@^4.9.5, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": +typescript@^4.9.5: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -10138,10 +10094,10 @@ upath@^1.2.0: resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -10167,6 +10123,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +<<<<<<< HEAD vite-plugin-pwa@^0.12.8: version "0.12.8" resolved "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz" @@ -10309,51 +10266,18 @@ universalify@^2.0.0: integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== upath@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -<<<<<<< HEAD -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== ======= -"update-browserslist-db@^1.0.11": - "integrity" "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==" - "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - "version" "1.0.11" ->>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" +use-sync-external-store@^1.0.0: +>>>>>>> origin/staging + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -<<<<<<< HEAD vite-plugin-pwa@^0.12.8: version "0.12.8" resolved "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz" integrity sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA== +<<<<<<< HEAD ======= >>>>>>> origin/staging "vite-plugin-pwa@^0.12.8": @@ -10361,6 +10285,8 @@ vite-plugin-pwa@^0.12.8: "resolved" "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz" "version" "0.12.8" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 +======= +>>>>>>> origin/staging dependencies: debug "^4.3.4" fast-glob "^3.2.11" @@ -10369,13 +10295,17 @@ vite-plugin-pwa@^0.12.8: workbox-build "^6.5.3" workbox-window "^6.5.3" +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD +======= +>>>>>>> origin/staging vite-plugin-svgr@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz" integrity sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA== +<<<<<<< HEAD ======= >>>>>>> origin/staging "vite-plugin-svgr@^2.4.0": @@ -10385,11 +10315,14 @@ vite-plugin-svgr@^2.4.0: <<<<<<< HEAD ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 +>>>>>>> origin/staging +======= >>>>>>> origin/staging dependencies: "@rollup/pluginutils" "^5.0.2" "@svgr/core" "^6.5.1" +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD @@ -10406,9 +10339,14 @@ vite-plugin-svgr@^2.4.0: <<<<<<< HEAD ======= >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 +>>>>>>> origin/staging +======= +vite@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz" + integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g== >>>>>>> origin/staging dependencies: ->>>>>>> a54708abb5d46d7d7319730306a528d33d910895 esbuild "^0.15.9" postcss "^8.4.18" resolve "^1.22.1" @@ -10440,7 +10378,6 @@ which-boxed-primitive@^1.0.2: is-number-object "^1.0.4" is-string "^1.0.5" is-symbol "^1.0.3" -<<<<<<< HEAD which-builtin-type@^1.1.3: version "1.1.3" @@ -10470,7 +10407,7 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: +which-typed-array@^1.1.11, which-typed-array@^1.1.9: version "1.1.11" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -10503,6 +10440,7 @@ workbox-broadcast-update@6.5.4: dependencies: workbox-core "6.5.4" +<<<<<<< HEAD ======= <<<<<<< HEAD @@ -10558,6 +10496,8 @@ workbox-broadcast-update@6.5.4: workbox-core "6.5.4" >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging workbox-build@^6.5.3: version "6.5.4" resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz" @@ -10693,7 +10633,7 @@ workbox-sw@6.5.4: resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz" integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== -workbox-window@^6.5.3, workbox-window@6.5.4: +workbox-window@6.5.4, workbox-window@^6.5.3: version "6.5.4" resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz" integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== @@ -10705,12 +10645,12 @@ wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -<<<<<<< HEAD yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +<<<<<<< HEAD ======= <<<<<<< HEAD @@ -10735,6 +10675,8 @@ yallist@^3.0.2: "version" "4.0.0" >>>>>>> db4b0193ddbe1f089d965244e6b552070e47d903 >>>>>>> a54708abb5d46d7d7319730306a528d33d910895 +======= +>>>>>>> origin/staging yallist@^4.0.0: version "4.0.0" @@ -10746,6 +10688,11 @@ yaml@^1.10.0: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yarn@^1.22.19: + version "1.22.19" + resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.19.tgz" + integrity sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" diff --git a/frontend/hospital-portal/package.json b/frontend/hospital-portal/package.json index a20f100e..1c90c6b0 100644 --- a/frontend/hospital-portal/package.json +++ b/frontend/hospital-portal/package.json @@ -74,6 +74,7 @@ "react-hook-form": "^7.43.0", "react-intersection-observer": "^8.34.0", "react-lazy-load-image-component": "^1.5.6", + "react-number-format": "^5.3.1", "react-quill": "2.0.0-beta.4", "react-router": "^6.8.0", "react-router-dom": "^6.8.0", diff --git a/frontend/hospital-portal/pnpm-lock.yaml b/frontend/hospital-portal/pnpm-lock.yaml index 7507b630..7fb2a7cf 100644 --- a/frontend/hospital-portal/pnpm-lock.yaml +++ b/frontend/hospital-portal/pnpm-lock.yaml @@ -1681,6 +1681,7 @@ packages: /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true dev: false optional: true diff --git a/frontend/hospital-portal/public/image/en-US.json b/frontend/hospital-portal/public/image/en-US.json deleted file mode 100644 index baef7538..00000000 --- a/frontend/hospital-portal/public/image/en-US.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "greeting": "Hello", - "buttonText": "Click Me", - "infoLogin": "Enter the registered account", - "txtLogin1" : "Sign in to Hospital Portal", - "txtLogin2" : "Enter your details below", - "txtCardSearchMember1" : "Guarantee Submission", - "txtCardSearchMember2" : "Find Member", - "txtCardSearchMember3" : "Date Birth", - "txtCardSearchMember4" : "Member ID", - "txtCardSearchMember5" : "Member", - "txtDialogMember1" : "Benefit Summary", - "txtDialogMember2" : "Request LOG", - "txtDialogMember3" : "Member Detail" -} diff --git a/frontend/hospital-portal/public/image/ic_booking.svg b/frontend/hospital-portal/public/image/ic_booking.svg new file mode 100644 index 00000000..d24d76a1 --- /dev/null +++ b/frontend/hospital-portal/public/image/ic_booking.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/hospital-portal/public/image/ic_dashboard.svg b/frontend/hospital-portal/public/image/ic_dashboard.svg new file mode 100644 index 00000000..92028f09 --- /dev/null +++ b/frontend/hospital-portal/public/image/ic_dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/hospital-portal/public/image/id-ID.json b/frontend/hospital-portal/public/image/id-ID.json deleted file mode 100644 index 41db3e54..00000000 --- a/frontend/hospital-portal/public/image/id-ID.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "greeting": "Halo", - "buttonText": "Klik Saya", - "infoLogin": "Masukan akun yang telah terdaftar", - "txtLogin1" : "Masuk ke Hospital Portal", - "txtLogin2" : "Masukkan detail Anda di bawah ini", - "txtCardSearchMember1" : "Pengajuan Jaminan", - "txtCardSearchMember2" : "Cari Anggota", - "txtCardSearchMember3" : "Tanggal Lahir", - "txtCardSearchMember4" : "Member ID", - "txtCardSearchMember5" : "Member", - "txtDialogMember1" : "Ringkasan Manfaat", - "txtDialogMember2" : "Request LOG", - "txtDialogMember3" : "Detail Member" -} diff --git a/frontend/hospital-portal/public/lang/en-US.json b/frontend/hospital-portal/public/lang/en-US.json index baef7538..c8060371 100644 --- a/frontend/hospital-portal/public/lang/en-US.json +++ b/frontend/hospital-portal/public/lang/en-US.json @@ -4,12 +4,35 @@ "infoLogin": "Enter the registered account", "txtLogin1" : "Sign in to Hospital Portal", "txtLogin2" : "Enter your details below", - "txtCardSearchMember1" : "Guarantee Submission", - "txtCardSearchMember2" : "Find Member", - "txtCardSearchMember3" : "Date Birth", + "txtCardSearchMember1" : "Membership Query", + "txtCardSearchMember2" : "Search Member", + "txtCardSearchMember3" : "Date of Birth", "txtCardSearchMember4" : "Member ID", "txtCardSearchMember5" : "Member", - "txtDialogMember1" : "Benefit Summary", + "txtDialogMember1" : "Services", "txtDialogMember2" : "Request LOG", - "txtDialogMember3" : "Member Detail" + "txtDialogMember3" : "Detail", + "txtDialogMember4" : "Please select services", + "txtDialogMember5" : "Submission Date", + "txtDateBirth" : "Date of Birth", + "txtGender" : "Gender", + "txtMaritalStatus" : "Marital Status", + "txtLanguage" : "Language", + "txtRelationship" : "Relationship", + "txtRequestDate" : "Request Date", + "txtMemberID" : "Member ID", + "txtClaimCode" : "Claim Code", + "txtRequestCode" : "Request Code", + "txtName" : "Name", + "txtStatus" : "Status", + "txtSearch" : "Search Name or Member ID...", + "txtAll" : "All", + "txtSubmissionDate" : "Submission Date", + "txtDataNotFound" : "Data Not Found", + "txtConditionDocument" : "Condition Document", + "txtDiagnosisDokument" : "Diagnosis Dokument", + "txtSupportingResultDocument" : "Supporting Result Document", + "txtAddResult" : "Add Result", + "txtServiceType" : "Service Type", + "txtAdditionalDocuments" : "Additional Documents" } diff --git a/frontend/hospital-portal/public/lang/id-ID.json b/frontend/hospital-portal/public/lang/id-ID.json index 41db3e54..5ca6e767 100644 --- a/frontend/hospital-portal/public/lang/id-ID.json +++ b/frontend/hospital-portal/public/lang/id-ID.json @@ -9,7 +9,30 @@ "txtCardSearchMember3" : "Tanggal Lahir", "txtCardSearchMember4" : "Member ID", "txtCardSearchMember5" : "Member", - "txtDialogMember1" : "Ringkasan Manfaat", + "txtDialogMember1" : "Layanan", "txtDialogMember2" : "Request LOG", - "txtDialogMember3" : "Detail Member" + "txtDialogMember3" : "Detail", + "txtDialogMember4" : "Mohon pilih layanan", + "txtDialogMember5" : "Tanggal Pengajuan", + "txtDateBirth" : "Tanggal Lahir", + "txtGender" : "Jenis Kelamin", + "txtMaritalStatus" : "Status Perkawinan", + "txtLanguage" : "Bahasa", + "txtRelationship" : "Hubungan", + "txtRequestDate" : "Tanggal Permintaan", + "txtMemberID" : "ID Anggota", + "txtClaimCode" : "Kode Klaim", + "txtRequestCode" : "Kode Pengajuan", + "txtName" : "Nama", + "txtStatus" : "Status", + "txtSearch" : "Cari Nama atau ID Anggota...", + "txtAll" : "Semua", + "txtSubmissionDate" : "Tanggal Pengajuan", + "txtDataNotFound" : "Data Tidak Ditemukan", + "txtConditionDocument" : "Dokumen Kondisi", + "txtDiagnosisDokument" : "Dokumen Diagnosa", + "txtSupportingResultDocument" : "Dokumen Hasil Pendukung", + "txtAddResult" : "Tambah Hasil", + "txtServiceType" : "Tipe Layanan", + "txtAdditionalDocuments" : "Dokumen Tambahan" } diff --git a/frontend/hospital-portal/src/LocalizationUtil.ts b/frontend/hospital-portal/src/LocalizationUtil.ts index 0ab70238..ebec0899 100644 --- a/frontend/hospital-portal/src/LocalizationUtil.ts +++ b/frontend/hospital-portal/src/LocalizationUtil.ts @@ -1,5 +1,5 @@ const getLocalizedData = async (locale) => { - const response = await fetch(`../public/image/${locale}.json`); // Mengambil file lokal berdasarkan bahasa yang dipilih + const response = await fetch(`/lang/${locale}.json`); // Mengambil file lokal berdasarkan bahasa yang dipilih const data = await response.json(); return data; }; diff --git a/frontend/hospital-portal/src/components/Label.tsx b/frontend/hospital-portal/src/components/Label.tsx new file mode 100644 index 00000000..c633ec4f --- /dev/null +++ b/frontend/hospital-portal/src/components/Label.tsx @@ -0,0 +1,98 @@ +// @mui +import { alpha, Theme, useTheme, styled } from '@mui/material/styles'; +import { BoxProps } from '@mui/material'; +// theme +import { ColorSchema } from '../theme/palette'; + +// ---------------------------------------------------------------------- + +type LabelColor = 'default' | 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'; + +type LabelVariant = 'filled' | 'outlined' | 'ghost'; + +const RootStyle = styled('span')( + ({ + theme, + ownerState, + }: { + theme: Theme; + ownerState: { + color: LabelColor; + variant: LabelVariant; + }; + }) => { + const isLight = theme.palette.mode === 'light'; + const { color, variant } = ownerState; + + const styleFilled = (color: ColorSchema) => ({ + color: theme.palette[color].contrastText, + backgroundColor: theme.palette[color].main, + }); + + const styleOutlined = (color: ColorSchema) => ({ + color: theme.palette[color].main, + backgroundColor: 'transparent', + border: `1px solid ${theme.palette[color].main}`, + }); + + const styleGhost = (color: ColorSchema) => ({ + color: theme.palette[color][isLight ? 'dark' : 'light'], + backgroundColor: alpha(theme.palette[color].main, 0.16), + }); + + return { + height: 22, + minWidth: 22, + lineHeight: 0, + borderRadius: 6, + // cursor: 'default', + alignItems: 'center', + whiteSpace: 'nowrap', + display: 'inline-flex', + justifyContent: 'center', + padding: theme.spacing(0, 1), + color: theme.palette.grey[800], + fontSize: theme.typography.pxToRem(12), + fontFamily: theme.typography.fontFamily, + backgroundColor: theme.palette.grey[300], + fontWeight: theme.typography.fontWeightBold, + + ...(color !== 'default' + ? { + ...(variant === 'filled' && { ...styleFilled(color) }), + ...(variant === 'outlined' && { ...styleOutlined(color) }), + ...(variant === 'ghost' && { ...styleGhost(color) }), + } + : { + ...(variant === 'outlined' && { + backgroundColor: 'transparent', + color: theme.palette.text.primary, + border: `1px solid ${theme.palette.grey[500_32]}`, + }), + ...(variant === 'ghost' && { + color: isLight ? theme.palette.text.secondary : theme.palette.common.white, + backgroundColor: theme.palette.grey[500_16], + }), + }), + }; + } +); + +// ---------------------------------------------------------------------- + +interface Props extends BoxProps { + color?: LabelColor; + variant?: LabelVariant; +} + +export default function Label({ color = 'default', variant = 'ghost', children, sx }: Props) { + const theme = useTheme(); + + return ( + + {children} + + ); +} + + diff --git a/frontend/hospital-portal/src/components/Logo.tsx b/frontend/hospital-portal/src/components/Logo.tsx index 03637b80..de8e5831 100644 --- a/frontend/hospital-portal/src/components/Logo.tsx +++ b/frontend/hospital-portal/src/components/Logo.tsx @@ -17,7 +17,7 @@ export default function Logo({ disabledLink = false, sx }: Props) { const logo = ( - LinkSehat + LinkSehat ); diff --git a/frontend/hospital-portal/src/components/Table.tsx b/frontend/hospital-portal/src/components/Table.tsx new file mode 100644 index 00000000..a60bc862 --- /dev/null +++ b/frontend/hospital-portal/src/components/Table.tsx @@ -0,0 +1,389 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { styled } from '@mui/material/styles'; +import { + Paper, + Table as TableContent, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, + Button, + TableSortLabel, + Box, + Card, + Grid, + FormControl, + InputLabel, + Select, + MenuItem, + SelectChangeEvent, + Stack, + Typography, + LinearProgress, + linearProgressClasses, +} from '@mui/material'; +import { visuallyHidden } from '@mui/utils'; +/* ---------------------------------- axios --------------------------------- */ +import axios from '../utils/axios'; +/* ---------------------------------- react --------------------------------- */ +import { Fragment, useContext, useEffect, useState } from 'react'; +import { useSearchParams } from 'react-router-dom'; +/* -------------------------------- component ------------------------------- */ +import BaseTablePagination from './BaseTablePagination'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../theme/palette'; +/* ---------------------------------- utils --------------------------------- */ +import { UserCurrentCorporateContext } from '../contexts/UserCurrentCorporate'; +import { fSplit } from '../utils/formatNumber'; +import { Download, Search as SearchIcon, Upload } from '@mui/icons-material'; +/* ---------------------------------- types --------------------------------- */ +import { DivisionDataProps, Order, PaginationTableProps, TableListProps } from '../@types/table'; +import { InputAdornment } from '@mui/material'; +import GetAppIcon from '@mui/icons-material/GetApp'; +import { LanguageContext } from '@/contexts/LanguageContext'; + +/* --------------------------------- styled --------------------------------- */ +const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ + height: 10, + borderRadius: 6, + [`&.${linearProgressClasses.colorPrimary}`]: { + backgroundColor: '#D1F1F1', + }, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 6, + backgroundColor: theme.palette.primary.main, + }, +})); +/* -------------------------------------------------------------------------- */ + +export default function Table({ + headCells, + rows, + paginations, + orders, + loadings, + params, + filters, + filterStatus, + filterStartDate, + filterEndDate, + searchs, + exportReport, +}: TableListProps) { + /* ------------------------------- handle sort ------------------------------ */ + const handleRequestSort = async (event: React.MouseEvent, property: string) => { + const isAsc = orders?.orderBy === property && orders?.order === 'asc'; + + orders?.setOrder(isAsc ? 'desc' : 'asc'); + orders?.setOrderBy(property); + const parameters = Object.fromEntries([ + ...params.searchParams.entries(), + ['order', isAsc ? 'desc' : 'asc'], + ['orderBy', property], + ]); + params.setAppliedParams(parameters); + }; + + const { localeData }: any = useContext(LanguageContext); + /* -------------------------------------------------------------------------- */ + + /* -------------------------- enchanced table head -------------------------- */ + const EnhancedTableHead = () => { + const createSortHandler = (property: string) => (event: React.MouseEvent) => { + handleRequestSort(event, property); + }; + + return ( + + + {headCells && + headCells.map((headCell, index) => ( + + {headCell.isSort ? ( + + {headCell.label} + {orders?.orderBy === headCell.id ? ( + + {orders.order === 'desc' ? 'sorted descending' : 'sorted ascending'} + + ) : null} + + ) : ( + headCell.label + )} + + ))} + + + ); + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------ button change pagination ------------------------ */ + const onPageChangeHandle = async ( + event: React.MouseEvent | null, + newPage: number + ) => { + const parameters = Object.fromEntries([ + ...params.searchParams.entries(), + ['page', newPage + 1], + ['per_page', paginations.rowsPerPage] + ]); + paginations.setPage(newPage); + await new Promise((resolve) => setTimeout(resolve, 500)); + params.setAppliedParams(parameters); + }; + /* -------------------------------------------------------------------------- */ + + /* --------------------------- row page per limit --------------------------- */ + const onRowsPerPageChangeHandle = async (event: React.ChangeEvent) => { + params.searchParams.delete('page'); + const parameters = Object.fromEntries([ + ...params.searchParams.entries(), + ['per_page', parseInt(event.target.value, 10)], + ]); + + paginations.setPage(0); + paginations.setRowsPerPage(parseInt(event.target.value, 10)); + await new Promise((resolve) => setTimeout(resolve, 500)); + params.setAppliedParams(parameters); + }; + /* -------------------------------------------------------------------------- */ + + return ( + // + + {/* Field 1 */} + + + {filters && filters.useFilter ? ( + + + + Division + + + + +
+ searchs.setSearchText(event.target.value)} + value={searchs.searchText} + fullWidth + /> + +
+
+ ) : null } + + {searchs && searchs.useSearchs ? ( + + {filterStatus && filterStatus.useFilter ? ( + +
+ searchs.setSearchText(event.target.value)} + value={searchs.searchText} + fullWidth + InputProps={{ + startAdornment: ( + + + + ), + }} + placeholder={localeData.txtSearch} + /> + +
+ ) : + +
+ searchs.setSearchText(event.target.value)} + value={searchs.searchText} + fullWidth + InputProps={{ + startAdornment: ( + + + + ), + }} + placeholder={localeData.txtSearch} + /> + +
+ } + +
+ ) : null } + + {/* Start date */} + {filterStartDate && filterStartDate.useFilter ? ( + +
filterStartDate.handleStartDateChange(event)}> + + +
+ ) : null } + + {/* End Date */} + + {filterEndDate && filterEndDate.useFilter ? ( + +
filterEndDate.handleEndDateChange(event)}> + + +
+ ) : null } + + {/* Filter status */} + {filterStatus && filterStatus.useFilter ? ( + + + Status + + + + ) : null } + + {/* Export Report */} + + {exportReport && exportReport.useExport ? ( + + + + + + ) : null } + +
+
+ {/* End Field 1 */} + {/* Field 2 */} + + {/* Table */} + + + {/* Table Header */} + + {/* End Table Header */} + {/* Table Body */} + + {loadings.isLoading ? ( + + + Loading . . . + + + ) : rows && rows.length >= 1 ? ( + rows.map((row, rowIndex) => ( + + {headCells && + //@ts-ignore + headCells.map((head, headIndex) => ( + //@ts-ignore + + {row[head.id]} + + ))} + + )) + ) : ( + + + {localeData.txtDataNotFound} + + + )} + + {/* End Table Body */} + + + {/* End Table */} + + {/* Pagination */} + + {/* End Pagination */} + + {/* End Field 2 */} +
+ //
+ ); +} diff --git a/frontend/hospital-portal/src/components/ThemeColorPresets.tsx b/frontend/hospital-portal/src/components/ThemeColorPresets.tsx index 4f267027..c4145f07 100644 --- a/frontend/hospital-portal/src/components/ThemeColorPresets.tsx +++ b/frontend/hospital-portal/src/components/ThemeColorPresets.tsx @@ -21,7 +21,7 @@ export default function ThemeColorPresets({ children }: Props) { ...defaultTheme, palette: { ...defaultTheme.palette, - primary: setColor, + // primary: setColor, }, customShadows: { ...defaultTheme.customShadows, diff --git a/frontend/hospital-portal/src/components/dialogs/DialogDetailClaim.tsx b/frontend/hospital-portal/src/components/dialogs/DialogDetailClaim.tsx index 8abc61b7..fed3e5dc 100644 --- a/frontend/hospital-portal/src/components/dialogs/DialogDetailClaim.tsx +++ b/frontend/hospital-portal/src/components/dialogs/DialogDetailClaim.tsx @@ -10,6 +10,7 @@ import { Divider, Stack, CircularProgress, + ButtonBase, } from '@mui/material'; import { Add } from '@mui/icons-material'; // components @@ -17,7 +18,7 @@ import MuiDialog from '../../components/MuiDialog'; // theme import palette from '../../theme/palette'; // React -import { ReactElement, useEffect, useState } from 'react'; +import { ReactElement, useEffect, useState, useRef } from 'react'; import { fDate } from '@/utils/formatTime'; import { addMinutes, format } from 'date-fns'; import { LoadingButton } from '@mui/lab'; @@ -44,6 +45,7 @@ type MuiDialogProps = { const steps = ['Review', 'Approval', 'Disbursement']; const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => { + console.log(data); const claim = data.claim ?? null; // --------------------------------------------- @@ -103,11 +105,11 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog Claim Request - - Submission date + + Submission Date {/* {JSON.stringify(data)} */} - - {claim.created_at && fDate(claim.created_at)} + + {claim.created_at && format(new Date(claim.created_at), "d MMM yyyy")} @@ -122,47 +124,19 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog ))} - - {/* { claim.status == 'approved' && ( - - } - fullWidth - // sx={{ typography: 'subtitle2', borderColor: '#F5F5F5' }} - onClick={() => {handleUploadInvoice()}} - > - Upload Invoice - - - )} */} - {/* ---------------------------------TYPE INFO------------------------------------ */} - - Pengajuan Penjaminan + Request Claim - - - - } - fullWidth - // sx={{ typography: 'subtitle2', borderColor: '#F5F5F5' }} - onClick={() => {}} - > - Upload Invoice - - - + + {console.log(claim.histories_by_date)} {claim.histories_by_date && claim.histories_by_date.map((historiesByDate) => ( @@ -292,8 +266,8 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog spacing={1} sx={{ marginY: 2 }} > - {claim.files_by_type?.result && - claim.files_by_type.result.map((file, index) => ( + {claim.files_by_type?.claim_result && + claim.files_by_type.claim_result.map((file, index) => ( @@ -322,4 +296,46 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog ); }; +type ButtonIProp = { + row: ClaimSubmission; + type: 'invoice' | 'another' | 'lab'; + handle: (event: any, row: any, type: any) => void; +}; + +const Buttons = ({ handle, row, type }: ButtonIProp) => { + const ref = useRef(null); + + return ( + ref.current?.click()}> + + + + Add Invoice + + + handle(event, row, type)} + /> + + ); +}; + export default DialogDetailClaim; diff --git a/frontend/hospital-portal/src/components/hook-form/v2/FormProvider.tsx b/frontend/hospital-portal/src/components/hook-form/v2/FormProvider.tsx new file mode 100644 index 00000000..c57e3cd8 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/FormProvider.tsx @@ -0,0 +1,26 @@ +import { ReactNode } from 'react'; +// form +import { FormProvider as Form, UseFormReturn } from 'react-hook-form'; + +// ---------------------------------------------------------------------- + +type Props = { + children: ReactNode; + methods: UseFormReturn; + onSubmit?: VoidFunction; + preventEnterSubmit?: boolean; +}; + +export default function FormProvider({ children, onSubmit, methods, preventEnterSubmit }: Props) { + const checkKeyDown = (e: any) => { + if (e.key === 'Enter' && preventEnterSubmit){ + e.preventDefault(); + } + }; + + return ( +
+ checkKeyDown(e)}>{children}
+ + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFAutocomplete.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFAutocomplete.tsx new file mode 100644 index 00000000..b52f932a --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFAutocomplete.tsx @@ -0,0 +1,102 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Autocomplete, AutocompleteProps, FormHelperText, TextField, UseAutocompleteProps } from '@mui/material'; +import { useState } from 'react'; +import { FilterOptionsState } from '@mui/material/useAutocomplete'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string, + label: string, + options: any, + getOptionLabel: (option: any) => string, + isOptionEqualToValue: any, + disableClearable: boolean, + freeSolo: boolean, + renderOption?: any, + onInputChange?: any, + onKeyDown?: any, + onKeyPress?: any, + noOptionsText?: string, + popupIcon?: any, + disabled?: boolean, + sx?: any, + sxTextField?: any, + InputProps?: any, + onSelect?: (option: any) => void, + filterOptions?: (options: any[], state: FilterOptionsState) => any[]; +} + +const RHFAutocomplete = ( {name, label, options, ...rest} : IProps ) => { + const { control } = useFormContext(); + const { + sx, sxTextField, InputProps, + onSelect, + getOptionLabel, filterOptions, + popupIcon, + isOptionEqualToValue, disableClearable, + freeSolo, renderOption, + onInputChange, onKeyDown, onKeyPress, + noOptionsText, disabled } = rest; + + return ( + { + return ( + <> + ( + + )} + onChange={(e, newValue) => { + onChange(newValue); + onSelect && onSelect(newValue); + }} + /> + + {!!error && ( + + {error.message} + + )} + + + + ); + }} + /> + ); + + + +} + +export default RHFAutocomplete; \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFAutocompleteTags.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFAutocompleteTags.tsx new file mode 100644 index 00000000..c8195440 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFAutocompleteTags.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; +import Chip from '@mui/material/Chip'; +import TextField from '@mui/material/TextField'; +import Autocomplete from '@mui/material/Autocomplete'; +import { FormHelperText } from '@mui/material'; +import { Controller, useFormContext } from 'react-hook-form'; +import { useEffect } from 'react'; + +interface IProps { + name: string, + label: string, + options: any, + defaultValue: any +} + +const RHFAutocompleteTags = ({ name, label, options, defaultValue, ...rest }: IProps) => { + const { control } = useFormContext(); + const fixedOptions: any = []; + const [value, setValue] = React.useState([...fixedOptions]); + + useEffect(() => { + setValue(defaultValue) + }, [options, defaultValue]) + + return ( + { + return ( + <> + { + setValue([ + ...fixedOptions, + ...newValue.filter((option) => fixedOptions.indexOf(option) === -1), + ]); + onChange(newValue); + }} + isOptionEqualToValue={(option, value)=>{ + return option.optionID === value.optionID + }} + options={options} + getOptionLabel={(option: { optionID: string, optionLabel: string }) => `${option.optionLabel}` || ""} + renderTags={(tagValue, getTagProps) => + tagValue.map((option, index) => ( + + + + )) + } + renderInput={(params) => ( + + )} + /> + {!!error && ( + + {error.message} + + )} + + ); + }} + /> + + ); +} + +export default RHFAutocompleteTags; \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFCheckbox.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFCheckbox.tsx new file mode 100644 index 00000000..c1ad1d7c --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFCheckbox.tsx @@ -0,0 +1,111 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Checkbox, FormControlLabel, FormGroup, FormControlLabelProps, Grid, FormHelperText } from '@mui/material'; +import RHFDatePicker from './RHFDatePicker'; + +// ---------------------------------------------------------------------- + +interface RHFCheckboxProps extends Omit { + name: string; +} + +export function RHFCheckbox({ name, ...other }: RHFCheckboxProps) { + const { control } = useFormContext(); + + return ( + ( + <> + + {!!error && ( + + {error.message} + + )} + + + )} + /> + } + {...other} + /> + ); +} + +interface RHFCheckboxEndDateProps extends Omit { + name: string; + endPeriodProp: any; + idx?: any; +} + +export function RHFCheckboxEndDate({ name, endPeriodProp, idx, ...other }: RHFCheckboxEndDateProps) { + const { control } = useFormContext(); + + return ( + + { + endPeriodProp(e.target.checked, idx) + }} + /> + } + /> + } + {...other} + /> + ); +} + + +// ---------------------------------------------------------------------- + +interface RHFMultiCheckboxProps extends Omit { + name: string; + options: string[]; +} + +export function RHFMultiCheckbox({ name, options, ...other }: RHFMultiCheckboxProps) { + const { control } = useFormContext(); + + return ( + { + const onSelected = (option: string) => + field.value.includes(option) + ? field.value.filter((value: string) => value !== option) + : [...field.value, option]; + + return ( + + {options.map((option) => ( + field.onChange(onSelected(option))} + /> + } + label={option} + {...other} + /> + ))} + + ); + }} + /> + ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFDatePicker.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFDatePicker.tsx new file mode 100644 index 00000000..e2fa986d --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFDatePicker.tsx @@ -0,0 +1,54 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDatePicker, LocalizationProvider } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + dateFormat: string; + fullWidth?: boolean; + minDate?: any; + maxDate?: any; + disabled?: boolean; +} + +export default function RHFDatePicker({ name, label, dateFormat, minDate, maxDate, disabled, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth } = other; + + return ( + + ( + <> + field.onChange(date)} + inputFormat={dateFormat} + value={field.value} + mask={''} + minDate={(minDate) ? new Date(minDate) : null} + maxDate={(maxDate) ? new Date(maxDate) : null} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFDateTimePicker.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFDateTimePicker.tsx new file mode 100644 index 00000000..6dbc7eb2 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFDateTimePicker.tsx @@ -0,0 +1,53 @@ +// form +import { useFormContext, Controller, useForm } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDateTimePicker, LocalizationProvider } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + dateFormat: string; + fullWidth?: boolean; + onChange?: (date: any) => void; + disabled?: boolean; +} + +export default function RHFDateTimePicker({ name, label, dateFormat, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth, onChange, disabled } = other; + + return ( + + ( + <> + { + field.onChange(date); + onChange && onChange(date); + }} + inputFormat={dateFormat} + value={field.value} + mask={''} + disabled={disabled} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFEditor.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFEditor.tsx new file mode 100644 index 00000000..84cf1c27 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFEditor.tsx @@ -0,0 +1,37 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText } from '@mui/material'; +// +import Editor, { Props as EditorProps } from '../../editor'; + +// ---------------------------------------------------------------------- + +interface Props extends EditorProps { + name: string; +} + +export default function RHFEditor({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + ( + + {error?.message} + + } + {...other} + /> + )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFRadioGroup.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFRadioGroup.tsx new file mode 100644 index 00000000..a2776f13 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFRadioGroup.tsx @@ -0,0 +1,61 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { + Radio, + RadioGroup, + FormHelperText, + RadioGroupProps, + FormControlLabel, +} from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + options: string[]; + getOptionLabel?: string[]; + fullWidth?: boolean; + disabled?: boolean; +} + +export default function RHFRadioGroup({ + name, + options, + getOptionLabel, + fullWidth, + disabled, + ...other +}: IProps & RadioGroupProps) { + const { control } = useFormContext(); + + return ( + ( +
+ + {options.map((option, index) => ( + } + label={getOptionLabel?.length ? getOptionLabel[index] : option} + disabled={disabled} + /> + + ))} + + + {!!error && ( + + {error.message} + + )} +
+ )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFSelect.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFSelect.tsx new file mode 100644 index 00000000..4f6c02b8 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFSelect.tsx @@ -0,0 +1,35 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { TextField, TextFieldProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + children: any; +} + +export default function RHFSelect({ name, children, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + + {children} + + )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFSelectV2.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFSelectV2.tsx new file mode 100644 index 00000000..9337605f --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFSelectV2.tsx @@ -0,0 +1,32 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormControl, FormHelperText, InputLabel, Select, SelectProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + id: string; + children: any; +} + +export default function RHFSelectV2({ name, id, children, ...other }: IProps & SelectProps) { + const { control } = useFormContext(); + + return ( + ( + + {other.label} + + {error && {error.message}} + + )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFSwitch.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFSwitch.tsx new file mode 100644 index 00000000..a56c548a --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFSwitch.tsx @@ -0,0 +1,29 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { Switch, FormControlLabel, FormControlLabelProps } from '@mui/material'; + +// ---------------------------------------------------------------------- + +type IProps = Omit; + +interface Props extends IProps { + name: string; +} + +export default function RHFSwitch({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + } + /> + } + {...other} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFTextField.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextField.tsx new file mode 100644 index 00000000..6ffc8208 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextField.tsx @@ -0,0 +1,29 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { TextField, TextFieldProps, Typography } from '@mui/material'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextField({ name, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + <> + {/* + * + */} + + + )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldMoney.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldMoney.tsx new file mode 100644 index 00000000..078c39b2 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldMoney.tsx @@ -0,0 +1,42 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextFieldMoney({ name, ...other }: IProps & TextFieldProps) { + const { control, watch, setValue } = useFormContext(); + const values = watch(); + + return ( + ( + <> + { (values[name] === '0') && setValue(name, '') }} + onBlur={() => { (values[name] === '') && setValue(name, '0') }} + {...other} + inputProps={{ min: 0, max: 5, style: { textAlign: 'right' } }} + InputProps={{ + startAdornment: Rp, + inputComponent: MoneyFormat as any, + }} + /> + + )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldNumber.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldNumber.tsx new file mode 100644 index 00000000..1646f7a8 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldNumber.tsx @@ -0,0 +1,61 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; +// import AutoNumeric from "autonumeric" +// import { useEffect, useRef } from 'react'; +// import React from 'react'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + endAdornment?: React.ReactNode; +} + +export default function RHFTextFieldNumber({ name, endAdornment, ...other }: IProps & TextFieldProps) { + const { control, watch, setValue } = useFormContext(); + const values = watch(); + + // const ref = React.createRef(); + // const mountedRef = useRef(false); + // useEffect(() => { + // mountedRef.current = true; + // new AutoNumeric(ref.current as HTMLElement) + + // return () => { + // mountedRef.current = false; + // } + // }, []) + + + + return ( + ( + <> + { (watch(name) == '0') && setValue(name, '') }} + onBlur={() => { (watch(name) == '') && setValue(name, '0') }} + {...other} + inputProps={{ min: 0, max: 5, style: { textAlign: 'right' } }} + InputProps={{ + inputComponent: MoneyFormat as any, + endAdornment: endAdornment, + + }} + + /> + + )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldPercentage.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldPercentage.tsx new file mode 100644 index 00000000..f09eba7f --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFTextFieldPercentage.tsx @@ -0,0 +1,39 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { InputAdornment, TextField, TextFieldProps, Typography } from '@mui/material'; +import MoneyFormat from '../../numeric_format/MoneyFormat'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; +} + +export default function RHFTextFieldPercentage({ name, ...other }: IProps & TextFieldProps) { + const { control } = useFormContext(); + + return ( + ( + <> + %, + inputComponent: MoneyFormat as any, + }} + /> + + )} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFTimePicker.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFTimePicker.tsx new file mode 100644 index 00000000..70e9d8fe --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFTimePicker.tsx @@ -0,0 +1,46 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText, TextField } from '@mui/material'; +import { DesktopDatePicker, LocalizationProvider, TimePicker } from '@mui/lab'; +import AdapterDateFns from '@mui/lab/AdapterDateFns'; + +// ---------------------------------------------------------------------- + +interface IProps { + name: string; + label: string; + fullWidth?: boolean; + disabled?: boolean; +} + +export default function RHFTimePicker({ name, label, disabled, ...other }: IProps) { + const { control } = useFormContext(); + + const { fullWidth } = other; + + return ( + + ( + <> + field.onChange(date)} + value={field.value} + renderInput={(params) => } + /> + {!!error && ( + + {error.message} + + )} + + )} + /> + + ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/hook-form/v2/RHFUpload.tsx b/frontend/hospital-portal/src/components/hook-form/v2/RHFUpload.tsx new file mode 100644 index 00000000..fddf48d6 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/RHFUpload.tsx @@ -0,0 +1,112 @@ +// form +import { useFormContext, Controller } from 'react-hook-form'; +// @mui +import { FormHelperText } from '@mui/material'; +// type +import { + UploadAvatar, + UploadMultiFile, + UploadSingleFile, + UploadProps, + UploadMultiFileProps, +} from '../../upload'; +import { Accept } from 'react-dropzone'; + +// ---------------------------------------------------------------------- + +interface Props extends Omit { + name: string; +} + +export function RHFUploadAvatar({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && !field.value; + + return ( +
+ + {checkError && ( + + {error.message} + + )} +
+ ); + }} + /> + ); +} + +// ---------------------------------------------------------------------- + +export function RHFUploadSingleFile({ name, ...other }: Props) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && !field.value; + + return ( + + {error.message} + + ) + } + {...other} + /> + ); + }} + /> + ); +} + +// ---------------------------------------------------------------------- + +interface RHFUploadMultiFileProps extends Omit { + name: string; +} + +export function RHFUploadMultiFile({ name, ...other }: RHFUploadMultiFileProps) { + const { control } = useFormContext(); + + return ( + { + const checkError = !!error && field.value?.length === 0; + + return ( + + {error?.message} + + ) + } + {...other} + /> + ); + }} + /> + ); +} diff --git a/frontend/hospital-portal/src/components/hook-form/v2/index.ts b/frontend/hospital-portal/src/components/hook-form/v2/index.ts new file mode 100644 index 00000000..f58a39a7 --- /dev/null +++ b/frontend/hospital-portal/src/components/hook-form/v2/index.ts @@ -0,0 +1,12 @@ +export * from './RHFCheckbox'; +export * from './RHFUpload'; + +export { default as FormProvider } from './FormProvider'; + +export { default as RHFSwitch } from './RHFSwitch'; +export { default as RHFAutocomplete } from './RHFAutocomplete'; +export { default as RHFSelect } from './RHFSelect'; +export { default as RHFEditor } from './RHFEditor'; +export { default as RHFTextField } from './RHFTextField'; +export { default as RHFRadioGroup } from './RHFRadioGroup'; +export { default as RHFSelectV2 } from './RHFSelectV2'; diff --git a/frontend/hospital-portal/src/components/numeric_format/DiscountPctFormat.tsx b/frontend/hospital-portal/src/components/numeric_format/DiscountPctFormat.tsx new file mode 100644 index 00000000..78c3ec6e --- /dev/null +++ b/frontend/hospital-portal/src/components/numeric_format/DiscountPctFormat.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { InputAttributes, NumericFormat, NumericFormatProps } from "react-number-format"; + +interface CustomProps { + onChange: (event: { target: { name: string; value: string } }) => void; + name: string; +} + +const DiscountPctFormat = React.forwardRef< + NumericFormatProps, + CustomProps +>(function DiscountPctFormat(props, ref) { + const { onChange, ...other } = props; + + return ( + { + onChange({ + target: { + name: props.name, + value: values.value, + }, + }); + }} + thousandSeparator + valueIsNumericString + allowLeadingZeros={false} + /> + ); +}); + +export default DiscountPctFormat; \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/numeric_format/MoneyFormat.tsx b/frontend/hospital-portal/src/components/numeric_format/MoneyFormat.tsx new file mode 100644 index 00000000..6d564143 --- /dev/null +++ b/frontend/hospital-portal/src/components/numeric_format/MoneyFormat.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { InputAttributes, NumericFormat, NumericFormatProps } from "react-number-format"; + +interface CustomProps { + onChange: (event: { target: { name: string; value: string } }) => void; + name: string; +} + +const MoneyFormat = React.forwardRef< + NumericFormatProps, + CustomProps +>(function MoneyFormat(props, ref) { + const { onChange, ...other } = props; + + return ( + { + onChange({ + target: { + name: props.name, + value: values.value, + }, + }); + }} + thousandSeparator + valueIsNumericString + allowLeadingZeros={false} + /> + ); +}); + +export default MoneyFormat; \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/table/Index.ts b/frontend/hospital-portal/src/components/table/Index.ts new file mode 100644 index 00000000..8b4b0f88 --- /dev/null +++ b/frontend/hospital-portal/src/components/table/Index.ts @@ -0,0 +1 @@ +export { default as TableMoreMenu } from './TableMoreMenu'; \ No newline at end of file diff --git a/frontend/hospital-portal/src/components/table/TableMoreMenu.tsx b/frontend/hospital-portal/src/components/table/TableMoreMenu.tsx new file mode 100644 index 00000000..6fe3f43e --- /dev/null +++ b/frontend/hospital-portal/src/components/table/TableMoreMenu.tsx @@ -0,0 +1,60 @@ +import { useEffect, useState } from 'react'; +// @mui +import { IconButton } from '@mui/material'; +// +import Iconify from '../Iconify'; +import MenuPopover from '../MenuPopover'; + +// ---------------------------------------------------------------------- + +type Props = { + actions: React.ReactNode; + disableRipple?: boolean; +}; + +export default function TableMoreMenu({ actions, disableRipple }: Props) { + const [open, setOpen] = useState(null); + + // Close menu popover + useEffect(() => { + setOpen(null); + }, [actions]) + + const handleOpen = (event: React.MouseEvent) => { + setOpen(event.currentTarget); + }; + + const handleClose = () => { + setOpen(null); + }; + + return ( + <> + + + + + + {actions} + +     +  ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/contexts/CollapseDrawerContext.tsx b/frontend/hospital-portal/src/contexts/CollapseDrawerContext.tsx index 6191f198..b9b34558 100644 --- a/frontend/hospital-portal/src/contexts/CollapseDrawerContext.tsx +++ b/frontend/hospital-portal/src/contexts/CollapseDrawerContext.tsx @@ -35,14 +35,14 @@ function CollapseDrawerProvider({ children }: CollapseDrawerProviderProps) { hover: false }); - // useEffect(() => { - // if (isDesktop) { - // setCollapse({ - // click: false, - // hover: false - // }); - // } - // }, [isDesktop]); + useEffect(() => { + if (isDesktop) { + setCollapse({ + click: false, + hover: false + }); + } + }, [isDesktop]); const handleToggleCollapse = () => { setCollapse({ ...collapse, click: !collapse.click }); diff --git a/frontend/hospital-portal/src/contexts/LaravelAuthContext.tsx b/frontend/hospital-portal/src/contexts/LaravelAuthContext.tsx index c4ad4438..e5719f70 100644 --- a/frontend/hospital-portal/src/contexts/LaravelAuthContext.tsx +++ b/frontend/hospital-portal/src/contexts/LaravelAuthContext.tsx @@ -2,7 +2,7 @@ import { createContext, ReactNode, useEffect, useReducer } from 'react'; // utils import axios from '@/utils/axios'; // import { isValidToken, setSession } from '@/utils/jwt'; -import { setSession, getSession, getUser } from '@/utils/token'; +import { setSession, getSession, setUser, getUser } from '@/utils/token'; // @types import { ActionMap, AuthState, AuthUser, JWTContextType } from '@/@types/auth'; // ---------------------------------------------------------------------- @@ -135,6 +135,7 @@ function AuthProvider({ children }: AuthProviderProps) { .then((response) => { const { user, token } = response.data.data; setSession(token); + setUser(user); dispatch({ type: Types.Login, @@ -168,6 +169,7 @@ function AuthProvider({ children }: AuthProviderProps) { const logout = async () => { setSession(null); + setUser(null); dispatch({ type: Types.Logout }); }; diff --git a/frontend/hospital-portal/src/layouts/dashboard/header/AccountPopover.tsx b/frontend/hospital-portal/src/layouts/dashboard/header/AccountPopover.tsx index cae44c1e..2f0c3d3c 100644 --- a/frontend/hospital-portal/src/layouts/dashboard/header/AccountPopover.tsx +++ b/frontend/hospital-portal/src/layouts/dashboard/header/AccountPopover.tsx @@ -19,10 +19,10 @@ const MENU_OPTIONS = [ label: 'Profile', linkTo: '/profile', }, - { - label: 'Settings', - linkTo: '/', - }, + // { + // label: 'Settings', + // linkTo: '/', + // }, ]; // ---------------------------------------------------------------------- diff --git a/frontend/hospital-portal/src/layouts/dashboard/header/LanguagePopover.tsx b/frontend/hospital-portal/src/layouts/dashboard/header/LanguagePopover.tsx index f5bc67e3..e1f8ccc0 100644 --- a/frontend/hospital-portal/src/layouts/dashboard/header/LanguagePopover.tsx +++ b/frontend/hospital-portal/src/layouts/dashboard/header/LanguagePopover.tsx @@ -39,6 +39,7 @@ export default function LanguagePopover() { const handleChangeLanguage = (language) => { localStorage.setItem('currentLocale', language); setCurrentLocale(language); + window.location.reload(); }; return ( diff --git a/frontend/hospital-portal/src/layouts/dashboard/header/NotificationsPopover.tsx b/frontend/hospital-portal/src/layouts/dashboard/header/NotificationsPopover.tsx index b6f713ff..be068570 100644 --- a/frontend/hospital-portal/src/layouts/dashboard/header/NotificationsPopover.tsx +++ b/frontend/hospital-portal/src/layouts/dashboard/header/NotificationsPopover.tsx @@ -1,5 +1,5 @@ import { noCase } from 'change-case'; -import { useState } from 'react'; +import { useState, useEffect } from 'react'; // @mui import { Box, @@ -14,23 +14,40 @@ import { ListSubheader, ListItemAvatar, ListItemButton, + Stack } from '@mui/material'; // utils import { fToNow } from '@/utils/formatTime'; // _mock_ -import { _notifications } from '@/_mock'; +//import { _notifications } from '@/_mock'; // components import Iconify from '@/components/Iconify'; import Scrollbar from '@/components/Scrollbar'; import MenuPopover from '@/components/MenuPopover'; import { IconButtonAnimate } from '@/components/animate'; +import axios from '@/utils/axios'; +import { useSnackbar } from 'notistack'; // ---------------------------------------------------------------------- export default function NotificationsPopover() { - const [notifications, setNotifications] = useState(_notifications); + const [notifications, setNotifications] = useState([]); + const {enqueueSnackbar} = useSnackbar(); + const getDataNotifications = async () => { + axios + .get('notifications/1') + .then((response) => { + setNotifications(response.data.data.notifications); + }) + .catch((error) => { + enqueueSnackbar(error.response.data.meta.message, {variant : "error"}); + }); + }; + useEffect(() => { + getDataNotifications(); + }, []); - const totalUnRead = notifications.filter((item) => item.isUnRead === true).length; + const totalUnRead = notifications.filter((item) => item.isUnRead === 1).length; const [open, setOpen] = useState(null); @@ -46,7 +63,7 @@ export default function NotificationsPopover() { setNotifications( notifications.map((notification) => ({ ...notification, - isUnRead: false, + isUnRead: 0, })) ); }; @@ -77,52 +94,57 @@ export default function NotificationsPopover() {
- {totalUnRead > 0 && ( + {/* {totalUnRead > 0 && ( - )} + )} */} - - New - - } - > - {notifications.slice(0, 2).map((notification) => ( - - ))} - + {notifications && notifications.length > 0 ? ( + <> + + New + + } + > + {notifications.slice(0, 2).map((notification) => ( + + ))} + - - Before that - - } - > - {notifications.slice(2, 5).map((notification) => ( - - ))} - + + Before that + + } + > + {notifications.slice(2, 5).map((notification) => ( + + ))} + + + ): ''} + - + {/* - + */} ); @@ -140,11 +162,31 @@ type NotificationItemProps = { isUnRead: boolean; }; -function NotificationItem({ notification }: { notification: NotificationItemProps }) { +function NotificationItem({ notification, getDataNotifications }: { notification: NotificationItemProps, getDataNotifications: () => void}) { const { avatar, title } = renderContent(notification); + const {enqueueSnackbar} = useSnackbar(); + const handleClick = () => { + const data = { + 'hospital_id' : 1, + 'id' : notification.id, + }; + if(notification.isUnRead) + { + axios + .post('set-read-notification', data) + .then((response) => { + enqueueSnackbar(response.data.meta.message, {variant : "success"}); + getDataNotifications(); + }) + .catch((error) => { + enqueueSnackbar(error.response.data.meta.message, {variant : "error"}); + }); + } + }; return ( - {notification.title} - -   {noCase(notification.description)} - - + + {notification.title} + + {notification.description} + + ); if (notification.type === 'order_placed') { @@ -212,7 +254,7 @@ function renderContent(notification: NotificationItemProps) { title, }; } - if (notification.type === 'mail') { + if (notification.type === 'mail' || notification.type === 'request_document') { return { avatar: ( - {/* - */} + + {/* */}
diff --git a/frontend/hospital-portal/src/layouts/dashboard/navbar/NavConfig.tsx b/frontend/hospital-portal/src/layouts/dashboard/navbar/NavConfig.tsx index 2e1efd95..7d283007 100644 --- a/frontend/hospital-portal/src/layouts/dashboard/navbar/NavConfig.tsx +++ b/frontend/hospital-portal/src/layouts/dashboard/navbar/NavConfig.tsx @@ -4,7 +4,7 @@ import SvgIconStyle from '@/components/SvgIconStyle'; // ---------------------------------------------------------------------- const getIcon = (name: string) => ( - + ); const ICONS = { @@ -12,7 +12,7 @@ const ICONS = { ecommerce: getIcon('ic_ecommerce'), analytics: getIcon('ic_analytics'), dashboard: getIcon('ic_dashboard'), - hospital: getIcon('ic_banking'), + ic_booking: getIcon('ic_booking'), }; const navConfig = [ @@ -21,6 +21,9 @@ const navConfig = [ { items: [{ title: 'Dashboard', path: '/dashboard', icon: ICONS.dashboard }], }, + { + items: [{ title: 'Claim', path: '/claim', icon: ICONS.ic_booking }], + }, // Membership // ---------------------------------------------------------------------- diff --git a/frontend/hospital-portal/src/layouts/dashboard/navbar/NavbarDocs.tsx b/frontend/hospital-portal/src/layouts/dashboard/navbar/NavbarDocs.tsx index 6d75ec49..5ede566c 100644 --- a/frontend/hospital-portal/src/layouts/dashboard/navbar/NavbarDocs.tsx +++ b/frontend/hospital-portal/src/layouts/dashboard/navbar/NavbarDocs.tsx @@ -7,23 +7,26 @@ import { DocIllustration } from '@/assets'; export default function NavbarDocs() { return ( - - + <> + + - {/*
- - Hi, Rayan Moran - - - Need help? -
Please check our docs -
-
+
+ + Hi, Rayan Moran + + + Need help? +
Please check our docs +
+
- */} -
+ + Hak Cipta © 2023 - 2024 Link Medis Sehat +
+ ); } diff --git a/frontend/hospital-portal/src/pages/Claim.tsx b/frontend/hospital-portal/src/pages/Claim.tsx new file mode 100644 index 00000000..d06a81a5 --- /dev/null +++ b/frontend/hospital-portal/src/pages/Claim.tsx @@ -0,0 +1,119 @@ +// @mui +import { Typography, Container, Grid, Card } from '@mui/material'; +// hooks +import useSettings from '@/hooks/useSettings'; +// components +import Page from '@/components/Page'; +// theme +import CardNotification from '@/sections/dashboard/CardNotification'; +import CardSearchMember from '@/sections/dashboard/CardSearchMember' +import { useContext, useEffect, useState } from 'react'; +import axios from '@/utils/axios'; +import { Stack } from '@mui/system'; +import { Input } from '@mui/material'; +//sections +import TableList from '@/sections/claim/TableList'; +import { fDate } from '@/utils/formatTime'; +import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; +import HeaderBreadcrumbs from "@/components/HeaderBreadcrumbs"; + +// ---------------------------------------------------------------------- + +// const [notifications, setNotifications] = useState([]) + +const itemList = [ + { info: 'Mohon lengkapi dokumen Mahen sadarsa', date: 'Selasa, 20 April 22', time: '08:00 WIB' }, + { info: 'Mohon lengkapi dokumen Mahen sadarsa', date: 'Selasa, 20 April 22', time: '09:00 WIB' }, + { info: 'Mohon lengkapi dokumen Mahen sadarsa', date: 'Selasa, 20 April 22', time: '10:00 WIB' }, + { info: 'Mohon lengkapi dokumen Mahen sadarsa', date: 'Selasa, 20 April 22', time: '11:00 WIB' }, +]; + +// ---------------------------------------------------------------------- + +/* ---------------------------------- types --------------------------------- */ + +type PolicyProps = { + myLimit: { + balance: number; + total: number; + percentage: number; + }; + lockLimit: { + balance: number; + percentage: number; + }; +}; + +/* -------------------------------------------------------------------------- */ + +/* ------------------------------ default data ------------------------------ */ +const defaultPolicyData = { + myLimit: { + balance: 0, + total: 0, + percentage: 0, + }, + lockLimit: { + balance: 0, + percentage: 0, + }, +}; +/* -------------------------------------------------------------------------- */ + +export default function Claim() { + const { themeStretch } = useSettings(); + + // const [tableData, setTableData] = useState([]); + const [policyData, setPolicyData] = useState(defaultPolicyData); + + // TODO Remove This + //const [itemList, setItemList] = useState([]); + function handleDataLoaded(dataTable:any) { + let dummyData = []; + dataTable.map(function(data:any) { + if (data.status == 'approved') { + dummyData.push({ + info: `LOG Approved for member ${data.member.full_name}`, + date: fDate(data.created_at, "dd MMMM"), + time: fDate(data.created_at, "HH:mm") + }) + } + }) + + //setItemList(dummyData); + } + + return ( + + + + {/* + + */} + {/* + + */} + + + + + + + + + + + ); +} diff --git a/frontend/hospital-portal/src/pages/Dashboard.tsx b/frontend/hospital-portal/src/pages/Dashboard.tsx index aa5ae9b3..2d537013 100644 --- a/frontend/hospital-portal/src/pages/Dashboard.tsx +++ b/frontend/hospital-portal/src/pages/Dashboard.tsx @@ -86,12 +86,12 @@ export default function Dashboard() { - - {console.log('submit success')}}> + + - + {/* - + */} diff --git a/frontend/hospital-portal/src/routes/index.tsx b/frontend/hospital-portal/src/routes/index.tsx index 26fcfbdc..b3006919 100644 --- a/frontend/hospital-portal/src/routes/index.tsx +++ b/frontend/hospital-portal/src/routes/index.tsx @@ -76,6 +76,31 @@ export default function Router() { path: 'dashboard', element: , }, + { + path: '/detail/:id', + element: , + }, + ], + }, + { + path: '/', + element: ( + + + + + + ), + children: [ + { element: , index: true }, + { + path: 'claim', + element: , + }, + { + path: '/detail/:id', + element: , + }, ], }, @@ -97,4 +122,7 @@ const ForgetPassword = Loadable(lazy(() => import('@/pages/auth/ForgetPassword') // Dashboard const Dashboard = Loadable(lazy(() => import('@/pages/Dashboard'))); +const Claim = Loadable(lazy(() => import('@/pages/Claim'))); const NotFound = Loadable(lazy(() => import('@/pages/Page404'))); + +const DetailClaimReport = Loadable(lazy(()=> import('@/sections/dashboard/Detail'))); diff --git a/frontend/hospital-portal/src/sections/claim/TableList.tsx b/frontend/hospital-portal/src/sections/claim/TableList.tsx new file mode 100644 index 00000000..513ea292 --- /dev/null +++ b/frontend/hospital-portal/src/sections/claim/TableList.tsx @@ -0,0 +1,365 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { Stack, Button, MenuItem, SelectChangeEvent, Tab, Tabs, Card, Box } from '@mui/material'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +import { styled } from '@mui/material/styles'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import TableComponent from '../../components/Table'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +//import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate } from 'react-router-dom'; +import { fDate, fDateSuffix } from '../../utils/formatTime'; +import Typography from '@mui/material/Typography'; +import { format } from 'date-fns'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import SearchIcon from '@mui/icons-material/Search'; +import Label from '../../components/Label'; +import { enqueueSnackbar } from 'notistack'; +import { LoadingButton, TabPanel } from "@mui/lab"; +import { LanguageContext } from '@/contexts/LanguageContext'; +import MuiDialog from '@/components/MuiDialog'; +import DialogMember from '@/sections/dashboard/DialogMember'; +import DialogClaimSubmit from '@/sections/dashboard/DialogClaimSubmit'; +import { fPostFormat } from '@/utils/formatTime'; + +export default function TableList() { + const navigate = useNavigate(); + const { localeData }: any = useContext(LanguageContext); + + const [data, setData] = useState([]); + + // Download LOG + async function handleDownloadLog(claimRequest:any) { + return axios + .get(`claim-requests/${claimRequest}/log`, { + responseType: 'blob', + }) + .then((response) => { + window.open(URL.createObjectURL(response.data)); + // setLoadingLog(false); + }) + // .then((blobFile) => { + // new File([blobFile], 'asdads.pdf', { type: blobFile.type }) + // setLoadingLog(false); + // }) + .catch((response) => { + console.log(response); + enqueueSnackbar(response.message, { variant: 'error' }); + // setLoadingLog(false); + }); + } + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('desc'); + const [orderBy, setOrderBy] = useState('submission_date'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: true, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* ------------------------------ handle filter ----------------------------- */ + const [statusValue, setStatusValue] = useState('all'); + const [filterData, setStatusData] = useState([]); + + // handle status + const handleStatusChanges = (event: SelectChangeEvent) => { + setStatusValue(event.target.value as string); + + if (event.target.value === 'all') { + searchParams.delete('status'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([ + ...searchParams.entries(), + ['status', event.target.value as string], + ]); + setAppliedParams(params); + } + }; + + const filterStatus = { + useFilter: true, + config: { + label: 'Status', + statusValue: statusValue, + filterData: filterData, + handleStatusChange: handleStatusChanges, + }, + }; + + // handle start date + const [startDateValue, setStartDateValue] = useState(''); + + const handleStartDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newStartDateValue = event.currentTarget.elements['date-input'].value; + setStartDateValue(newStartDateValue); + if (newStartDateValue === '') { + searchParams.delete('start_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['start_date', newStartDateValue]]); + setAppliedParams(params); + } + }; + + const filterStartDate = { + useFilter: true, + startDate: startDateValue, + setStartDate: setStartDateValue, + handleStartDateChange: handleStartDateChanges, + }; + + // handle end date + const [endDateValue, setEndDateValue] = useState(''); + + const handleEndDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newEndDateValue = event.currentTarget.elements['date-input'].value; + setEndDateValue(newEndDateValue); + if (newEndDateValue === '') { + searchParams.delete('end_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['end_date', newEndDateValue]]); + setAppliedParams(params); + } + }; + + const filterEndDate = { + useFilter: true, + endDate: endDateValue, + setEndDate: setEndDateValue, + handleEndDateChange: handleEndDateChanges, + }; + + /* -------------------------------- headCell Claim -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'code', + align: 'left', + label: localeData.txtRequestCode, + isSort: true, + }, + { + id: 'full_name', + align: 'left', + label: localeData.txtName, + isSort: true, + }, + { + id: 'submission_date', + align: 'center', + label: localeData.txtSubmissionDate, + isSort: true, + }, + { + id: 'service_type', + align: 'center', + label: localeData.txtServiceType, + isSort: true, + }, + { + id: 'status', + align: 'center', + label: localeData.txtStatus, + isSort: true, + }, + { + id: 'action', + align: 'right', + label: '', + isSort: false, + }, + ]; + + + useEffect(() => { + getData(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams]); + + function getData() + { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`/get-claim-requests`, { + params: { ...parameters, type: 'final-log' }, + }); + setData( + response.data.data.map((obj: any) => ({ + ...obj, + status: + obj.status === 'requested' ? ( + + ) : obj.status === 'approved' ? ( + + ) : obj.status === 'declined' ? ( + + ) : obj.status === 'reviewed' ? ( + + ) : ( + + ), + submission_date: + + , + action: + + + + View + + + } /> + })) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + const status:any = [ + {"id": "requested", "name": "Request" }, + {"id": "reviewed", "name": "Review" }, + {"id": "approved", "name": "Approval" }, + {"id": "declined", "name": "Decline" }, + ]; + setStatusData(status) + + setIsLoading(false); + })(); + } + + + return ( + <> + + + ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx b/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx index 5d13683e..77ae25a2 100644 --- a/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/CardSearchMember.tsx @@ -46,8 +46,8 @@ const ItemNotificationStyle = styled(Card)(({ theme }) => ({ // ---------------------------------------------------------------------- -export default function CardSearchMember(handleSubmitSuccess) { - const { localeData } = useContext(LanguageContext); +export default function CardSearchMember(handleSubmitSuccess:()=> void) { + const { localeData }: any = useContext(LanguageContext); const {enqueueSnackbar} = useSnackbar(); const [noPolis, setNoPolis] = useState('AW001-01'); @@ -69,7 +69,7 @@ export default function CardSearchMember(handleSubmitSuccess) { .then((response) => { setOpenDialogBenefit(true) setCurrentMember(response.data.data) - setNameMember(response.data.data.name); + setNameMember(response.data.data.members.name); }) .catch(({response}) => { enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.meta.message : 'Opps, Something went Wrong!'), {variant : "error"}) @@ -88,59 +88,53 @@ export default function CardSearchMember(handleSubmitSuccess) { alignItems="center" sx={{ paddingBottom: 2, paddingTop: 1 }} > - - {localeData.txtCardSearchMember1} -
- - { + + { setNoPolis(event.target.value) - }} required> + }} + sx={{width:'40%'}} + required + /> + { - setTanggalLahir( (newValue)); + onChange={(newValue:any) => { + setBirthDate( (newValue)); }} inputFormat="dd-MM-yyyy" - renderInput={(params) => } + renderInput={(params) => } /> - - { - handleSearchMember() - }} - > - - {localeData.txtCardSearchMember2} - - {/* - Ajukan Penjaminan - */} - + { + handleSearchMember() + }} + > + + {localeData.txtCardSearchMember2} + {/* @@ -150,7 +144,7 @@ export default function CardSearchMember(handleSubmitSuccess) { openDialog={openDialogBenefit} setOpenDialog={setOpenDialogBenefit} content={DialogMember(currentMember, () => {setOpenDialogBenefit(false); handleSubmitSuccess()})} - maxWidth="md" + maxWidth="sm" />
); diff --git a/frontend/hospital-portal/src/sections/dashboard/Detail.tsx b/frontend/hospital-portal/src/sections/dashboard/Detail.tsx new file mode 100644 index 00000000..46405438 --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/Detail.tsx @@ -0,0 +1,67 @@ +// mui +import { Container, Grid, Stack, Typography } from '@mui/material'; +// components +import Page from '../../components/Page'; +// utils +import useSettings from '../../hooks/useSettings'; +// section +import CardFamilyInformation from '../../sections/alarm-center/user-profile/CardFamilyInformation'; +// react +import { useNavigate, useParams } from 'react-router-dom'; +import ButtonBack from '../../components/ButtonBack'; +import { useEffect, useState, useContext } from 'react'; +import axios from '../../utils/axios'; +// pages +import DetailTimeline from '../../sections/dashboard/DetailTimeline'; +import DetailStepper from '../../sections/dashboard/DetailStepper'; +import { format } from 'date-fns'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; + +// ---------------------------------------------------------------------- + +export default function Detail() { + const navigate = useNavigate(); + const { themeStretch } = useSettings(); + const [data, setData] = useState(); + + const { id } = useParams(); + + useEffect(() => { + axios + .get('/detail-claim-requests/' + id) + .then((response) => { + setData(response.data); + }) + .catch((error) => { + console.error(error); + }); + + }, []); + + return ( + + + + navigate(-1)} sx={{cursor:'pointer'}}/> + Detail + {data ? ( + + Submission Date + {(data && data.data) ? format(new Date(data.data.status.submission_date), "d MMM yyyy") : ''} + + ) : ''} + + {data ? ( + + + + + + + + + ) : ''} + + + ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/sections/dashboard/DetailStepper.tsx b/frontend/hospital-portal/src/sections/dashboard/DetailStepper.tsx new file mode 100644 index 00000000..18dc959a --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/DetailStepper.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stepper from '@mui/material/Stepper'; +import Step from '@mui/material/Step'; +import StepLabel from '@mui/material/StepLabel'; +import { useEffect, useState } from 'react'; +import ClearIcon from '@mui/icons-material/Clear'; + +const steps = [ + 'Request', + 'Review', + 'Approval', + 'Decline', +]; + +export default function HorizontalLinearAlternativeLabelStepper({data}) { + const [active, setActive] = useState(0); + const [status, SetStatus] = useState(null); + let updatedSteps = [...steps]; + useEffect(() => { + if (data && data.data) { + if (data.data.status.status === 'requested') { + setActive(1); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'reviewed') { + setActive(2); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if (data.data.status.status === 'approved') + { + setActive(3); + updatedSteps = updatedSteps.filter(step => step !== 'Decline'); + } + else if(data.data.status.status === 'declined') + { + setActive(4) + updatedSteps = updatedSteps.filter(step => step !== 'Approval'); + } + } + SetStatus(updatedSteps); + }, [data]); + + + + + return ( + + + {status?.map((label) => ( + + : ''}>{label} + + ))} + + + ); +} diff --git a/frontend/hospital-portal/src/sections/dashboard/DetailTimeline.tsx b/frontend/hospital-portal/src/sections/dashboard/DetailTimeline.tsx new file mode 100644 index 00000000..9d8b7b7f --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/DetailTimeline.tsx @@ -0,0 +1,386 @@ +import * as React from 'react'; +import Timeline from '@mui/lab/Timeline'; +import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; +import TimelineSeparator from '@mui/lab/TimelineSeparator'; +import TimelineConnector from '@mui/lab/TimelineConnector'; +import TimelineContent from '@mui/lab/TimelineContent'; +import TimelineDot from '@mui/lab/TimelineDot'; +import {Typography, Card, Stack, ButtonBase, Box, Divider} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import Iconify from '../../components/Iconify'; +import { useEffect, useState, useRef } from 'react'; +import { format } from 'date-fns'; +import { LoadingButton } from '@mui/lab'; +import axios from '../../utils/axios'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { enqueueSnackbar } from 'notistack'; +import { useParams} from 'react-router-dom'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; + +const Item1 = styled(Paper)(({ theme }) => ({ + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + backgroundColor: '#919EAB29', + color: '#637381', + width: 'fit-content', + marginRight: 'auto', +})); + +const Item2 = styled(Paper)(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + color: theme.palette.text.secondary, + width: 'fit-content', + marginLeft: 'auto', +})); + +export default function NoOppositeContent({data}) { + const [timeline, setTimeline] = useState(null); + const [requestFile, setRequestFile] = useState(null); + useEffect(() => { + if (data && data.data) { + setTimeline(data.data.timeline); + setRequestFile(data.data.request_files); + } + + }, [data]); + + // Diagnosis + const fileRequestDocumentInputDiagnosis = useRef(null); + const [fileDiagnosis, setFileDiagnosis] = useState([]); + const handleRequestDocumentInputChangeDiagnosis = (event) => { + if (event.target.files[0]) { + setFileDiagnosis([...fileDiagnosis, ...event.target.files]); + } + }; + const removeFileDiagnois = (filesState, index) => { + setFileDiagnosis( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Kondisi + const fileRequestDocumentInputKondisi = useRef(null); + const [fileKondisi, setFileKondisi] = useState([]); + const handleRequestDocumentInputChangeKondisi = (event) => { + if (event.target.files[0]) { + setFileKondisi([...fileKondisi, ...event.target.files]); + } + }; + const removeFileKondisi = (filesState, index) => { + setFileKondisi( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + // Result + const fileRequestDocumentInputResult = useRef(null); + const [fileResult, setFileResult] = useState([]); + const handleRequestDocumentInputChangeResult = (event) => { + if (event.target.files[0]) { + setFileResult([...fileResult, ...event.target.files]); + } + }; + const removeFileResult = (filesState, index) => { + setFileResult( + filesState.filter((file, fileIndex) => { + return fileIndex != index; + }) + ); + }; + const { id } = useParams(); + const [submitLoading, setSubmitLoading] = useState(false); + const submitRequestFiles = () => { + setSubmitLoading(true); + const formData = makeFormData({ + fileDiagnosis: fileDiagnosis, + fileKondisis: fileKondisi, + fileResults: fileResult + }); + axios + .post('claim-requests/'+id+'/request-files', formData) + .then((response) => { + window.location.reload(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + }); + } + const submitButton = requestFile?.find((dataRequestFile) => dataRequestFile.check_files === null); + return ( + <> + {timeline?.map((dataTimeline, index) => ( + + {dataTimeline.date ? format(new Date(dataTimeline.date), "d MMM yyyy") : ''} + + + + + + + + + + {dataTimeline.date ? format(new Date(dataTimeline.date), "HH : mm") : ''} + {dataTimeline.txt_status} + + + Detail: + {dataTimeline.description} + + {dataTimeline.status === 'reviewed' && requestFile ? ( + <> + {submitButton ? ( + Request Document + ) : ( + Request Document Success Uploaded + )} + {/* Diagnosis */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-diagnosis' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Diagnosis + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosis && + fileDiagnosis.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileDiagnois(fileDiagnosis, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputDiagnosis.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeDiagnosis(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Kondisi */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-kondisi' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Condition + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisi && + fileKondisi.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileKondisi(fileKondisi, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputKondisi.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeKondisi(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {/* Supporting Result */} + {requestFile?.map((dataRequestFile, index) => { + if(dataRequestFile.type !== 'claim-result' || dataRequestFile.check_files !== null){ + return null; + } + return ( + + + Supporting Result + + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileResult && + fileResult.map((file, index) => ( + + + + {file.name ? file.name : '-'} + + { + removeFileResult(fileResult, index); + }} + sx={{cursor: 'pointer'}} + > + + ))} + + fileRequestDocumentInputResult.current?.click()} + > + + + + Add Result + + + handleRequestDocumentInputChangeResult(event)} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + + ); + })} + {submitButton ? ( + { + submitRequestFiles(); + }} + loading={submitLoading} + > + Submit + + ) : ''} + + ) : ''} + + + + + + ))} + + ); +} diff --git a/frontend/hospital-portal/src/sections/dashboard/DialogClaimSubmit.tsx b/frontend/hospital-portal/src/sections/dashboard/DialogClaimSubmit.tsx new file mode 100644 index 00000000..914fa652 --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/DialogClaimSubmit.tsx @@ -0,0 +1,164 @@ +import { styled } from '@mui/material/styles'; +import Iconify from '@/components/Iconify'; +import { fCurrency } from '@/utils/formatNumber'; +import { LoadingButton } from '@mui/lab'; +import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box } from '@mui/material'; +import { Card } from '@mui/material'; +import { Stack, Typography } from '@mui/material'; +import { fPostFormat } from '@/utils/formatTime'; +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { useRef, useState, useContext } from 'react'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { format } from 'date-fns'; +import { LanguageContext } from '@/contexts/LanguageContext'; + +export default function DialogClaimSubmit({ member, getData, onClose, handleSubmitSuccess }: any) { + const { localeData }: any = useContext(LanguageContext); + + // ---------------------------------------------------------------------- + // Files Result Tambahan + + const fileAdditionalInput = useRef(null); + const [fileAdditionals, setFileAdditionals] = useState([]); + + const handleKondisiInputChange = (event:any) => { + if (event.target.files[0]) { + setFileAdditionals([...fileAdditionals, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState:any, index:any) => { + setFileAdditionals( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // -------------------------------------------------------------- + // Submit Form + + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequestClaim() { + setSubmitLoading(true); + const formData = makeFormData({ + request_logs_id: member.id, + service_code: member.service_code, + member_id: member.member_id, + additional_files: fileAdditionals + }); + axios + .post('/claim-requests', formData) + .then((response) => { + enqueueSnackbar(response.data.meta.message ?? 'Berhasil membuat data', { variant: 'success' }); + handleSubmitSuccess(); + onClose({ someData: 'example data' }, getData); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.meta.message ?? 'Something Went Wrong', { variant: 'error' }); + }) + .then(() => { + setSubmitLoading(false); + }); + } + + return ( + + + + {localeData.txtDialogMember5} + + {format(member?.submission_date ? new Date(member.submission_date) : new Date(), "d MMM yyyy")} + + + + + + + {member?.full_name ?? ''} + {member?.no_polis ?? ''} + + + + + } + spacing={4} + sx={{ marginY: 2, marginBottom: 6 }} + > + {/* -------------------------------Upload Dokumen Tambahan------------------------------- */} + + + {localeData.txtAdditionalDocuments} + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileAdditionals && + fileAdditionals.map((file:any, index:any) => ( + + {file.name} + { + removeKondisiFiles(fileAdditionals, index); + }} + > + + ))} + + fileAdditionalInput.current?.click()}> + + + + {localeData.txtAddResult} + + + + + + + + { + submitRequestClaim(); + }} + loading={submitLoading} + > + Submit Claim + + + ); +} diff --git a/frontend/hospital-portal/src/sections/dashboard/DialogFinalLog.tsx b/frontend/hospital-portal/src/sections/dashboard/DialogFinalLog.tsx new file mode 100644 index 00000000..3326616e --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/DialogFinalLog.tsx @@ -0,0 +1,328 @@ +import { styled } from '@mui/material/styles'; +import Iconify from '@/components/Iconify'; +import { fCurrency } from '@/utils/formatNumber'; +import { LoadingButton } from '@mui/lab'; +import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box } from '@mui/material'; +import { Card } from '@mui/material'; +import { Stack, Typography } from '@mui/material'; +import { fPostFormat } from '@/utils/formatTime'; +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { useRef, useState, useContext } from 'react'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { format } from 'date-fns'; +import { LanguageContext } from '@/contexts/LanguageContext'; + +export default function DialogFinalLog({ member, getData, onClose, handleSubmitSuccess }: any) { + const { localeData }: any = useContext(LanguageContext); + + // ---------------------------------------------------------------------- + // Files Diagnosa + + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + + const handleDiagnosaInputChange = (event:any) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState:any, index:any) => { + setFileDiagnosas( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // ---------------------------------------------------------------------- + // Files Result Kondisi + + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event:any) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState:any, index:any) => { + setFileKondisis( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // ---------------------------------------------------------------------- + // Files Result Hasil Penunjang + + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + + const handleResultInputChange = (event:any) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState:any, index:any) => { + setFileHasilPenunjangs( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // -------------------------------------------------------------- + // Submit Form + + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequestFinalLog() { + setSubmitLoading(true); + const formData = makeFormData({ + request_logs_id: member.id, + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis + }); + axios + .post('/request-final-log', formData) + .then((response) => { + enqueueSnackbar(response.data.meta.message ?? 'Berhasil membuat data', { variant: 'success' }); + handleSubmitSuccess(); + onClose({ someData: 'example data' }, getData); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.meta.message ?? 'Something Went Wrong', { variant: 'error' }); + }) + .then(() => { + setSubmitLoading(false); + }); + } + + return ( + + + + {localeData.txtDialogMember5} + + {format(member?.submission_date ? new Date(member.submission_date) : new Date(), "d MMM yyyy")} + + + + + + + {member?.full_name ?? ''} + {member?.no_polis ?? ''} + + + + + } + spacing={4} + sx={{ marginY: 2, marginBottom: 6 }} + > + {/* -------------------------------Upload Dokumen Kondisi------------------------------- */} + + + {localeData.txtConditionDocument} + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileKondisis && + fileKondisis.map((file:any, index:any) => ( + + {file.name} + { + removeKondisiFiles(fileKondisis, index); + }} + > + + ))} + + fileKondisiInput.current?.click()}> + + + + {localeData.txtAddResult} + + + + + + + {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} + + + {localeData.txtDiagnosisDokument} + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileDiagnosas && + fileDiagnosas.map((file:any, index:any) => ( + + {file.name} + { + removeDiagnosaFiles(fileDiagnosas, index); + }} + > + + ))} + {/* + Nama File .pdf + + */} + + {/* { JSON.stringify(filesResult) } */} + fileDiagnosaInput.current?.click()}> + + + + {localeData.txtAddResult} + + + + + + + {/* -------------------------------Upload Dokumen Hasil Penunjang------------------------------- */} + + + {localeData.txtSupportingResultDocument} + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file:any, index:any) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + > + + ))} + {/* + Nama File .pdf + + */} + + {/* { JSON.stringify(filesResult) } */} + fileHasilPenunjangInput.current?.click()}> + + + + {localeData.txtAddResult} + + + + + + + + { + submitRequestFinalLog(); + }} + loading={submitLoading} + > + Request Final LOG + + + ); +} diff --git a/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx b/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx index b2192dcb..0c95dec6 100644 --- a/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx @@ -1,7 +1,22 @@ // mui import { styled } from '@mui/material/styles'; import { LoadingButton, TabPanel } from "@mui/lab"; -import { Button, Card, Divider, Grid, LinearProgress, linearProgressClasses, Typography } from "@mui/material"; +import { + Button, + Card, + Divider, + Grid, + LinearProgress, + linearProgressClasses, + Typography, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Collapse, } from "@mui/material"; import { Tab, Tabs } from "@mui/material"; import { Box, Stack } from "@mui/material"; import React, { useEffect, useState, useContext } from "react"; @@ -10,11 +25,15 @@ import { fPostFormat } from '@/utils/formatTime'; import { Avatar } from '@mui/material'; import Iconify from '@/components/Iconify'; import FormRequestClaim from './FormRequestClaim'; +import FormRequestLog from './FormRequestLog'; import { LanguageContext } from '@/contexts/LanguageContext'; +import { format } from 'date-fns'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -export default function DialogMember(member, handleSubmitSuccess) { - const { localeData } = useContext(LanguageContext); - const [currentTab, setCurrentTab] = useState('request') +export default function DialogMember(member:any, handleSubmitSuccess:() => void) { + const { localeData }: any = useContext(LanguageContext); + const [currentTab, setCurrentTab] = useState('request'); // ---------------------------------------------------------------------- @@ -40,10 +59,8 @@ export default function DialogMember(member, handleSubmitSuccess) { }, })); - function TabPanel(props) { + function TabPanel(props:any) { const { children, value, index, ...other } = props; - - console.log('current', value) return (
); } + + const [openRows, setOpenRows] = useState({}); + + const handleRowToggle = (index:number) => { + setOpenRows((prevOpenRows:any) => ({ + ...prevOpenRows, + [index]: !prevOpenRows[index], + })); + }; return (
@@ -70,112 +96,100 @@ export default function DialogMember(member, handleSubmitSuccess) { aria-label="wrapped label tabs example" > - - + + {member?.type !== 'view' ? ( + + ) : ''} - - - - - - Mapping ID - - - : {1 ?? '-'} - - - Policy Number - - - : {1 ?? '-'} - - - NRIC - - - : {1 ?? '-'} - - - - NIK - - - : {1 ?? '-'} - - - Email - - - : {1 ?? '-'} - - - - - - - Birth Date - - - : {1 ?? '-'} - - - Gender - - - : {1 ?? '-'} - - - Marital Status - - - : {1 ?? '-'} - - - Language - - - : {1 ?? '-'} - - - Race - - - : {1 ?? '-'} - - - Relationship - - - : {1 ?? '-'} - - - - + + + Member ID + { member?.members.member_id ?? '-'} + + + Policy Number + { member?.members.policy_id ?? '-'} + + + NRIC + {member?.members.nik ?? '-'} + + + NIK + {member?.members.nik ?? '-'} + + + Email + {member?.members.email ?? '-'} + + + {localeData.txtDateBirth} + {member?.members.birth_date ? format(new Date(member.members.birth_date), "d MMM yyyy") : '-'} + + + {localeData.txtGender} + {member?.members.gender ?? '-'} + + + {localeData.txtMaritalStatus} + {member?.members.marital_status ?? '-'} + + + {localeData.txtLanguage} + {member?.members.language ?? '-'} + + + Race + {member?.members.race ?? '-'} + + + {localeData.txtRelationship} + {member?.members.relation_with_principal != '' ? member?.members.relation_with_principal : '-'} + - - - - { member && member?.current_plan?.corporate_benefits?.map((corporateBenefit, index) => {return ( - - - {corporateBenefit.benefit.description} - Member ID : {corporateBenefit.benefit.code} - Yearly Limits - - {corporateBenefit.usage ?? 0} / - {corporateBenefit.limit_ammount < 9999999999 ? fCurrency(corporateBenefit.limit_amount ?? 0) : 'As Charge' } - - - )})} - + + + + {member && member.groupServices && Object.keys(member.groupServices).map((serviceCode, index) => ( + + + {serviceCode} + + {openRows[index] ? ( + handleRowToggle(index)} /> + ) : ( + handleRowToggle(index)} /> + )} + + + + + {/* COLLAPSIBLE ROW */} + + + {/* Loop through the array for the current serviceCode */} + {member.groupServices[serviceCode].map((item:any, innerIndex:number) => ( + + + {item.description} + {item.code} + + + ))} + + + + + + ))} +
+
- - - +
diff --git a/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx b/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx index bdfb8e6f..36592c9e 100644 --- a/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx @@ -2,7 +2,7 @@ import { styled } from '@mui/material/styles'; import Iconify from '@/components/Iconify'; import { fCurrency } from '@/utils/formatNumber'; import { LoadingButton } from '@mui/lab'; -import { Avatar, Button, Divider, LinearProgress, linearProgressClasses } from '@mui/material'; +import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box } from '@mui/material'; import { Card } from '@mui/material'; import { Stack, Typography } from '@mui/material'; import { fPostFormat } from '@/utils/formatTime'; @@ -10,6 +10,7 @@ import axios from '@/utils/axios'; import { enqueueSnackbar } from 'notistack'; import { useRef, useState } from 'react'; import { makeFormData } from '@/utils/jsonToFormData'; +import { format } from 'date-fns'; // TODO Fix any export default function FormRequestClaim({ member, handleSubmitSuccess }) { @@ -25,7 +26,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { }, })); - const [serviceCode, setServiceCode] = useState('IP'); + const [serviceCode, setServiceCode] = useState(''); // ---------------------------------------------------------------------- // Files Diagnosa @@ -95,9 +96,14 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { const [submitLoading, setSubmitLoading] = useState(false); function submitRequest() { + if(serviceCode == '') + { + enqueueSnackbar('Please select services', { variant: 'error' }); + return false; + } setSubmitLoading(true); const formData = makeFormData({ - member_id: member.id, + member_id: member.members.id, result_files: fileHasilPenunjangs, diagnosa_files: fileDiagnosas, kondisi_files: fileKondisis, @@ -106,11 +112,11 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { axios .post('/claim-requests', formData) .then((response) => { - enqueueSnackbar(response.data.message ?? 'Berhasil membuat data', { variant: 'success' }); + enqueueSnackbar(response.data.data.message ?? 'Berhasil membuat data', { variant: 'success' }); handleSubmitSuccess(); }) .catch(({ response }) => { - enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); + enqueueSnackbar(response.data.data.message ?? 'Something Went Wrong', { variant: 'error' }); }) .then(() => { setSubmitLoading(false); @@ -119,37 +125,51 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { return ( - - - Submission Date :
{fPostFormat(new Date(), 'dd/MM/yyyy')} + + + Submission Date + {format(new Date(), "d MMM yyyy")} - - + + + Services + + + + {member && member?.services?.map((dataServices, index) => ( + + ))} + + - - - - - + - {member?.full_name ?? ''} - {member?.member_id ?? ''} + {member?.members.name ?? ''} + {member?.members.member_id ?? ''} - + {/* Total Limit @@ -166,17 +186,17 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { {fCurrency(member?.current_plan?.usage ?? 0)} /{' '} {member?.current_plan?.limit_rules < 9999999999 ? fCurrency(member?.current_plan?.limit_rules ?? 0) : 'As Charge' }
- + */} } spacing={4} - sx={{ marginY: 2 }} + sx={{ marginY: 2, marginBottom: 6 }} > {/* -------------------------------Upload Dokumen Kondisi------------------------------- */} - - Dokumen Kondisi + + Condition Document {/* Hasil Lab, */} ))} - {/* - Nama File .pdf - - */} - {/* { JSON.stringify(filesResult) } */} - - { - fileKondisiInput.current.click(); - }} - > - - Add Result - + fileKondisiInput.current?.click()}> + + + + Add Result + + + + {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} - - Dokumen Diagnosa + + Diagnosis Dokument {/* Hasil Lab, */} */} {/* { JSON.stringify(filesResult) } */} - - { - fileDiagnosaInput.current.click(); - }} - > - - Add Result - + fileDiagnosaInput.current?.click()}> + + + + Add Result + + + + {/* -------------------------------Upload Dokumen Hasil Penunjang------------------------------- */} - - Dokumen Hasil Penunjang + + Supporting Result Document {/* Hasil Lab, */} */} {/* { JSON.stringify(filesResult) } */} - - { - fileHasilPenunjangInput.current.click(); - }} - > - - Add File - + fileHasilPenunjangInput.current?.click()}> + + + + Add Result + + + +
{ submitRequest(); }} loading={submitLoading} > - LOG Request + Request LOG
); diff --git a/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx b/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx new file mode 100644 index 00000000..9110d837 --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/FormRequestLog.tsx @@ -0,0 +1,128 @@ +import { LoadingButton } from '@mui/lab'; +import +{ + Avatar, + FormControl, + InputLabel, + Select, + FormHelperText, + MenuItem +} from '@mui/material'; +import { Card } from '@mui/material'; +import { Stack, Typography } from '@mui/material'; +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { useRef, useState, useContext } from 'react'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { format } from 'date-fns'; +import { LanguageContext } from '@/contexts/LanguageContext'; + +interface MemberType { + members: any; + services: any; +} +interface FormRequestClaimProps { + member: MemberType; + handleSubmitSuccess: () => void; +} +export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRequestClaimProps) { + const { localeData }: any = useContext(LanguageContext); + const [serviceCode, setServiceCode] = useState(''); + + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequest() { + if(serviceCode == '') + { + enqueueSnackbar(localeData.txtDialogMember4, { variant: 'warning' }); + return false; + } + setSubmitLoading(true); + const formData = { + member_id: member.members.id, + service_code: serviceCode + }; + axios + .post('/request-log', formData) + .then((response) => { + console.log(response); + if (response && response.data && response.data.meta) { + enqueueSnackbar(response.data.meta.message, { variant: 'success' }); + handleSubmitSuccess(); + } + }) + .catch(({ response }) => { + if (response && response.data && response.data.meta) { + enqueueSnackbar(response.data.meta.message, { variant: 'error' }); + } + }) + .then(() => { + setSubmitLoading(false); + }); + } + + interface MemberService { + service_code: string; + name: string; + } + + return ( + + + + {localeData.txtDialogMember5} + + {format(new Date(), "d MMM yyyy")} + + + + + {localeData.txtDialogMember1}* + + + {localeData.txtDialogMember1} + + + + + + + + + + + + {member?.members.name ?? ''} + {member?.members.member_id ?? ''} + + + + + { + submitRequest(); + }} + loading={submitLoading} + > + {localeData.txtDialogMember2} + + + ); +} diff --git a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx index 0aeb07cf..b1575b08 100644 --- a/frontend/hospital-portal/src/sections/dashboard/TableList.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableList.tsx @@ -1,344 +1,59 @@ /* ---------------------------------- @mui ---------------------------------- */ -import { styled } from '@mui/material/styles'; -import { - Paper, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - TextField, - Button, - TableSortLabel, - Box, - IconButton, - Card, - Grid, - FormControl, - InputLabel, - Select, - MenuItem, - SelectChangeEvent, - Stack, - Typography, - LinearProgress, - linearProgressClasses, -} from '@mui/material'; -import { visuallyHidden } from '@mui/utils'; +import { Stack, Button, MenuItem, SelectChangeEvent, Tab, Tabs, Card, Box } from '@mui/material'; /* ---------------------------------- axios --------------------------------- */ -import axios from '@/utils/axios'; +// import axios from 'axios'; +import axios from '../../utils/axios'; +import { styled } from '@mui/material/styles'; /* ---------------------------------- react --------------------------------- */ import { useContext, useEffect, useState } from 'react'; + /* -------------------------------- component ------------------------------- */ -import Iconify from '@/components/Iconify'; -import BaseTablePagination from '@/components/BaseTablePagination'; +import Iconify from '../../components/Iconify'; +import TableComponent from '../../components/Table'; /* ---------------------------------- theme --------------------------------- */ -import palette from '@/theme/palette'; -import { useSearchParams } from 'react-router-dom'; -// import { UserCurrentCorporateContext } from '@/contexts/UserCurrentCorporate'; -import { fSplit } from '@/utils/formatNumber'; -import { Chip } from '@mui/material'; +import palette from '../../theme/palette'; +//import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate } from 'react-router-dom'; +import { fDate, fDateSuffix } from '../../utils/formatTime'; +import Typography from '@mui/material/Typography'; +import { format } from 'date-fns'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import SearchIcon from '@mui/icons-material/Search'; +import Label from '../../components/Label'; import { enqueueSnackbar } from 'notistack'; -import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; +import { LoadingButton, TabPanel } from "@mui/lab"; +import { LanguageContext } from '@/contexts/LanguageContext'; +import MuiDialog from '@/components/MuiDialog'; +import DialogMember from './DialogMember'; +import DialogFinalLog from './DialogFinalLog'; +import { fPostFormat } from '@/utils/formatTime'; +import TableListFinalLog from './TableListFinalLog'; -/* ---------------------------------- types --------------------------------- */ -type PaginationTableProps = { - current_page: number; - from: number; - last_page: number; - links: []; - path: string; - per_page: number; - to: number; - total: number; -}; - -type DataTableProps = { - fullName: string; - memberId: string; - division: string; - limit: { - current: number; - total: number; - percentage: number; - }; - status: string; -}; - -type Order = 'asc' | 'desc'; - -interface HeadCell { - id: string; - align: string; - label: string; - isSort: boolean; -} - -interface EnhancedTableProps { - onRequestSort: (event: React.MouseEvent, property: string) => void; - order: Order; - orderBy: string; -} - -type DivisionDataProps = { - id: number; - name: string; -}; -/* -------------------------------------------------------------------------- */ - -/* --------------------------------- styled --------------------------------- */ -const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ - height: 10, - borderRadius: 6, - [`&.${linearProgressClasses.colorPrimary}`]: { - backgroundColor: '#D1F1F1', - }, - [`& .${linearProgressClasses.bar}`]: { - borderRadius: 6, - backgroundColor: theme.palette.primary.main, - }, -})); -/* -------------------------------------------------------------------------- */ - -/* -------------------------- enchanced table head -------------------------- */ -const headCells: readonly HeadCell[] = [ - { - id: 'code', - align: 'left', - label: 'Request Code', - isSort: true, - }, - { - id: 'member.name', - align: 'center', - label: 'Member', - isSort: false, - }, - { - id: 'submission_date', - align: 'center', - label: 'Submission Date', - isSort: true, - }, - { - id: 'log_url', - align: 'right', - label: 'Download LOG', - isSort: false, - }, - { - id: 'status', - align: 'right', - label: 'Status', - isSort: false, - }, -]; - -function EnhancedTableHead({ order, orderBy, onRequestSort }: EnhancedTableProps) { - const createSortHandler = (property: string) => (event: React.MouseEvent) => { - onRequestSort(event, property); - }; - - return ( - - - {headCells.map((headCell) => ( - - {headCell.isSort ? ( - - {headCell.label} - {orderBy === headCell.id ? ( - - {order === 'desc' ? 'sorted descending' : 'sorted ascending'} - - ) : null} - - ) : ( - headCell.label - )} - - ))} - {''} - - - ); -} -/* -------------------------------------------------------------------------- */ - -// TODO Don't use emit -export default function TableList(props: any) { - const [dataTable, setDataTable] = useState([]); - const [paginationTable, setPaginationTable] = useState({ - current_page: 0, - from: 0, - last_page: 0, - links: [], - path: '', - per_page: 0, - to: 0, - total: 0, - }); - - const [isLoading, setIsLoading] = useState(true); - const [searchParams, setSearchParams] = useSearchParams(); - const [appliedParams, setAppliedParams] = useState({}); - - const [order, setOrder] = useState('asc'); - const [orderBy, setOrderBy] = useState('name'); - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(10); - - /* ------------------------------- handle sort ------------------------------ */ - const handleRequestSort = async (event: React.MouseEvent, property: string) => { - const isAsc = orderBy === property && order === 'asc'; - setOrder(isAsc ? 'desc' : 'asc'); - setOrderBy(property); - const params = Object.fromEntries([ - ...searchParams.entries(), - ['order', isAsc ? 'desc' : 'asc'], - ['orderBy', property], - ]); - setAppliedParams(params); - }; - /* -------------------------------------------------------------------------- */ - - /* ----------------------------- status field ----------------------------- */ - const [filterStatus, setFilterStatus] = useState('All'); - const [statusOptions, setStatusOptions] = useState(['All', 'Requested', 'Approved', 'Declined']); - - const handleStatusChange = (event: SelectChangeEvent) => { - setFilterStatus(event.target.value as string); - - if (event.target.value === 'All') { - searchParams.delete('status'); - const params = Object.fromEntries([...searchParams.entries()]); - setAppliedParams(params); - } else { - const params = Object.fromEntries([ - ...searchParams.entries(), - ['status', event.target.value.toLowerCase() as string], - ]); - setAppliedParams(params); - } - }; - /* -------------------------------------------------------------------------- */ - - /* ------------------------------ Search field ------------------------------ */ - const [searchText, setSearchText] = useState(''); - const [searchStatus, setSearchStatus] = useState('all'); - - const handleSearchSubmit = async (event: React.FormEvent) => { - event.preventDefault(); - setIsLoading(true); - - // Filter by Search Text - if (searchText === '') { - searchParams.delete('search'); - const params = Object.fromEntries([...searchParams.entries()]); - setAppliedParams(params); - } else { - const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); - setAppliedParams(params); - } - - await new Promise((resolve) => setTimeout(resolve, 500)); - setIsLoading(false); - }; - /* -------------------------------------------------------------------------- */ - - /* ------------------------ button change pagination ------------------------ */ - const onPageChangeHandle = async ( - event: React.MouseEvent | null, - newPage: number - ) => { - setIsLoading(true); - const params = Object.fromEntries([...searchParams.entries(), ['page', newPage + 1]]); - setPage(newPage); - await new Promise((resolve) => setTimeout(resolve, 500)); - setAppliedParams(params); - setIsLoading(false); - }; - /* -------------------------------------------------------------------------- */ - - /* --------------------------- row page per limit --------------------------- */ - const onRowsPerPageChangeHandle = async (event: React.ChangeEvent) => { - setIsLoading(true); - searchParams.delete('page'); - const params = Object.fromEntries([ - ...searchParams.entries(), - ['per_page', parseInt(event.target.value, 10)], - ]); - setRowsPerPage(parseInt(event.target.value, 10)); - await new Promise((resolve) => setTimeout(resolve, 500)); - setAppliedParams(params); - setIsLoading(false); - }; - /* -------------------------------------------------------------------------- */ +export default function TableList() { + const navigate = useNavigate(); + const { localeData }: any = useContext(LanguageContext); + const [currentTab, setCurrentTab] = useState('request_log'); useEffect(() => { - (async () => { - setIsLoading(true); + setCurrentTab('request_log') +}, []) - // const division = await axios.get(`${corporateValue}/division`); - // setDivisionData(division.data); +function handleChangeTab(event: React.SyntheticEvent, newValue: string) { + setCurrentTab(newValue) +} - const params = - Object.keys(appliedParams).length !== 0 - ? appliedParams - : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + //const { corporateValue } = useContext(UserCurrentCorporateContext); + //const { corporateValue } = useContext(null); - const response = await axios.get(`/claim-requests`, { - params: { ...params }, - }); + const [data, setData] = useState([]); - setSearchParams(params); - setDataTable(response.data.data.data); - setPaginationTable(response.data.data); - setRowsPerPage(response.data.data.per_page); - setIsLoading(false); - - // TODO Remove This - props.dataLoaded(response.data.data.data); - })(); - }, [appliedParams, searchParams, order, orderBy, setSearchParams]); - - // --------------------------------------------------------- - // Dialog Detail Claim - const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false); - const [loadingClaimDetail, setLoadingClaimDetail] = useState(true); - const [currentClaim, setCurrentClaim] = useState(null); - - function handleShowClaim(claimRequest) { - setLoadingClaimDetail(true); - setOpenDialogDetailClaim(true); - - axios.get(`/claim-requests/${claimRequest.id}`) - .then(({data}) => { - console.log(data.data); - setCurrentClaim(data.data); - setLoadingClaimDetail(false); - }) - .catch((err) => { - enqueueSnackbar(err.message, {variant: 'error'}) - }) - } - - // ----------------------------------------------------------------- // Download LOG - async function handleDownloadLog(claimRequest) { + async function handleDownloadLog(claimRequest:any) { return axios - .get(`claim-requests/${claimRequest.id}/log`, { + .get(`claim-requests/${claimRequest}/log`, { responseType: 'blob', }) .then((response) => { @@ -350,184 +65,436 @@ export default function TableList(props: any) { // setLoadingLog(false); // }) .catch((response) => { + console.log(response); enqueueSnackbar(response.message, { variant: 'error' }); // setLoadingLog(false); }); } + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('desc'); + const [orderBy, setOrderBy] = useState('submission_date'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: true, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* ------------------------------ handle filter ----------------------------- */ + const [statusValue, setStatusValue] = useState('all'); + const [filterData, setStatusData] = useState([]); + + // handle status + const handleStatusChanges = (event: SelectChangeEvent) => { + setStatusValue(event.target.value as string); + + if (event.target.value === 'all') { + searchParams.delete('status'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([ + ...searchParams.entries(), + ['status', event.target.value as string], + ]); + setAppliedParams(params); + } + }; + + const filterStatus = { + useFilter: true, + config: { + label: 'Status', + statusValue: statusValue, + filterData: filterData, + handleStatusChange: handleStatusChanges, + }, + }; + + // handle start date + const [startDateValue, setStartDateValue] = useState(''); + + const handleStartDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newStartDateValue = event.currentTarget.elements['date-input'].value; + setStartDateValue(newStartDateValue); + if (newStartDateValue === '') { + searchParams.delete('start_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['start_date', newStartDateValue]]); + setAppliedParams(params); + } + }; + + const filterStartDate = { + useFilter: true, + startDate: startDateValue, + setStartDate: setStartDateValue, + handleStartDateChange: handleStartDateChanges, + }; + + // handle end date + const [endDateValue, setEndDateValue] = useState(''); + + const handleEndDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newEndDateValue = event.currentTarget.elements['date-input'].value; + setEndDateValue(newEndDateValue); + if (newEndDateValue === '') { + searchParams.delete('end_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['end_date', newEndDateValue]]); + setAppliedParams(params); + } + }; + + const filterEndDate = { + useFilter: true, + endDate: endDateValue, + setEndDate: setEndDateValue, + handleEndDateChange: handleEndDateChanges, + }; + + /* -------------------------------- headCell Request LOG -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'code', + align: 'left', + label: localeData.txtRequestCode, + isSort: true, + }, + { + id: 'full_name', + align: 'left', + label: localeData.txtName, + isSort: true, + }, + { + id: 'submission_date', + align: 'center', + label: localeData.txtSubmissionDate, + isSort: true, + }, + { + id: 'status', + align: 'center', + label: localeData.txtStatus, + isSort: true, + }, + { + id: 'action', + align: 'right', + label: '', + isSort: false, + }, + ]; + + + function handleSearchMember(noPolis:any, birthDate:any) { + setLoadingClaim(false) + axios.post('/search-member', { + no_polis: noPolis, + birth_date: birthDate ? fPostFormat(birthDate, 'yyyy-MM-dd') : null, + type: 'view' + }) + .then((response) => { + setOpenDialogBenefit(true) + setCurrentMember(response.data.data) + setNameMember(response.data.data.members.name); + }) + .catch(({response}) => { + enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.meta.message : 'Opps, Something went Wrong!'), {variant : "error"}) + }) + .then(() => { + }); + } + + + + function handleRequestFinalLog(id:any, full_name:any, no_polis:any, submission_date:any) + { + setOpenDialogFinalLog(true); + const datas_view = { + 'id' : id, + 'full_name' : full_name, + 'no_polis' : no_polis, + 'submission_date' : submission_date + }; + setDataViewFinalDialog(datas_view); + } + + useEffect(() => { + getData(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams]); + + function getData() + { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`/get-request-log`, { + params: { ...parameters, type: 'request-log' }, + }); + setData( + response.data.data.map((obj: any) => ({ + ...obj, + status: + obj.status === 'requested' ? ( + + ) : obj.status === 'approved' ? ( + + ) : obj.status === 'declined' ? ( + + ) : obj.status === 'reviewed' ? ( + + ) : ( + + ), + submission_date: + + , + action: + + handleSearchMember(obj.no_polis, obj.birth_date) }> + + View + + {obj.status === 'approved' ? ( + handleDownloadLog(obj.claim_request_id)}> + + Download LOG + + ):''} + {obj.final_log === 0 ? ( + handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date) }> + + Request Final LOG + + ):''} + + } /> + })) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + const status:any = [ + {"id": "requested", "name": "Request" }, + {"id": "reviewed", "name": "Review" }, + {"id": "approved", "name": "Approval" }, + {"id": "declined", "name": "Decline" }, + ]; + setStatusData(status) + + setIsLoading(false); + })(); + } + + const RootNotificationStyle = styled(Card)(({ theme }) => ({ + boxShadow: 'none', + padding: '1rem 0.5rem', + color: 'black', + borderRadius: 0, + backgroundColor: theme.palette.grey[200], + // maxHeight: '240px', + })); + + function TabPanel(props:any) { + const { children, value, index, ...other } = props; + return ( + + ); + } + + // const [noPolis, setNoPolis] = useState('AW001-01'); + //const [birthDate, setBirthDate] = useState('1991-01-10'); + const [loadingBenefit, setLoadingBenefit] = useState(false); + const [loadingClaim, setLoadingClaim] = useState(false); + const [openDialogBenefit, setOpenDialogBenefit] = useState(false); + const [openDialogFinalLog, setOpenDialogFinalLog] = useState(false); + const [openDialogClaim, setOpenDialogClaim] = useState(false); + const [currentMember, setCurrentMember] = useState(null); + const [nameMember, setNameMember] = useState(''); + const [setIsRequestFinalLog, isRequestFinalLog] = useState(false); + const [dataViewFinalDialog, setDataViewFinalDialog] = useState(null); + return ( - - {/* Field 1 */} - - - - {/* - Division - - */} - - -
- - - setSearchText(event.target.value)} - value={searchText} - fullWidth - /> - - - - Status - - - - - -
-
-
-
- {/* End Field 1 */} - {/* Field 2 */} - - - - - - {isLoading ? ( - - - Loading . . . - - - ) : dataTable.length >= 1 ? ( - dataTable.map((row: DataTableProps, index) => ( - - {row.code} - {row.member?.full_name ?? ''} - {row.submission_date} - - {row.status == 'approved' ? ( - - ) : ( - Belum Tersedia - )} - - - - + + + + + + + + + + + + + setOpenDialogBenefit(false)) + } + maxWidth="sm" + /> - - { - handleShowClaim(row); - }} - > - - - - - )) - ) : ( - - - No Data Found - - - )} - -
-
- - {/* Pagination */} - { + console.log('Data returned:', data); + getData(); + setOpenDialogFinalLog(false); + }} + handleSubmitSuccess={() => { + }} /> -
- {/* End Field 2 */} -
- - - - - + } + maxWidth="sm" + />
); } diff --git a/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx b/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx new file mode 100644 index 00000000..06dc44d8 --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx @@ -0,0 +1,441 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { Stack, Button, MenuItem, SelectChangeEvent, Tab, Tabs, Card, Box } from '@mui/material'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +import { styled } from '@mui/material/styles'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import TableComponent from '../../components/Table'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +//import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate } from 'react-router-dom'; +import { fDate, fDateSuffix } from '../../utils/formatTime'; +import Typography from '@mui/material/Typography'; +import { format } from 'date-fns'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import SearchIcon from '@mui/icons-material/Search'; +import Label from '../../components/Label'; +import { enqueueSnackbar } from 'notistack'; +import { LoadingButton, TabPanel } from "@mui/lab"; +import { LanguageContext } from '@/contexts/LanguageContext'; +import MuiDialog from '@/components/MuiDialog'; +import DialogMember from './DialogMember'; +import DialogClaimSubmit from './DialogClaimSubmit'; +import { fPostFormat } from '@/utils/formatTime'; + +export default function TableListFinalLog() { + const navigate = useNavigate(); + const { localeData }: any = useContext(LanguageContext); + + const [data, setData] = useState([]); + + // Download LOG + async function handleDownloadLog(claimRequest:any) { + return axios + .get(`claim-requests/${claimRequest}/log`, { + responseType: 'blob', + }) + .then((response) => { + window.open(URL.createObjectURL(response.data)); + // setLoadingLog(false); + }) + // .then((blobFile) => { + // new File([blobFile], 'asdads.pdf', { type: blobFile.type }) + // setLoadingLog(false); + // }) + .catch((response) => { + console.log(response); + enqueueSnackbar(response.message, { variant: 'error' }); + // setLoadingLog(false); + }); + } + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('desc'); + const [orderBy, setOrderBy] = useState('submission_date'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: true, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* ------------------------------ handle filter ----------------------------- */ + const [statusValue, setStatusValue] = useState('all'); + const [filterData, setStatusData] = useState([]); + + // handle status + const handleStatusChanges = (event: SelectChangeEvent) => { + setStatusValue(event.target.value as string); + + if (event.target.value === 'all') { + searchParams.delete('status'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([ + ...searchParams.entries(), + ['status', event.target.value as string], + ]); + setAppliedParams(params); + } + }; + + const filterStatus = { + useFilter: true, + config: { + label: 'Status', + statusValue: statusValue, + filterData: filterData, + handleStatusChange: handleStatusChanges, + }, + }; + + // handle start date + const [startDateValue, setStartDateValue] = useState(''); + + const handleStartDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newStartDateValue = event.currentTarget.elements['date-input'].value; + setStartDateValue(newStartDateValue); + if (newStartDateValue === '') { + searchParams.delete('start_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['start_date', newStartDateValue]]); + setAppliedParams(params); + } + }; + + const filterStartDate = { + useFilter: true, + startDate: startDateValue, + setStartDate: setStartDateValue, + handleStartDateChange: handleStartDateChanges, + }; + + // handle end date + const [endDateValue, setEndDateValue] = useState(''); + + const handleEndDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newEndDateValue = event.currentTarget.elements['date-input'].value; + setEndDateValue(newEndDateValue); + if (newEndDateValue === '') { + searchParams.delete('end_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['end_date', newEndDateValue]]); + setAppliedParams(params); + } + }; + + const filterEndDate = { + useFilter: true, + endDate: endDateValue, + setEndDate: setEndDateValue, + handleEndDateChange: handleEndDateChanges, + }; + + /* -------------------------------- headCell Final LOG -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'code', + align: 'left', + label: localeData.txtRequestCode, + isSort: true, + }, + { + id: 'full_name', + align: 'left', + label: localeData.txtName, + isSort: true, + }, + { + id: 'submission_date', + align: 'center', + label: localeData.txtSubmissionDate, + isSort: true, + }, + { + id: 'service_type', + align: 'center', + label: localeData.txtServiceType, + isSort: true, + }, + { + id: 'status', + align: 'center', + label: localeData.txtStatus, + isSort: true, + }, + { + id: 'action', + align: 'right', + label: '', + isSort: false, + }, + ]; + function handleSearchMember(noPolis:any, birthDate:any) { + setLoadingClaim(false) + axios.post('/search-member', { + no_polis: noPolis, + birth_date: birthDate ? fPostFormat(birthDate, 'yyyy-MM-dd') : null, + type: 'view' + }) + .then((response) => { + setOpenDialogBenefit(true) + setCurrentMember(response.data.data) + setNameMember(response.data.data.members.name); + }) + .catch(({response}) => { + enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.meta.message : 'Opps, Something went Wrong!'), {variant : "error"}) + }) + .then(() => { + }); + } + const [openDialogClaimSubmit, setOpenDialogClaimSubmit] = useState(false); + const [dataViewClaimSubmit, setDataViewClaimSubmit] = useState(null); + function handleRequestClaimSubmit(member_id:any, service_code:any, id:any, full_name:any, no_polis:any, submission_date:any) + { + setOpenDialogClaimSubmit(true); + const datas_view = { + 'member_id' : member_id, + 'service_code' : service_code, + 'id' : id, + 'full_name' : full_name, + 'no_polis' : no_polis, + 'submission_date' : submission_date + }; + setDataViewClaimSubmit(datas_view); + } + + useEffect(() => { + getData(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams]); + + function getData() + { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`/get-final-log`, { + params: { ...parameters, type: 'final-log' }, + }); + setData( + response.data.data.map((obj: any) => ({ + ...obj, + status: + obj.status === 'requested' ? ( + + ) : obj.status === 'approved' ? ( + + ) : obj.status === 'declined' ? ( + + ) : obj.status === 'reviewed' ? ( + + ) : ( + + ), + submission_date: + + , + action: + + handleSearchMember(obj.no_polis, obj.birth_date) }> + + View + + {obj.status === 'approved' ? ( + handleDownloadLog(obj.claim_request_id)}> + + Download LOG + + ):''} + {!obj.check_claim ? ( + handleRequestClaimSubmit(obj.member_id, obj.service_code, obj.id, obj.full_name, obj.no_polis, obj.submission_date) }> + + Submit Claim + + ):''} + + } /> + })) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + const status:any = [ + {"id": "requested", "name": "Request" }, + {"id": "reviewed", "name": "Review" }, + {"id": "approved", "name": "Approval" }, + {"id": "declined", "name": "Decline" }, + ]; + setStatusData(status) + + setIsLoading(false); + })(); + } + + const [loadingClaim, setLoadingClaim] = useState(false); + const [openDialogBenefit, setOpenDialogBenefit] = useState(false); + const [currentMember, setCurrentMember] = useState(null); + const [nameMember, setNameMember] = useState(''); + + return ( + <> + + setOpenDialogBenefit(false)) + } + maxWidth="sm" + /> + { + console.log('Data returned:', data); + getData(); + setOpenDialogClaimSubmit(false); + }} + handleSubmitSuccess={() => { + }} + /> + } + maxWidth="sm" + /> + + ); +} \ No newline at end of file diff --git a/frontend/hospital-portal/src/sections/dashboard/TableListReqLog.tsx b/frontend/hospital-portal/src/sections/dashboard/TableListReqLog.tsx new file mode 100644 index 00000000..1e5b224f --- /dev/null +++ b/frontend/hospital-portal/src/sections/dashboard/TableListReqLog.tsx @@ -0,0 +1,425 @@ +/* ---------------------------------- @mui ---------------------------------- */ +import { Stack, Button, MenuItem, SelectChangeEvent, Tab, Tabs, Card, Box } from '@mui/material'; +/* ---------------------------------- axios --------------------------------- */ +// import axios from 'axios'; +import axios from '../../utils/axios'; +import { styled } from '@mui/material/styles'; +/* ---------------------------------- react --------------------------------- */ +import { useContext, useEffect, useState } from 'react'; + +/* -------------------------------- component ------------------------------- */ +import Iconify from '../../components/Iconify'; +import TableComponent from '../../components/Table'; +/* ---------------------------------- theme --------------------------------- */ +import palette from '../../theme/palette'; +//import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; +import { useSearchParams, useNavigate } from 'react-router-dom'; +import { fDate, fDateSuffix } from '../../utils/formatTime'; +import Typography from '@mui/material/Typography'; +import { format } from 'date-fns'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import SearchIcon from '@mui/icons-material/Search'; +import Label from '../../components/Label'; +import { enqueueSnackbar } from 'notistack'; +import { LoadingButton, TabPanel } from "@mui/lab"; +import { LanguageContext } from '@/contexts/LanguageContext'; + +export default function TableList() { + const navigate = useNavigate(); + const { localeData }: any = useContext(LanguageContext); + const [currentTab, setCurrentTab] = useState('request_log'); + + useEffect(() => { + setCurrentTab('request_log') +}, []) + +function handleChangeTab(event: React.SyntheticEvent, newValue: string) { + setCurrentTab(newValue) +} + + //const { corporateValue } = useContext(UserCurrentCorporateContext); + //const { corporateValue } = useContext(null); + + const [data, setData] = useState([]); + + // Download LOG + async function handleDownloadLog(claimRequest) { + return axios + .get(`claim-requests/${claimRequest}/log`, { + responseType: 'blob', + }) + .then((response) => { + window.open(URL.createObjectURL(response.data)); + // setLoadingLog(false); + }) + // .then((blobFile) => { + // new File([blobFile], 'asdads.pdf', { type: blobFile.type }) + // setLoadingLog(false); + // }) + .catch((response) => { + console.log(response); + enqueueSnackbar(response.message, { variant: 'error' }); + // setLoadingLog(false); + }); + } + + /* -------------------------------------------------------------------------- */ + /* setting up for the table */ + /* -------------------------------------------------------------------------- */ + const [isLoading, setIsLoading] = useState(true); + + const loadings = { + isLoading: isLoading, + setIsLoading: setIsLoading, + }; + + /* ------------------------------ handle params ----------------------------- */ + const [searchParams, setSearchParams] = useSearchParams(); + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('desc'); + const [orderBy, setOrderBy] = useState('submission_date'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + /* -------------------------------------------------------------------------- */ + + /* ---------------------------- handle pagination --------------------------- */ + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + const [paginationTable, setPaginationTable] = useState({ + current_page: 0, + from: 0, + last_page: 0, + links: [], + path: '', + per_page: 0, + to: 0, + total: 0, + }); + + const paginations = { + page: page, + setPage: setPage, + rowsPerPage: rowsPerPage, + setRowsPerPage: setRowsPerPage, + paginationTable: paginationTable, + setPaginationTable: setPaginationTable, + }; + + /* -------------------------------------------------------------------------- */ + + /* ------------------------------ handle search ----------------------------- */ + const [searchText, setSearchText] = useState(''); + + const handleSearchSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (searchText === '') { + searchParams.delete('search'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['search', searchText]]); + setAppliedParams(params); + } + }; + + const searchs = { + useSearchs: true, + searchText: searchText, + setSearchText: setSearchText, + handleSearchSubmit: handleSearchSubmit, + }; + + /* ------------------------------ handle filter ----------------------------- */ + const [statusValue, setStatusValue] = useState('all'); + const [filterData, setStatusData] = useState([]); + + // handle status + const handleStatusChanges = (event: SelectChangeEvent) => { + setStatusValue(event.target.value as string); + + if (event.target.value === 'all') { + searchParams.delete('status'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([ + ...searchParams.entries(), + ['status', event.target.value as string], + ]); + setAppliedParams(params); + } + }; + + const filterStatus = { + useFilter: true, + config: { + label: 'Status', + statusValue: statusValue, + filterData: filterData, + handleStatusChange: handleStatusChanges, + }, + }; + + // handle start date + const [startDateValue, setStartDateValue] = useState(''); + + const handleStartDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newStartDateValue = event.currentTarget.elements['date-input'].value; + setStartDateValue(newStartDateValue); + if (newStartDateValue === '') { + searchParams.delete('start_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['start_date', newStartDateValue]]); + setAppliedParams(params); + } + }; + + const filterStartDate = { + useFilter: true, + startDate: startDateValue, + setStartDate: setStartDateValue, + handleStartDateChange: handleStartDateChanges, + }; + + // handle end date + const [endDateValue, setEndDateValue] = useState(''); + + const handleEndDateChanges = async (event: React.FormEvent) => { + event.preventDefault(); + const newEndDateValue = event.currentTarget.elements['date-input'].value; + setEndDateValue(newEndDateValue); + if (newEndDateValue === '') { + searchParams.delete('end_date'); + const params = Object.fromEntries([...searchParams.entries()]); + setAppliedParams(params); + } else { + const params = Object.fromEntries([...searchParams.entries(), ['end_date', newEndDateValue]]); + setAppliedParams(params); + } + }; + + const filterEndDate = { + useFilter: true, + endDate: endDateValue, + setEndDate: setEndDateValue, + handleEndDateChange: handleEndDateChanges, + }; + + /* -------------------------------- headCell -------------------------------- */ + const headCells: HeadCell[] = [ + { + id: 'submission_date', + align: 'center', + label: localeData.txtRequestDate, + isSort: true, + }, + { + id: 'member_id', + align: 'left', + label: localeData.txtMemberID, + isSort: true, + }, + { + id: 'code', + align: 'left', + label: localeData.txtClaimCode, + isSort: true, + }, + { + id: 'full_name', + align: 'left', + label: localeData.txtName, + isSort: true, + }, + { + id: 'status', + align: 'center', + label: localeData.txtStatus, + isSort: true, + }, + { + id: 'action', + align: 'right', + label: '', + isSort: false, + }, + ]; + + useEffect(() => { + (async () => { + setIsLoading(true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + const parameters = + Object.keys(appliedParams).length !== 0 + ? appliedParams + : Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]); + + const response = await axios.get(`/get-claim-requests`, { + params: { ...parameters, type: 'claim-request' }, + }); + + setData( + response.data.data.map((obj: any) => ({ + ...obj, + status: + obj.status === 'requested' ? ( + + ) : obj.status === 'approved' ? ( + + ) : obj.status === 'declined' ? ( + + ) : obj.status === 'reviewed' ? ( + + ) : ( + + ), + submission_date: + + , + action: + + navigate ('/detail/'+obj.claim_request_id)}> + + View + + handleDownloadLog(obj.claim_request_id)}> + + Download LOG + + + } /> + })) + ); + + setPaginationTable(response.data); + setRowsPerPage(response.data.per_page); + + if (searchParams.get('page')) { + //@ts-ignore + const currentPage = parseInt(searchParams.get('page')) - 1; + + paginationTable.current_page = currentPage; + setPage(currentPage); + } + + const status = [ + {"id": "requested", "name": "Request" }, + {"id": "reviewed", "name": "Review" }, + {"id": "approved", "name": "Approval" }, + {"id": "declined", "name": "Decline" }, + ] + setStatusData(status) + + setIsLoading(false); + })(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams]); + + const RootNotificationStyle = styled(Card)(({ theme }) => ({ + boxShadow: 'none', + padding: '1rem 0.5rem', + color: 'black', + borderRadius: 0, + backgroundColor: theme.palette.grey[200], + // maxHeight: '240px', + })); + + function TabPanel(props:any) { + const { children, value, index, ...other } = props; + return ( + + ); + } + + return ( + + + + + + + + + + + + + + + ); +} diff --git a/frontend/hospital-portal/src/utils/formatTime.ts b/frontend/hospital-portal/src/utils/formatTime.ts index b2656c01..ed88dcae 100644 --- a/frontend/hospital-portal/src/utils/formatTime.ts +++ b/frontend/hospital-portal/src/utils/formatTime.ts @@ -1,13 +1,14 @@ -import { format, getTime, formatDistanceToNow } from 'date-fns'; +import { format, parseISO, getTime, setHours, setMinutes, formatDistanceToNow } from 'date-fns'; // ---------------------------------------------------------------------- -export function fDate(date: Date | string | number, dateFormat = 'dd MMMM yyyy' ) { - return format(new Date(date), dateFormat); +export function fDate(date: Date | string | number) { + //console.log(date); + return format(new Date(date), 'dd MMMM yyyy'); } export function fDateTime(date: Date | string | number) { - return format(new Date(date), 'dd MMM yyyy p'); + return format(new Date(date), 'dd MMM yyyy hh:mm'); } export function fTimestamp(date: Date | string | number) { @@ -18,13 +19,30 @@ export function fDateTimeSuffix(date: Date | string | number) { return format(new Date(date), 'dd/MM/yyyy hh:mm p'); } + +export function fDateSuffix(date: Date | string | number) { + return format(new Date(date), 'dd MMM yyyy'); +} + export function fToNow(date: Date | string | number) { return formatDistanceToNow(new Date(date), { - addSuffix: true + addSuffix: true, }); } - -export function fPostFormat(date: Date | string | number, dateFormat = 'yyyy-MM-dd HH:mm:ss' ) { +export function fPostFormat(date: Date | string | number, dateFormat = 'yyyy-MM-dd HH:mm:ss') { return format(new Date(date), dateFormat); } + +// export function fDateString(date) { +// const dateObj = parseISO(date); +// const formattedDate = format(dateObj, 'dd MMMM yyyy'); +// return formattedDate; +// } + +// export function fFormattedDateString(date : String) { +// console.log(date); +// const datePart = date.split(' ')[0]; // Memisahkan bagian tanggal +// const formattedDate = fDateString(datePart); // Menggunakan fungsi sebelumnya untuk memformat tanggal +// return formattedDate; +// } diff --git a/lang/en/validation.php b/lang/en/validation.php index 724b5ace..d4189f0c 100644 --- a/lang/en/validation.php +++ b/lang/en/validation.php @@ -164,6 +164,10 @@ return [ | */ - 'attributes' => [], + 'attributes' => [ + "MORE_THAN" => ":date_param (:date) must be greater than :date_param2 date (:start)", + "LESS_THAN" => ":date_param (:date) must be less than :date_param2 date (:end)", + + ], ]; diff --git a/public/files/Benefit Usage Report.xlsx b/public/files/Benefit Usage Report.xlsx new file mode 100644 index 00000000..50ec0245 Binary files /dev/null and b/public/files/Benefit Usage Report.xlsx differ diff --git a/public/files/Corporate Exclusion Import.xlsx b/public/files/Corporate Exclusion Import.xlsx index eb8cf18d..0bc75550 100644 Binary files a/public/files/Corporate Exclusion Import.xlsx and b/public/files/Corporate Exclusion Import.xlsx differ diff --git a/public/files/Corporate Plan & Benefit Import.xlsx b/public/files/Corporate Plan & Benefit Import.xlsx index 5d092aed..81f81f7b 100644 Binary files a/public/files/Corporate Plan & Benefit Import.xlsx and b/public/files/Corporate Plan & Benefit Import.xlsx differ diff --git a/public/files/Data Request LOG.xlsx b/public/files/Data Request LOG.xlsx new file mode 100644 index 00000000..c099f7e8 Binary files /dev/null and b/public/files/Data Request LOG.xlsx differ diff --git a/public/files/Template - Drugs.xlsx b/public/files/Template - Drugs.xlsx new file mode 100644 index 00000000..8e320c7f Binary files /dev/null and b/public/files/Template - Drugs.xlsx differ diff --git a/public/files/Template - Formularium - Corporate.xlsx b/public/files/Template - Formularium - Corporate.xlsx new file mode 100644 index 00000000..892bb0a1 Binary files /dev/null and b/public/files/Template - Formularium - Corporate.xlsx differ diff --git a/public/files/Template - Formularium.xlsx b/public/files/Template - Formularium.xlsx new file mode 100644 index 00000000..e672809e Binary files /dev/null and b/public/files/Template - Formularium.xlsx differ diff --git a/public/files/Template - Hospitals.xlsx b/public/files/Template - Hospitals.xlsx new file mode 100644 index 00000000..50861505 Binary files /dev/null and b/public/files/Template - Hospitals.xlsx differ diff --git a/public/files/Template - ICD.xlsx b/public/files/Template - ICD.xlsx new file mode 100644 index 00000000..90071410 Binary files /dev/null and b/public/files/Template - ICD.xlsx differ diff --git a/public/files/Template Format Claim.xlsx b/public/files/Template Format Claim.xlsx new file mode 100644 index 00000000..a332f956 Binary files /dev/null and b/public/files/Template Format Claim.xlsx differ diff --git a/public/files/Template Update Status Request LOG.xlsx b/public/files/Template Update Status Request LOG.xlsx new file mode 100644 index 00000000..7a1957bd Binary files /dev/null and b/public/files/Template Update Status Request LOG.xlsx differ diff --git a/public/files/TemplateFormulariumList.xlsx b/public/files/TemplateFormulariumList.xlsx new file mode 100644 index 00000000..65cec25b Binary files /dev/null and b/public/files/TemplateFormulariumList.xlsx differ diff --git a/public/files/TemplateICDList.xlsx b/public/files/TemplateICDList.xlsx new file mode 100644 index 00000000..19924a9d Binary files /dev/null and b/public/files/TemplateICDList.xlsx differ diff --git a/resources/lang/en/Message.php b/resources/lang/en/Message.php index b94896ea..d0167b2b 100644 --- a/resources/lang/en/Message.php +++ b/resources/lang/en/Message.php @@ -4,5 +4,7 @@ return [ 'success' => 'Request has been successfully processed.', 'server_error' => 'Internal server error.', 'not_found' => 'Data not found', - 'password' => 'Password wrong. Please try again.' + 'password' => 'Password wrong. Please try again.', + 'read_notification' => 'Notification has been read.', + 'already_exists' => 'Data already exists.', ]; diff --git a/resources/lang/id/Message.php b/resources/lang/id/Message.php index 18c0f99f..475a5731 100644 --- a/resources/lang/id/Message.php +++ b/resources/lang/id/Message.php @@ -4,5 +4,7 @@ return [ 'success' => 'Request berhasil dilakukan.', 'server_error' => 'Internal server error.', 'not_found' => 'Data tidak ditemukan.', - 'password' => 'Password salah. Silakan coba lagi.' + 'password' => 'Password salah. Silakan coba lagi.', + 'read_notification' => 'Notifikasi telah dibaca.', + 'already_exists' => 'Data sudah ada.', ]; diff --git a/resources/views/email/notif_email.blade.php b/resources/views/email/notif_email.blade.php new file mode 100644 index 00000000..db698f16 --- /dev/null +++ b/resources/views/email/notif_email.blade.php @@ -0,0 +1,160 @@ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/resources/views/pdf/final_log.blade.php b/resources/views/pdf/final_log.blade.php index 6abfc19e..c5e88222 100644 --- a/resources/views/pdf/final_log.blade.php +++ b/resources/views/pdf/final_log.blade.php @@ -6,7 +6,7 @@ use App\Helpers\Helper; - Surat Jaminan Akhir - {{ $claim->code }} + Surat Jaminan Akhir - {{ 1 }} {{-- --}} @@ -104,143 +104,200 @@ use App\Helpers\Helper; - + + + - - + + + - - + + - - + + - - + + - - + + - - + +
SURAT JAMINAN AKHIR
SURAT JAMINAN AKHIR
Kepada: {{ $hospital->name }} + Kepada + : + {{ $hospital->name ?? '' }}GOP Tanggal: {{ $claim->created_at->format('d-M-y, H:i') }} + GOP Tanggal + : + {{ $claim->created_at ? (new DateTime($claim->created_at))->format('d-M-Y, H:i') : '' }}
Alamat: {{ $hospital->currentAddress->text ?? '' }} + Alamat + : + {{ $hospital->address ?? '' }}GOP Nomor: {{ $claim->code }} + GOP Nomor + : + {{ $claim->code ?? '' }}
No Telpon / Fax: + No Telpon / Fax + : +
Email: + Email + : +
-

Dengan ini jaminan diberikan kepada pasien yang juga meruopakan tertanggung/peserta yang diasuransikan "Pasien" dengan data sebagai berikut

+

Dengan ini jaminan diberikan kepada pasien yang juga merupakan tertanggung/peserta yang diasuransikan "Pasien" dengan data sebagai berikut

- - + + - - + + - - + + - - + + - - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + @@ -253,7 +310,7 @@ use App\Helpers\Helper;
A. Identitas Pasien
1. Nama Pasien: {{ $member->full_name }} + 1. Nama Pasien + : + {{ $member->name ?? '' }}7. Hak Kelas Kamar: {{ $inpatienBenefit->room_class_coverage ?? '' }} + 7. Hak Kelas Kamar + : + {{ $member->room_class_coverage ?? '' }}
2. Tanggal Lahir: {{ $member->birth_date ?? '' }} + 2. Tanggal Lahir + : + {{ $member->birth_date ? (new DateTime($member->birth_date))->format('d-M-Y') : '' }}8. Hak Kamar ICU: + 8. Hak Kamar ICU + : +
3. Jenis Kelamin: {{ ($member->gender ? + + 3. Jenis Kelamin + : + {{ ($member->gender ? ($member->gender == 'female' ? 'Perempuan' : ($member->gender == 'male' ? 'Laki-Laki' : $member->gender) ) : '') }}9. No Polis: {{ $member->currentPolicy?->code ?? '' }} + 9. No Polis + : + {{ $member->payor_id ?? '' }}
4. Nomor e-KTP: {{ $member->nric }} + 4. Nomor e-KTP + : + {{ $member->nric ?? ''}}10. Nama PH / Perusahaan: {{ $member->currentCorporate?->name ?? '' }} + 10. Nama PH / Perusahaan + : + {{ $member->corporate_name ?? '' }}
5. Manfaat: {{ $claim->claimRequest?->service?->name ?? '' }} + 5. Manfaat + : + {{ $member->services ?? '' }}11. Periode Polis: {{ $member->currentPolicy ? \Carbon\Carbon::parse($member->currentPolicy->end)->format('d-M-Y') : '' }} + 11. Periode Polis + : + {{ $member->periode_policy ? (new DateTime($member->periode_policy))->format('d-M-Y') : '' }}
6. Status Polis: {{ $member->currentPolicy?->status ?? '' }} + 6. Status Polis + : + {{ $member->status_policy == 'active' ? 'Aktif' : 'Tidak Aktif' }}12. Mata Uang: {{ $member->currency ?? 'IDR' }} + 12. Mata Uang + : + IDR
B. Informasi Perawatan
1. Tanggal Masuk: {{ $claim->finalEncounter->start ?? "" }}: {{ 1 }} 7. Lama Perawatan: {{ $claim->finalEncounter->duration_day ?? "" }}: {{ 1 }}
2. Tanggal Keluar: {{ $claim->finalEncounter->end }}: {{ 1 }} 8. Kamar Perawatan : {{ "" }}
3. Nama Rumah Sakit: {{ $hospital->name }}: {{ 1 }} 9. Jumlah Tempat Tidur: {{ $claim->finalEncounter->number_of_bed }}: {{ 1 }}
4. Dokter yang Merawat: {{ $claim->finalEncounter->doctors->first()->person->name ?? '' }}: {{ 1 }} 10. Estimasi Biaya Rawat Inap: {{ $claim->total_tagihan ? Helper::currencyIdrFormat($claim->total_tagihan) : "" }}: {{ 1 }}
5. No. Rekam Medis: {{ $claim->finalEncounter->meta->MEDRECID }}: {{ 1 }} 11. Diagnosa: {{ $claim->diagnosis?->icd?->code ?? '' }}/{{ $claim->diagnosis?->icd?->name ?? '' }}: {{ 1 }}
C. Nilai Jaminan
- +
- @foreach ($claim->items as $item) + @foreach ($benefit as $item) - - - - + + + + @endforeach
Manfaat Polis Biaya Diajukan Biaya Dijamin Biaya Tidak Dijamin
{{ $item->claim_itemable->description }}{{ Helper::currencyIdrFormat($item->nominal_ditagihkan)}}{{ Helper::currencyIdrFormat($item->nominal_dicover) }}{{ Helper::currencyIdrFormat($item->nominal_ditagihkan - $item->nominal_dicover) }}{{ $item->description }}{{ Helper::currencyIdrFormat($item->biaya_diajukan)}}{{ Helper::currencyIdrFormat($item->biaya_disetujui) }}{{ Helper::currencyIdrFormat($item->biaya_tidak_disetujui) }}

Tidak Dijamin : Full Cover

-

* Bila pasien menempati kamar perawatan di atas manfaat yang imiliki maka pasien wajib membayar selisih yang timbul dan biaya yang tidak dijamin setelah menjalani perawatan Rumah Sakit

+

* Bila pasien menempati kamar perawatan di atas manfaat yang dimiliki maka pasien wajib membayar selisih yang timbul dan biaya yang tidak dijamin setelah menjalani perawatan Rumah Sakit

- Hormat Kami + Hormat Kami


@@ -277,7 +334,7 @@ use App\Helpers\Helper;


- ({{ $member->full_name }}) + ({{ 1 }})
diff --git a/resources/views/pdf/guaranted_leter.blade.php b/resources/views/pdf/guaranted_leter.blade.php index 324614f5..8738d901 100644 --- a/resources/views/pdf/guaranted_leter.blade.php +++ b/resources/views/pdf/guaranted_leter.blade.php @@ -123,8 +123,8 @@
Date of Admission
- @if (isset($claimRequest)) -
{{ !empty($claimRequest->submission_date) ? \Carbon\Carbon::parse($claimRequest->submission_date)->format('d/m/Y') : now()->format('d/m/Y') }}
+ @if (isset($requestLog)) +
{{ !empty($requestLog->submission_date) ? \Carbon\Carbon::parse($requestLog->submission_date)->format('d/m/Y') : now()->format('d/m/Y') }}
@else
{{ $dateOfAdmission->format('d/m/Y') }}
@endif @@ -140,7 +140,7 @@ - + @@ -148,18 +148,34 @@ --}} + @if ($member->currentPlan) + @foreach ($member->currentPlan->corporateBenefits as $corporateBenefit) + + + + + + @endforeach + @endif +
Detail BenefitLimit
Medical Check Up As Charged
{{ @$corporateBenefit->benefit->description ?? '' }}
+
- @foreach ($member->currentPlan->corporateBenefits as $corporateBenefit) - - - {{ @$corporateBenefit->benefit->description ?? '' }} - @if($corporateBenefit->limit_amount == 999999999) - As Charged - @else - IDR {{ number_format($corporateBenefit->limit_amount, 0, ',', '.') ?? '' }} - @endif - - @endforeach +
+ + + + + + + @if ($member->currentPlan) + @foreach ($member->currentPlan->corporateBenefits as $corporateBenefit) + + + + + + @endforeach + @endif
Term on Condition
{{ @$corporateBenefit->benefit->description ?? '' }}
diff --git a/storage/.DS_Store b/storage/.DS_Store old mode 100644 new mode 100755 diff --git a/storage/app/.gitignore b/storage/app/.gitignore old mode 100644 new mode 100755 diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore old mode 100644 new mode 100755 diff --git a/storage/debugbar/.gitignore b/storage/debugbar/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore old mode 100644 new mode 100755 diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore old mode 100644 new mode 100755