diff --git a/src/Components/DataPoints/DataPoints.css b/src/Components/DataPoints/DataPoints.css index 996fb7f..05a5389 100644 --- a/src/Components/DataPoints/DataPoints.css +++ b/src/Components/DataPoints/DataPoints.css @@ -6,6 +6,7 @@ height: calc(100% - 2rem); display: flex; flex-direction: column; + position: relative; } .DataTableStyle { @@ -37,7 +38,7 @@ .DataTableStyle .p-datatable-wrapper > .p-datatable-table > .p-datatable-thead, .p-filter-column { - height: 60px; + height: 50px; } .p-column-filter-row-items, diff --git a/src/Components/DataPoints/DataPoints.jsx b/src/Components/DataPoints/DataPoints.jsx index 9aa24e9..c5fe5aa 100644 --- a/src/Components/DataPoints/DataPoints.jsx +++ b/src/Components/DataPoints/DataPoints.jsx @@ -5,12 +5,11 @@ import {getPrograms} from "../../Data/ProgramData"; import {getRecordByRecordIDs} from "../../Data/RecordData"; import {Form, Outlet, redirect, useLoaderData, useNavigate, useParams} from "react-router-dom"; import './DataPoints.css'; -import React, {useEffect, useState} from "react"; +import React, {useEffect, useRef, useState} from "react"; import { - Accordion, AccordionDetails, AccordionSummary, - ButtonGroup, + Accordion, AccordionDetails, AccordionSummary, Box, Chip, Dialog, DialogActions, - DialogContent, + DialogContent, Fab, IconButton, Paper, Tooltip, useTheme, } from "@mui/material"; import {Check, Close, Explore, FilterAltOff, OpenInFull, Refresh} from "@mui/icons-material"; @@ -22,6 +21,7 @@ import {InlineTypography} from "../common"; import {ThemeSwitcherProvider} from 'react-css-theme-switcher'; import {TriStateCheckbox} from 'primereact/tristatecheckbox'; import {Dropdown} from "primereact/dropdown"; +import Draggable from "react-draggable"; export async function loader() { // console.time("DataPointsLoader") @@ -29,18 +29,9 @@ export async function loader() { programs = Object.values(programs).flat().filter(program => program.Applicants.length > 0); const recordIDs = programs.map(program => program.Applicants.map(applicant => applicant + "|" + program.ProgramID)).flat(); let records = Object.values(await getRecordByRecordIDs(recordIDs)); - records = records.map(record => { - record['Season'] = record.ProgramYear + " " + record.Semester; - return record; - }); + programs = programs.map(program => program.ProgramID); records = records.sort((a, b) => { - if (programs.indexOf(a.ProgramID) > programs.indexOf(b.ProgramID)) { - return -1; - } else if (programs.indexOf(a.ProgramID) < programs.indexOf(b.ProgramID)) { - return 1; - } else { - return 0; - } + return programs.indexOf(a.ProgramID) - programs.indexOf(b.ProgramID); }); // console.timeEnd("DataPointsLoader") @@ -100,9 +91,14 @@ export function ProgramContentInDataPoints() { ) } -export default function DataPoints() { - const {records} = useLoaderData(); +export function DataGrid({records, insideProgramPage, style = {}}) { const navigate = useNavigate(); + const theme = useTheme(); + const themeMap = { + light: "/TableLight.css", + dark: "/TableDark.css" + }; + const [filters, setFilters] = useState(null); useEffect(() => { initFilters(); @@ -118,16 +114,6 @@ export default function DataPoints() { Final: {value: null, matchMode: FilterMatchMode.EQUALS} }); }; - - const clearFilter = () => { - initFilters(); - }; - - const theme = useTheme(); - const themeMap = { - light: "./TableLight.css", - dark: "./TableDark.css" - } const getStatusColor = (status) => { switch (status) { case 'Reject': @@ -216,7 +202,7 @@ export default function DataPoints() { const programBodyTemplate = (rowData) => { return
- + navigate(`/datapoints/program/${rowData.ProgramID}`)}> @@ -240,130 +226,105 @@ export default function DataPoints() { return value.includes(filters); }) - const renderHeader = () => { - return ( -
- - - - - - - -
- - - -
-
-
-
- ); - }; - return ( - - - - - - - - - - - - - - - + + + {insideProgramPage ? null : } + + + + + + + + ) } @@ -382,7 +343,8 @@ function UsageGuidance() {
  1. - 对于申请人申请项目这两列,可点击单元格右侧按钮查看申请人或项目的详细信息。 + 对于申请人申请项目这两列,可点击单元格右侧按钮查看申请人或项目的详细信息。
  2. 本页面为只读模式,想要编辑自己的申请人信息或添加/删除/修改所申请的项目,请点击右上角头像下拉菜单中Profile页面编辑相应信息。
  3. @@ -400,4 +362,50 @@ function UsageGuidance() { ); -} \ No newline at end of file +} + +export default function DataPoints() { + const loaderRecords = useLoaderData(); + const records = loaderRecords.records.map(record => { + record['Season'] = record.ProgramYear + " " + record.Semester; + return record; + }); + + const nodeRef = useRef(null); + + const dragStartPositionXYRef = useRef({x: 0, y: 0}); + + return ( + <> + + + + + + + { + dragStartPositionXYRef.current = {x: data.x, y: data.y}; + }} + onStop={(event, data) => { + const THRESHOLD = 2; + const {x, y} = dragStartPositionXYRef.current ?? {x: 0, y: 0}; + const wasDragged = Math.abs(data.x - x) > THRESHOLD || Math.abs(data.y - y) > THRESHOLD; + if (!wasDragged) { + event.preventDefault(); + document.querySelector(".HiddenRefreshButton").click() + } + }} + > + + + + + +
    +