diff --git a/002_source/cms/src/app/dashboard/teachers/edit/[customerId]/_PROMPT.md b/002_source/cms/src/app/dashboard/teachers/edit/[customerId]/_PROMPT.md deleted file mode 100644 index abf4465..0000000 --- a/002_source/cms/src/app/dashboard/teachers/edit/[customerId]/_PROMPT.md +++ /dev/null @@ -1,11 +0,0 @@ -# task - -## instruction - -with reference to `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/app/_helloworld/page.tsx` - -with reference to `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/app/dashboard/lesson_types/edit/[typeId]/page.tsx` - -please modify `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/app/dashboard/lesson_categories/edit/page.tsx` - -please draft a tsx for showing error to user thanks, diff --git a/002_source/cms/src/app/dashboard/teachers/edit/[customerId]/page.tsx b/002_source/cms/src/app/dashboard/teachers/edit/[id]/page.tsx similarity index 100% rename from 002_source/cms/src/app/dashboard/teachers/edit/[customerId]/page.tsx rename to 002_source/cms/src/app/dashboard/teachers/edit/[id]/page.tsx diff --git a/002_source/cms/src/app/dashboard/teachers/list/page.tsx b/002_source/cms/src/app/dashboard/teachers/list/page.tsx index b32c2c0..326c32e 100644 --- a/002_source/cms/src/app/dashboard/teachers/list/page.tsx +++ b/002_source/cms/src/app/dashboard/teachers/list/page.tsx @@ -6,7 +6,7 @@ // import * as React from 'react'; import { useRouter } from 'next/navigation'; -import { COL_TEACHERS } from '@/constants'; +import { COL_USER_METAS } from '@/constants'; import { LoadingButton } from '@mui/lab'; import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; @@ -49,23 +49,30 @@ export default function Page({ searchParams }: PageProps): React.JSX.Element { const [currentPage, setCurrentPage] = React.useState(0); // const [recordCount, setRecordCount] = React.useState(0); - const [listOption, setListOption] = React.useState({}); + const [listOption, setListOption] = React.useState({ filter: '' }); const [listSort, setListSort] = React.useState({}); + function isListOptionChanged() { + return JSON.stringify(listOption) === '{}'; + } // const reloadRows = async (): Promise => { try { + const listOptionTeacherOnly = isListOptionChanged() + ? { filter: `role = "teacher"` } + : { filter: [listOption.filter, `role = "teacher"`].join(' && ') }; + const models: ListResult = await pb - .collection(COL_TEACHERS) - .getList(currentPage + 1, rowsPerPage, listOption); + .collection(COL_USER_METAS) + .getList(currentPage + 1, rowsPerPage, listOptionTeacherOnly); const { items, totalItems } = models; - const tempLessonTypes: Teacher[] = items.map((lt) => { + const tempTeacher: Teacher[] = items.map((lt) => { return { ...defaultTeacher, ...lt }; }); - setLessonCategoriesData(tempLessonTypes); + setLessonCategoriesData(tempTeacher); setRecordCount(totalItems); - setF(tempLessonTypes); + setF(tempTeacher); } catch (error) { logger.error(error); setShowError({ diff --git a/002_source/cms/src/app/dashboard/teachers/view/[customerId]/BasicDetailCard.tsx b/002_source/cms/src/app/dashboard/teachers/view/[id]/BasicDetailCard.tsx similarity index 100% rename from 002_source/cms/src/app/dashboard/teachers/view/[customerId]/BasicDetailCard.tsx rename to 002_source/cms/src/app/dashboard/teachers/view/[id]/BasicDetailCard.tsx diff --git a/002_source/cms/src/app/dashboard/teachers/view/[customerId]/TitleCard.tsx b/002_source/cms/src/app/dashboard/teachers/view/[id]/TitleCard.tsx similarity index 90% rename from 002_source/cms/src/app/dashboard/teachers/view/[customerId]/TitleCard.tsx rename to 002_source/cms/src/app/dashboard/teachers/view/[id]/TitleCard.tsx index 971bfa7..263056c 100644 --- a/002_source/cms/src/app/dashboard/teachers/view/[customerId]/TitleCard.tsx +++ b/002_source/cms/src/app/dashboard/teachers/view/[id]/TitleCard.tsx @@ -10,13 +10,14 @@ import { CaretDown as CaretDownIcon } from '@phosphor-icons/react/dist/ssr/Caret import { CheckCircle as CheckCircleIcon } from '@phosphor-icons/react/dist/ssr/CheckCircle'; import { useTranslation } from 'react-i18next'; import type { Customer } from '@/components/dashboard/customer/type.d'; +import { Teacher } from '@/components/dashboard/teacher/type.d'; // import type { CrCategory } from '@/components/dashboard/cr/categories/type'; -function getImageUrlFrRecord(record: Customer): string { +function getImageUrlFrRecord(record: Teacher): string { // TODO: fix this // `http://127.0.0.1:8090/api/files/${'record.collectionId'}/${'record.id'}/${'record.cat_image'}`; - return 'getImageUrlFrRecord(helloworld)'; + return `http://127.0.0.1:8090/api/files/${record.collectionId}/${record.id}/${record.avatar}`; } export default function SampleTitleCard({ lpModel }: { lpModel: Customer }): React.JSX.Element { diff --git a/002_source/cms/src/app/dashboard/teachers/view/[customerId]/page.tsx b/002_source/cms/src/app/dashboard/teachers/view/[id]/page.tsx similarity index 94% rename from 002_source/cms/src/app/dashboard/teachers/view/[customerId]/page.tsx rename to 002_source/cms/src/app/dashboard/teachers/view/[id]/page.tsx index eb77f8f..308840a 100644 --- a/002_source/cms/src/app/dashboard/teachers/view/[customerId]/page.tsx +++ b/002_source/cms/src/app/dashboard/teachers/view/[id]/page.tsx @@ -30,13 +30,13 @@ import BasicDetailCard from './BasicDetailCard'; import TitleCard from './TitleCard'; import { defaultTeacher } from '@/components/dashboard/teacher/_constants'; import type { Teacher } from '@/components/dashboard/teacher/type.d'; -import { COL_TEACHERS } from '@/constants'; +import { COL_USER_METAS } from '@/constants'; export default function Page(): React.JSX.Element { const { t } = useTranslation(); const router = useRouter(); // - const { customerId } = useParams<{ customerId: string }>(); + const { id } = useParams<{ id: string }>(); // const [showLoading, setShowLoading] = React.useState(true); const [showError, setShowError] = React.useState({ show: false, detail: '' }); @@ -48,9 +48,9 @@ export default function Page(): React.JSX.Element { } React.useEffect(() => { - if (customerId) { - pb.collection(COL_TEACHERS) - .getOne(customerId) + if (id) { + pb.collection(COL_USER_METAS) + .getOne(id) .then((model: RecordModel) => { setShowLessonCategory({ ...defaultTeacher, ...model }); }) @@ -64,7 +64,8 @@ export default function Page(): React.JSX.Element { setShowLoading(false); }); } - }, [customerId]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [id]); // return <>{JSON.stringify({ showError, showLessonCategory }, null, 2)}; diff --git a/002_source/cms/src/components/dashboard/teacher/_GUIDELINES.md b/002_source/cms/src/components/dashboard/teacher/_GUIDELINES.md index 709449f..6302b64 100644 --- a/002_source/cms/src/components/dashboard/teacher/_GUIDELINES.md +++ b/002_source/cms/src/components/dashboard/teacher/_GUIDELINES.md @@ -5,18 +5,18 @@ - default value (defaultValue) - empty value (emptyValue) -- `customers-table.tsx` +- `teachers-table.tsx` - `confirm-delete-modal.tsx` - delete modal component when click delete button on list - - `customers-filters.tsx` - - `customers-pagination.tsx` + - `teachers-filters.tsx` + - `teachers-pagination.tsx` - `email-filter-popover.tsx` - `phone-filter-popover.tsx` - - `customers-selection-context.tsx` + - `teachers-selection-context.tsx` -- `customer-create-form.tsx` - form to create a new customer -- `customer-edit-form.tsx` - form to edit a existing customer +- `teacher-create-form.tsx` - form to create a new teacher +- `teacher-edit-form.tsx` - form to edit an existing teacher - `type.d.tsx` - contains type definition diff --git a/002_source/cms/src/components/dashboard/teacher/confirm-delete-modal.tsx b/002_source/cms/src/components/dashboard/teacher/confirm-delete-modal.tsx index 62cd664..afbb10e 100644 --- a/002_source/cms/src/components/dashboard/teacher/confirm-delete-modal.tsx +++ b/002_source/cms/src/components/dashboard/teacher/confirm-delete-modal.tsx @@ -83,12 +83,12 @@ export default function ConfirmDeleteModal({ - {t('Delete Lesson Type ?')} + {t('Delete Teacher ?')} - {t('Are you sure you want to delete lesson type ?')} + {t('Are you sure you want to delete this teacher ?')} (); + const { id: teacherId } = useParams<{ id: string }>(); // const [isUpdating, setIsUpdating] = React.useState(false); const [showLoading, setShowLoading] = React.useState(false); @@ -123,17 +123,17 @@ export function TeacherEditForm(): React.JSX.Element { }; try { - await pb.collection(COL_TEACHERS).update(customerId, updateData); - toast.success('Customer updated successfully'); + await pb.collection(COL_USER_METAS).update(teacherId, updateData); + toast.success('Teacher updated successfully'); router.push(paths.dashboard.teachers.list); } catch (error) { logger.error(error); - toast.error('Failed to update customer'); + toast.error('Failed to update teacher'); } finally { setIsUpdating(false); } }, - [customerId, router] + [teacherId, router] ); const avatarInputRef = React.useRef(null); @@ -162,13 +162,13 @@ export function TeacherEditForm(): React.JSX.Element { setShowLoading(true); try { - const result = await pb.collection(COL_TEACHERS).getOne(id); + const result = await pb.collection(COL_USER_METAS).getOne(id); reset({ ...defaultValues, ...result }); console.log({ result }); - if (result.avatar_file) { + if (result.avatar) { const fetchResult = await fetch( - `http://127.0.0.1:8090/api/files/${result.collectionId}/${result.id}/${result.avatar_file}` + `http://127.0.0.1:8090/api/files/${result.collectionId}/${result.id}/${result.avatar}` ); const blob = await fetchResult.blob(); const url = await fileToBase64(blob); @@ -176,7 +176,7 @@ export function TeacherEditForm(): React.JSX.Element { } } catch (error) { logger.error(error); - toast.error('Failed to load customer data'); + toast.error('Failed to load teacher data'); setShowError({ show: true, detail: JSON.stringify(error, null, 2) }); } finally { setShowLoading(false); @@ -186,9 +186,9 @@ export function TeacherEditForm(): React.JSX.Element { ); React.useEffect(() => { - void loadExistingData(customerId); + void loadExistingData(teacherId); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [customerId]); + }, [teacherId]); if (showLoading) return ; if (showError.show) diff --git a/002_source/cms/src/components/dashboard/teacher/teachers-filters.tsx b/002_source/cms/src/components/dashboard/teacher/teachers-filters.tsx index 03c87dd..28bdce4 100644 --- a/002_source/cms/src/components/dashboard/teacher/teachers-filters.tsx +++ b/002_source/cms/src/components/dashboard/teacher/teachers-filters.tsx @@ -4,7 +4,7 @@ // import * as React from 'react'; import { useRouter } from 'next/navigation'; -import { getAllCustomersCount } from '@/db/Customers/GetAllCount'; +import { getAllTeachersCount } from '@/db/Teachers/GetAllCount'; import Button from '@mui/material/Button'; import Chip from '@mui/material/Chip'; @@ -27,13 +27,15 @@ import GetPendingCount from '@/db/Customers/GetPendingCount'; import GetActiveCount from '@/db/Customers/GetActiveCount'; import PhoneFilterPopover from './phone-filter-popover'; import EmailFilterPopover from './email-filter-popover'; -import type { CustomersFiltersProps, Filters, SortDir } from './type.d'; +import type { TeachersFiltersProps, Filters, SortDir } from './type.d'; +import { logger } from '@/lib/default-logger'; export function TeachersFilters({ filters = {}, sortDir = 'desc', fullData, -}: CustomersFiltersProps): React.JSX.Element { + // +}: TeachersFiltersProps): React.JSX.Element { const { t } = useTranslation(); const { email, phone, status } = filters; @@ -129,7 +131,7 @@ export function TeachersFilters({ React.useEffect(() => { const fetchCount = async (): Promise => { try { - const tc = await getAllCustomersCount(); + const tc = await getAllTeachersCount(); setTotalCount(tc); const bc = await GetBlockedCount(); @@ -140,6 +142,7 @@ export function TeachersFilters({ setActiveCount(ac); } catch (error) { // + logger.error(error); } }; void fetchCount(); diff --git a/002_source/cms/src/components/dashboard/teacher/teachers-table.tsx b/002_source/cms/src/components/dashboard/teacher/teachers-table.tsx index 397d249..ce215ae 100644 --- a/002_source/cms/src/components/dashboard/teacher/teachers-table.tsx +++ b/002_source/cms/src/components/dashboard/teacher/teachers-table.tsx @@ -39,7 +39,10 @@ function columns(handleDeleteClick: (testId: string) => void): ColumnDef - {' '} +
{ - return pb.collection(COL_TEACHERS).delete(id); + return pb.collection(COL_USER_METAS).delete(id); } diff --git a/002_source/cms/src/db/Teachers/GetActiveCount.tsx b/002_source/cms/src/db/Teachers/GetActiveCount.tsx index cf92c27..bb5c779 100644 --- a/002_source/cms/src/db/Teachers/GetActiveCount.tsx +++ b/002_source/cms/src/db/Teachers/GetActiveCount.tsx @@ -1,8 +1,8 @@ -import { COL_TEACHERS } from '@/constants'; +import { COL_TEACHERS, COL_USER_METAS } from '@/constants'; import { pb } from '@/lib/pb'; export default async function GetActiveCount(): Promise { - const { totalItems: count } = await pb.collection(COL_TEACHERS).getList(1, 1, { + const { totalItems: count } = await pb.collection(COL_USER_METAS).getList(1, 1, { filter: 'status = "active"', }); return count; diff --git a/002_source/cms/src/db/Teachers/GetAllCount.tsx b/002_source/cms/src/db/Teachers/GetAllCount.tsx index d2e86b4..06a50e6 100644 --- a/002_source/cms/src/db/Teachers/GetAllCount.tsx +++ b/002_source/cms/src/db/Teachers/GetAllCount.tsx @@ -1,7 +1,7 @@ import { pb } from '@/lib/pb'; -import { COL_TEACHERS } from '@/constants'; +import { COL_USER_METAS } from '@/constants'; export async function getAllTeachersCount(): Promise { - const result = await pb.collection(COL_TEACHERS).getList(1, 1); + const result = await pb.collection(COL_USER_METAS).getList(1, 1, { filter: `role = "teacher"` }); return result.totalItems; }