diff --git a/src/__test__/ListPengguna.test.js b/src/__test__/ListPengguna.test.js index 05959e5fb3aaa15e7b26660f688497546b4288a8..fb06315e7686f0c7b67ae1fa9c4403771e3b8131 100644 --- a/src/__test__/ListPengguna.test.js +++ b/src/__test__/ListPengguna.test.js @@ -1,5 +1,5 @@ import React from "react"; -import { render, cleanup } from "@testing-library/react"; +import { render, cleanup, act, fireEvent } from "@testing-library/react"; import ListPengguna from "../page/pengguna/ListPengguna"; import AuthContext from "../utils/contex"; import { waitFor } from "@testing-library/dom"; @@ -53,3 +53,58 @@ test("test fetching API", async () => { const data = getByText("Dummy User"); expect(data.textContent).toContain("Dummy User"); }); +test("test sort users", async () => { + fetch.mockResponseOnce( + JSON.stringify({ + count: 2, + next: null, + previous: null, + results: [ + { + id: "45897cc5-968c-44cf-931d-e646b095fcaf", + username: "admin-staging", + full_name: "", + phone_number: "", + address: "", + neighborhood: "", + hamlet: "", + urban_village: "", + sub_district: "", + profile_picture: null, + }, + { + id: "663392ac-1dd6-462b-9301-a19c1287cefd", + username: "dummyuser", + full_name: "Dummy User", + phone_number: "+6285212345678", + address: "Jl. Dummy No.1", + neighborhood: "000", + hamlet: "000", + urban_village: "Dummy Urban Village", + sub_district: "Dummy Sub-District", + profile_picture: null, + }, + ], + }) + ); + + const { getByTestId } = render( + <AuthContext.Provider value={{ profile: { token: "BEBAS" } }}> + <ListPengguna /> + </AuthContext.Provider> + ); + await waitFor(() => getByTestId("sort-button")); + const sortButton = getByTestId("sort-button"); + expect(sortButton.textContent).toContain("Urutkan"); + await act(async () => { + await fireEvent.click(sortButton); + }); + const transactionRadio = getByTestId("transaksi-radio"); + await act(async () => { + await fireEvent.click(transactionRadio); + }); + const saveButton = getByTestId("save-button"); + await act(async () => { + await fireEvent.click(saveButton); + }); +}); \ No newline at end of file diff --git a/src/page/pengguna/ListPengguna.jsx b/src/page/pengguna/ListPengguna.jsx index e6141701321651ab0ec74858ee01b81b0fdd07a0..78f6443045189bcbcb0c247bbf4d7249c22b023b 100644 --- a/src/page/pengguna/ListPengguna.jsx +++ b/src/page/pengguna/ListPengguna.jsx @@ -1,8 +1,20 @@ -import React from "react"; +import React, {useState} from "react"; import { css } from "@emotion/core"; import TableComponent from "../../component/TableComponent"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import Button from "@material-ui/core/Button"; +import { + RowInput, + InputSubmitForm, +} from "../../component/html/html"; const ListPengguna = () => { + const [dialogOpen, setDialogOpen] = useState(false); + const [choice, setChoice] = useState(""); + const [sortBy, setSortBy] = useState(""); const data = { url: `${process.env.REACT_APP_BASE_URL}/users/`, pageDefault: 1, @@ -16,6 +28,15 @@ const ListPengguna = () => { ["total_program_donations", "Jumlah Donasi"], ], link: "", + sort: sortBy + }; + + const handleClickOpen = () => { + setDialogOpen(true); + }; + + const handleClose = () => { + setDialogOpen(false); }; return ( <div @@ -32,7 +53,106 @@ const ListPengguna = () => { > KELOLA PENGGUNA </div> + <div css={css` + margin-top: 20px; + padding-left: 50px; + `}> + <Button + onClick={handleClickOpen} + variant="contained" + size="medium" + data-testid="sort-button" + css={css` + text-transform: none; + width: 25%; + background: #FFFFFF; + border: 1px solid #3c8dbc; + box-sizing: border-box; + font-size: 14px; + line-height: 17px; + text-align: center; + letter-spacing: 0.2em; + color: #3c8dbc; + height: 2.3rem; + `} + > + Urutkan + </Button> + </div> + <TableComponent {...data} /> + <Dialog + maxWidth="xl" + open={dialogOpen} + onClose={handleClose} + aria-labelledby="max-width-dialog-title" + > + <DialogTitle id="max-width-dialog-title">Urutkan Berdasarkan</DialogTitle> + <DialogContent> + <form onSubmit={() => setSortBy(choice)}> + <RowInput> + <input + data-testid="transaksi-radio" + type="radio" + name="transaksi" + value="transaksi" + id="transaksi" + checked={choice === "transaksi"} + onClick={() => setChoice("transaksi")} + /> + <label htmlFor="preorder" css={css` + margin-left:20px + `}>Terbanyak transaksi</label> + </RowInput> + <RowInput> + <input + type="radio" + name="donasi-uang" + value="donasi-uang" + id="donasi-uang" + checked={choice === "donasi-uang"} + onClick={() => setChoice("donasi-uang")} + /> + <label htmlFor="preorder" css={css` + margin-left:20px + `}>Terbanyak donasi uang</label> + </RowInput> + <RowInput> + <input + type="radio" + name="donasi-barang" + value="donasi-barang" + id="donasi-barang" + checked={choice === "donasi-barang"} + onClick={() => setChoice("donasi-barang")} + /> + <label htmlFor="preorder" css={css` + margin-left:20px + `}>Terbanyak donasi barang</label> + </RowInput> + <RowInput> + <InputSubmitForm + value="SIMPAN" + type="submit" + data-testid="save-button" + css={css` + width:50%; + margin-top:10px; + margin-left:110px; + `}/> + </RowInput> + </form> + </DialogContent> + <DialogActions> + <Button + data-testid="button-close-proof" + onClick={handleClose} + color="primary" + > + Close + </Button> + </DialogActions> + </Dialog> </div> ); }; diff --git a/src/page/program/DetailProgram.jsx b/src/page/program/DetailProgram.jsx index b01d2dbf7c19d109850d62ee7733c947ca83cf68..45108290cd76e6b900d5ad4b7de748fdf6934e05 100644 --- a/src/page/program/DetailProgram.jsx +++ b/src/page/program/DetailProgram.jsx @@ -400,7 +400,7 @@ const DetailProgram = ({ idProgram }) => { {progress.length > 0 ? <div> {progress.map ( p => - <div key={p.id} css={css `margin-top: 1rem; margin-bottom: 2rem; font-size: 18px`}> + <div key={p.id} css={css `margin-top: 1rem; font-size: 18px`}> <p data-testid="progress-date">{p.date}</p> <p>{p.description}</p> {p.image !== null &&