All files / react-app/src/features/package/admin-changes index.tsx

88.23% Statements 15/17
83.33% Branches 15/18
100% Functions 5/5
86.66% Lines 13/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127                                                                                                            4x 12x 12x   4x 2x   2x     2x   2x   2x           2x                                               4x 19x   3x                                                  
import { useMemo } from "react";
import { opensearch } from "shared-types";
import { ItemResult } from "shared-types/opensearch/changelog";
import { formatDateToET } from "shared-utils";
 
import {
  Accordion,
  AccordionContent,
  AccordionItem,
  AccordionTrigger,
  DetailsSection,
} from "@/components";
import { BLANK_VALUE } from "@/consts";
 
type AdminChangeProps = {
  adminActivity: opensearch.changelog.Document;
};
 
const AC_WithdrawEnabled = ({ adminActivity }: AdminChangeProps) => (
  <div className="flex flex-col gap-2">
    <p className="font-bold">Change made</p>
    <p>
      {adminActivity.submitterName} has enabled State package action to withdraw formal RAI response
    </p>
  </div>
);
 
const AC_WithdrawDisabled = ({ adminActivity }: AdminChangeProps) => (
  <div className="flex flex-col gap-2">
    <p className="font-bold">Change made</p>
    <p>
      {adminActivity.submitterName} has disabled State package action to withdraw formal RAI
      response
    </p>
  </div>
);
 
const AC_LegacyAdminChange = ({ adminActivity }: AdminChangeProps) => (
  <div className="flex flex-col gap-6">
    <div>
      <h2 className="font-bold text-lg mb-2">Change Made</h2>
      <p>{adminActivity.changeMade || "No information submitted"}</p>
    </div>
    {adminActivity.changeReason && (
      <div>
        <h2 className="font-bold text-lg mb-2">Change Reason</h2>
        <p>{adminActivity.changeReason}</p>
      </div>
    )}
  </div>
);
 
const AC_Update = () => <p>Coming Soon</p>;
 
export const AdminChange = ({ adminActivity }: AdminChangeProps) => {
  const [label, Content] = useMemo(() => {
    switch (adminActivity.event) {
      case "toggle-withdraw-rai": {
        if (adminActivity.raiWithdrawEnabled) {
          return ["Enable Formal RAI Response Withdraw", AC_WithdrawEnabled];
        }
        return ["Disable Formal RAI Response Withdraw", AC_WithdrawDisabled];
      }
      case "NOSO":
        return [adminActivity.changeType || "Package Added", AC_LegacyAdminChange];
      case "legacy-admin-change":
        return [adminActivity.changeType || "Manual Update", AC_LegacyAdminChange];
      case "split-spa":
        return ["Package Added", AC_LegacyAdminChange];
      case "update-id":
        return ["Manual Update", AC_LegacyAdminChange];
      case "update-values":
        return ["Manual Update", AC_LegacyAdminChange];
      default:
        return [BLANK_VALUE, AC_Update];
    }
  }, [adminActivity.event, adminActivity.changeType, adminActivity.raiWithdrawEnabled]);
 
  return (
    <AccordionItem value={adminActivity.id}>
      <AccordionTrigger className="bg-gray-100 px-3">
        <p className="flex flex-row gap-2 text-gray-600">
          <strong>{label as string}</strong>
          {" - "}
          {formatDateToET(adminActivity.timestamp)}
        </p>
      </AccordionTrigger>
      <AccordionContent className="p-4">
        <Content adminActivity={adminActivity} />
      </AccordionContent>
    </AccordionItem>
  );
};
 
type AdminChangesProps = {
  changelog: ItemResult[];
};
 
export const AdminPackageActivities = ({ changelog }: AdminChangesProps) => {
  const adminChangelog = changelog.filter((item) => item._source.isAdminChange);
 
  if (adminChangelog.length === 0) return null;
 
  return (
    <DetailsSection
      id="administrative_package_changes"
      title={`Administrative Package Changes (${adminChangelog.length})`}
      description="Administrative changes reflect updates to specific data fields. If you have additional questions, please contact the assigned CPOC."
    >
      <Accordion
        // There is a cached value (defaultValue) below
        // If you ever want to get around the cached value so
        // that is re-renders simply use a unique key that will
        // change when you need it to re-render
        key={adminChangelog[0]._source.id}
        type="multiple"
        defaultValue={[adminChangelog[0]._source.id]}
        className="flex flex-col gap-2"
      >
        {adminChangelog.map(({ _source: adminActivity }) => {
          return <AdminChange key={adminActivity.id} adminActivity={adminActivity} />;
        })}
      </Accordion>
    </DetailsSection>
  );
};