diff --git a/package-lock.json b/package-lock.json index ea31232..b6c6437 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.3.0", - "reactstrap": "^9.1.2" + "reactstrap": "^9.1.2", + "swr": "^1.3.0" }, "devDependencies": { "@types/react": "^18.0.15", @@ -3962,6 +3963,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swr": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz", + "integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==", + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6947,6 +6956,12 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "swr": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz", + "integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==", + "requires": {} + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", diff --git a/package.json b/package.json index 4825771..2dbde2a 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.3.0", - "reactstrap": "^9.1.2" + "reactstrap": "^9.1.2", + "swr": "^1.3.0" }, "devDependencies": { "@types/react": "^18.0.15", @@ -37,4 +38,4 @@ "typescript": "^4.6.4", "vite": "^3.0.0" } -} +} \ No newline at end of file diff --git a/src/screens/manage-members/manage-members.info.ts b/src/screens/manage-members/manage-members.info.ts index ea93cd2..5f6dea6 100644 --- a/src/screens/manage-members/manage-members.info.ts +++ b/src/screens/manage-members/manage-members.info.ts @@ -1,62 +1,72 @@ import { ColumnField } from "../../models/table.model"; -import { FilterMatchMode } from 'primereact/api'; +import { FilterMatchMode } from "primereact/api"; import { DataTableFilterMeta } from "primereact/datatable"; import ContactModel from "../../models/contact.model"; class ManageMembersInfo { + static getColumns(): ColumnField[] { + return [ + { field: "contact_id", header: "Contact ID" }, + { field: "first_name", header: "First Name" }, + { field: "uh_id", header: "UH ID" }, + { field: "email", header: "Email" }, + { field: "last_name", header: "Last Name" }, + { field: "phone_number", header: "Phone Number" }, + { field: "shirt_size_id", header: "Shirt Size" }, + { field: "timestamp", header: "Timestamp" } + ]; + } - static getColumns(): ColumnField[] { - return [ - { field: "contact_id", header: "Contact ID" }, - { field: "first_name", header: "First Name" }, - { field: "uh_id", header: "UH ID" }, - { field: "email", header: "Email" }, - { field: "last_name", header: "Last Name" }, - { field: "phone_number", header: "Phone Number" }, - { field: "shirt_size_id", header: "Shirt Size" }, - { field: "timestamp", header: "Timestamp" }, - ]; - } + static getDefaultColumns(): ColumnField[] { + return [ + { field: "first_name", header: "First Name" }, + { field: "last_name", header: "Last Name" }, + { field: "uh_id", header: "UH ID" }, + { field: "email", header: "Email" }, + { field: "phone_number", header: "Phone Number" }, + { field: "shirt_size_id", header: "Shirt Size" } + ]; + } - static getDefaultColumns(): ColumnField[] { - return [ - { field: "first_name", header: "First Name" }, - { field: "last_name", header: "Last Name" }, - { field: "uh_id", header: "UH ID" }, - { field: "email", header: "Email" }, - { field: "phone_number", header: "Phone Number" }, - { field: "shirt_size_id", header: "Shirt Size" }, - ]; - } + static getShirtSizeOptions() { + return [ + { label: "Not Available", value: undefined }, + { label: "Extra Small", value: "xs" }, + { label: "Small", value: "sm" }, + { label: "Medium", value: "md" }, + { label: "Large", value: "lg" }, + { label: "Extra Large", value: "xl" }, + { label: "Double Extra Large", value: "xxl" }, + { label: "Triple Extra Large", value: "xxxl" } + ]; + } - static getShirtSizeOptions() { - return [ - { label: "Not Available", value: undefined }, - { label: "Extra Small", value: "xs" }, - { label: "Small", value: "sm" }, - { label: "Medium", value: "md" }, - { label: "Large", value: "lg" }, - { label: "Extra Large", value: "xl" }, - { label: "Double Extra Large", value: "xxl" }, - { label: "Triple Extra Large", value: "xxxl" }, - ] - } - - static getTableFilters(): DataTableFilterMeta { - return { global: { value: null, matchMode: FilterMatchMode.CONTAINS } }; - } - - static getGlobalFilterFields(): string[] { - return [ - "first_name", - "last_name", - "uh_id", - "email", - "phone_number", - "shirt_size_id", - ] - } + static getTableFilters(): DataTableFilterMeta { + return { + global: { value: null, matchMode: FilterMatchMode.CONTAINS }, + contact_id: { value: null, matchMode: FilterMatchMode.CONTAINS }, + timestamp: { value: null, matchMode: FilterMatchMode.CONTAINS }, + last_name: { value: null, matchMode: FilterMatchMode.CONTAINS }, + first_name: { value: null, matchMode: FilterMatchMode.CONTAINS }, + uh_id: { value: null, matchMode: FilterMatchMode.CONTAINS }, + email: { value: null, matchMode: FilterMatchMode.CONTAINS }, + phone_number: { value: null, matchMode: FilterMatchMode.CONTAINS }, + shirt_size_id: { value: null, matchMode: FilterMatchMode.CONTAINS } + }; + } + static getGlobalFilterFields(): string[] { + return [ + "first_name", + "last_name", + "uh_id", + "email", + "phone_number", + "shirt_size_id", + "contact_id", + "timestamp" + ]; + } } -export default ManageMembersInfo; \ No newline at end of file +export default ManageMembersInfo; diff --git a/src/screens/manage-members/manage-members.screen.tsx b/src/screens/manage-members/manage-members.screen.tsx index 866878a..c3c31bc 100644 --- a/src/screens/manage-members/manage-members.screen.tsx +++ b/src/screens/manage-members/manage-members.screen.tsx @@ -1,47 +1,62 @@ -import { useEffect, useState } from "react"; - -import BasicTable from "../../components/basic-table"; +import { useState } from "react"; import { Toolbar } from "primereact/toolbar"; +import { DataTable, DataTableFilterMeta, DataTableFilterMetaData } from "primereact/datatable"; +import { Column } from "primereact/column"; +import { InputText } from "primereact/inputtext"; import { Button } from "primereact/button"; - +import useSWR from "swr"; +import { API_BASE_URL } from "../../utils/config"; import ManageMemberDialog from "./manage-members.dialog"; import ContactModel from "../../models/contact.model"; import MemberModel from "../../models/contact.model"; -import MemberService from "../../services/MemberService"; import ManageMembersInfo from "./manage-members.info"; +import { fetcher } from "../../utils/fetcher"; +import { ColumnField } from "../../models/table.model"; +import { MultiSelect, MultiSelectChangeParams } from "primereact/multiselect"; const ManageMembers = () => { - const [members, setMembers] = useState([]); - const [selected, setSelected] = useState(undefined); - const [memberDialogVisible, setMemberDialogVisible] = - useState(false); - - useEffect(() => { - const getData = async () => { - const data = await MemberService.getMembers(); - setMembers(data); - }; + const { data: members, error } = useSWR( + `${API_BASE_URL}/member/all`, + fetcher + ); - getData(); - }, []); + const [selected, setSelected] = useState(undefined); + const [filters, setFilters] = useState(ManageMembersInfo.getTableFilters()); + const [globalFilterValue, setGlobalFilterValue] = useState(""); + const [memberDialogVisible, setMemberDialogVisible] = useState(false); + const [selectedColumns, setSelectedColumns] = useState(ManageMembersInfo.getDefaultColumns() ?? ManageMembersInfo.getColumns()); const onAddClick = () => { console.log("Add clicked!"); }; + const onColumnToggle = (event: MultiSelectChangeParams) => { + const selectedColumns = event.value as ColumnField[]; + const orderedSelectedColumns = ManageMembersInfo.getColumns().filter( + (col) => + selectedColumns.some((sCol: ColumnField) => sCol.field === col.field) + ); + setSelectedColumns(orderedSelectedColumns); + }; + const onManageClick = () => { setMemberDialogVisible(true); }; const toolbarLeft = ( <> -