diff --git a/package-lock.json b/package-lock.json index 58440bb..fb2639d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "clsx": "^2.1.1", "i18next": "^25.8.0", "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", + "i18next-http-backend": "^3.0.6", "lucide-react": "^0.563.0", "planby": "^2.0.0", "react": "^19.2.0", @@ -3367,12 +3367,12 @@ } }, "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "node-fetch": "^2.7.0" } }, "node_modules/cross-spawn": { @@ -4539,12 +4539,12 @@ } }, "node_modules/i18next-http-backend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz", - "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.6.tgz", + "integrity": "sha512-mBOqy8993jtqAoj6XaI1XeC/8/9v6EPS+681ziegrPvTB0DoaCY7PpTS0SpY56qLMoS4OI1TZEM2Zf59zNh05w==", "license": "MIT", "dependencies": { - "cross-fetch": "4.0.0" + "cross-fetch": "4.1.0" } }, "node_modules/iconv-lite": { diff --git a/package.json b/package.json index 2183f45..9ec7acf 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "clsx": "^2.1.1", "i18next": "^25.8.0", "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", + "i18next-http-backend": "^3.0.6", "lucide-react": "^0.563.0", "planby": "^2.0.0", "react": "^19.2.0", diff --git a/src/components/region-admin/CreateCenterDialog.tsx b/src/components/region-admin/CreateCenterDialog.tsx index 71490d4..48e0ba8 100644 --- a/src/components/region-admin/CreateCenterDialog.tsx +++ b/src/components/region-admin/CreateCenterDialog.tsx @@ -17,7 +17,7 @@ interface UserWithRegion { firstName: string; lastName: string; email: string; - regionId?: string; + regionId?: string | { _id: string; name: string; code: string } | undefined; } export const CreateCenterDialog: React.FC = ({ @@ -61,14 +61,15 @@ export const CreateCenterDialog: React.FC = ({ if (response.success && response.data) { const managers = response.data.users.filter((u: UserWithRegion) => { if (regionId) { - return u.regionId === regionId; + const uRegionId = typeof u.regionId === 'object' ? u.regionId?._id : u.regionId; + return uRegionId === regionId; } return true; }); setAvailableManagers(managers.map((u: UserWithRegion) => ({ - _id: u.id, + _id: u.id as string, name: `${u.firstName} ${u.lastName}`, - email: u.email, + email: u.email as string, }))); } }; diff --git a/src/components/region-admin/EditCenterDialog.tsx b/src/components/region-admin/EditCenterDialog.tsx index 843905f..f232e00 100644 --- a/src/components/region-admin/EditCenterDialog.tsx +++ b/src/components/region-admin/EditCenterDialog.tsx @@ -25,14 +25,6 @@ interface EditCenterDialogProps { onSuccess: () => void; } -interface UserWithRegion { - id: string; - firstName: string; - lastName: string; - email: string; - regionId?: string; -} - export const EditCenterDialog: React.FC = ({ centerId, initialData, @@ -88,17 +80,23 @@ export const EditCenterDialog: React.FC = ({ const fetchManagers = async () => { const response = await usersApi.getUsers({ role: 'center_manager', isActive: true }); if (response.success && response.data) { - const managers = response.data.users.filter((u: UserWithRegion) => { - if (initialData.regionId) { - return u.regionId === initialData.regionId; + const managers = response.data.users.filter( + (u: Record) => { + if (initialData.regionId) { + return u.regionId === initialData.regionId; + } + return true; } - return true; - }); - setAvailableManagers(managers.map((u: UserWithRegion) => ({ - _id: u.id, - name: `${u.firstName} ${u.lastName}`, - email: u.email, - }))); + ); + setAvailableManagers( + managers.map( + (u: Record) => ({ + _id: u.id as string, + name: `${u.firstName} ${u.lastName}`, + email: u.email as string, + }) + ) + ); } }; fetchManagers(); diff --git a/src/components/region-admin/EducationalMaterials.tsx b/src/components/region-admin/EducationalMaterials.tsx new file mode 100644 index 0000000..6f535a4 --- /dev/null +++ b/src/components/region-admin/EducationalMaterials.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { MaterialIcon } from '../ui/Icon'; + +/** + * Educational Materials page component. + * Placeholder - to be implemented with actual educational content. + */ +export const EducationalMaterials: React.FC = () => { + const { t } = useTranslation(); + + return ( +
+
+

+ {t('educationalMaterials.title', 'Educational Materials')} +

+

+ {t('educationalMaterials.description', 'Browse and manage educational resources and materials.')} +

+
+ +
+
+
+ +
+

+ {t('educationalMaterials.comingSoon', 'Coming Soon')} +

+

+ {t('educationalMaterials.placeholder', 'Educational materials management is under development. This section will allow you to upload, organize, and distribute learning resources.')} +

+
+
+
+ ); +}; diff --git a/yarn.lock b/yarn.lock index a46527c..e1f4d4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1296,12 +1296,12 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cross-fetch@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== +cross-fetch@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz" + integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== dependencies: - node-fetch "^2.6.12" + node-fetch "^2.7.0" cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" @@ -2009,12 +2009,12 @@ i18next-browser-languagedetector@^8.2.0: dependencies: "@babel/runtime" "^7.23.2" -i18next-http-backend@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz" - integrity sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g== +i18next-http-backend@^3.0.6: + version "3.0.6" + resolved "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.6.tgz" + integrity sha512-mBOqy8993jtqAoj6XaI1XeC/8/9v6EPS+681ziegrPvTB0DoaCY7PpTS0SpY56qLMoS4OI1TZEM2Zf59zNh05w== dependencies: - cross-fetch "4.0.0" + cross-fetch "4.1.0" i18next@^25.8.0, "i18next@>= 25.6.2": version "25.8.0" @@ -2466,7 +2466,7 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -node-fetch@^2.6.12: +node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==