diff --git a/plugins/treeShakeCareIcons.mts b/plugins/treeShakeCareIcons.mts
new file mode 100644
index 00000000000..bf1713a0625
--- /dev/null
+++ b/plugins/treeShakeCareIcons.mts
@@ -0,0 +1,94 @@
+import { Plugin } from "vite";
+import * as fs from "fs";
+import * as path from "path";
+import * as glob from "glob";
+
+/**
+ * Interface defining options for the treeShakeUniconPathsPlugin.
+ *
+ * @interface TreeShakeUniconPathsPluginOptions
+ * @property {string[]} iconWhitelist - An array of icon names to always include, even if not found in code.
+ */
+
+export interface TreeShakeCareIconsOptions {
+ iconWhitelist: string[];
+}
+
+/**
+ * Creates a Webpack plugin that tree-shakes unused Unicon paths from UniconPaths.json in production builds.
+ *
+ * @param {TreeShakeCareIconsOptions} [options] - Optional configuration options. Defaults to an empty iconWhitelist.
+ * @returns {Plugin} Webpack plugin object.
+ */
+
+export function treeShakeCareIcons(
+ options: TreeShakeCareIconsOptions = { iconWhitelist: [] }
+): Plugin {
+ const rootDir = path.resolve(__dirname, ".."); // update this if moving this code to a different file
+ const lineIconNameRegex = /"l-[a-z]+(?:-[a-z]+)*"/g;
+ const allUniconPaths = JSON.parse(
+ fs.readFileSync(
+ path.resolve(rootDir, "src/CAREUI/icons/UniconPaths.json"),
+ "utf8"
+ )
+ );
+
+ // Extracts icon names from a given file's content.
+ // Returns an array of icon names like ["l-eye", "l-sync", "l-hearbeat"]
+ function extractCareIconNames(file: string): string[] {
+ const fileContent = fs.readFileSync(file, "utf8");
+
+ const lineIconNameMatches = fileContent.match(lineIconNameRegex) || [];
+
+ const lineIconNames = lineIconNameMatches.map(
+ (lineIconName) => lineIconName.slice(1, -1) // remove quotes
+ );
+
+ return lineIconNames;
+ }
+ // Finds all used icon names within the project's source files (`.tsx` or `.res` extensions).
+ function getAllUsedIconNames() {
+ const files = glob.sync(path.resolve(rootDir, "src/**/*.{tsx,res}"));
+ const usedIconsArray: string[] = [];
+
+ files.forEach((file) => {
+ const iconNames = extractCareIconNames(file);
+ usedIconsArray.push(...iconNames);
+ });
+
+ return new Set(usedIconsArray);
+ }
+ // Generates a map of used icon names to their paths from UniconPaths.json, including any whitelisted icons.
+ function getTreeShakenUniconPaths() {
+ const usedIcons = [...getAllUsedIconNames(), ...options.iconWhitelist];
+ const treeshakenCareIconPaths = {};
+
+ for (const iconName of usedIcons) {
+ const path = allUniconPaths[iconName];
+ if (path === undefined) {
+ throw new Error(`Icon ${iconName} is not found in UniconPaths.json`);
+ } else {
+ treeshakenCareIconPaths[iconName] = path;
+ }
+ }
+
+ return treeshakenCareIconPaths;
+ }
+
+ return {
+ name: "tree-shake-care-icons",
+ transform(_src, id) {
+ if (process.env.NODE_ENV !== "production") {
+ return;
+ }
+
+ // Replace the UniconPaths with the tree-shaken version
+ if (id.endsWith("UniconPaths.json")) {
+ return {
+ code: `export default ${JSON.stringify(getTreeShakenUniconPaths())}`,
+ map: null,
+ };
+ }
+ },
+ };
+}
diff --git a/src/CAREUI/display/RecordMeta.tsx b/src/CAREUI/display/RecordMeta.tsx
index 5e1e117f9d6..662c61fd73f 100644
--- a/src/CAREUI/display/RecordMeta.tsx
+++ b/src/CAREUI/display/RecordMeta.tsx
@@ -44,7 +44,7 @@ const RecordMeta = ({
{user && !inlineUser && (
by
-
-
-
{
-
{props.user.user_type}
{t("sign_out")}
Updated successfully
diff --git a/src/Components/Common/components/ButtonV2.tsx b/src/Components/Common/components/ButtonV2.tsx
index 2f3d3002451..4dc6c71ac82 100644
--- a/src/Components/Common/components/ButtonV2.tsx
+++ b/src/Components/Common/components/ButtonV2.tsx
@@ -171,7 +171,7 @@ export const Submit = ({ label = "Submit", ...props }: CommonButtonProps) => {
type="submit"
children={
<>
-
@@ -673,7 +673,10 @@ const AssetCreate = (props: AssetProps) => {
className="ml-1 mt-1 flex h-10 cursor-pointer items-center justify-self-end rounded border border-gray-400 px-4 hover:bg-gray-200"
onClick={() => setIsScannerActive(true)}
>
-
{diagnosis.label}
//A Triage already exist on this date
} diff --git a/src/Components/Form/AutoCompleteAsync.tsx b/src/Components/Form/AutoCompleteAsync.tsx index 4ad68e96d73..762c9f2d136 100644 --- a/src/Components/Form/AutoCompleteAsync.tsx +++ b/src/Components/Form/AutoCompleteAsync.tsx @@ -109,7 +109,8 @@ const AutoCompleteAsync = (props: Props) => { {hasSelection && !loading && !required && (Add Patient Details
@@ -793,7 +796,7 @@ export const PatientManager = () => { setShowDoctors(true); }} > -Doctor Connect
)} @@ -823,7 +826,7 @@ export const PatientManager = () => { }} className="mr-5 w-full lg:w-fit" > -Log Update
@@ -537,8 +540,8 @@ export default function PatientInfoCard(props: { <>
Link ABHA Number
Track Shifting
Shift Patient
{t("discharge_summary")}
@@ -1176,7 +1179,7 @@ export const PatientRegister = (props: PatientRegisterProps) => {
setQuery({ extId: "" }, { replace: true });
}}
>
-
Linked Facilities
Linked Skills
Set Average weekly working hours
{asset?.name}