Skip to content

Commit 0adfa58

Browse files
authored
Merge pull request #25 from ConnerWithAnE/frontend-main
Frontend main
2 parents ae31f52 + 1a6029a commit 0adfa58

File tree

17 files changed

+4446
-512
lines changed

17 files changed

+4446
-512
lines changed

server/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import cors from "cors";
44
import bodyParser from "body-parser";
55
import { open, Database } from "sqlite";
66
import dotenv from "dotenv";
7-
import fs from 'fs';
7+
import fs from "fs";
88

99
import { initializeDatabase } from "./database-init";
1010

server/src/routes/admin-router.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,15 @@ export default function adminRouter(
9090
upload.array("pdfs"),
9191
async (req: Request, res: Response) => {
9292
try {
93-
// TODO
94-
if (config.MockData) {
93+
if (
94+
!config.MockData &&
95+
(req.files === undefined || req.files.length === 0)
96+
) {
97+
res.status(400).send({
98+
message: "No files uploaded.",
99+
});
100+
return;
101+
} else if (config.MockData) {
95102
import("../../test/testfiles/parse_response.json").then((module) => {
96103
console.log("Sending mock data...");
97104
res.send(module.default);
@@ -100,7 +107,7 @@ export default function adminRouter(
100107
await parsePapers(req.files, gptController).then(
101108
(result: ai_GPTResponse[]) => {
102109
console.log(responseToJSON(result));
103-
res.send(responseToJSON(result));
110+
res.json(result);
104111
},
105112
);
106113
}

web/package-lock.json

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

web/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,17 @@
1616
"@nextui-org/system": "^2.2.6",
1717
"@nextui-org/theme": "^2.2.11",
1818
"@types/react-icons": "^3.0.0",
19+
"fastest-levenshtein": "^1.0.16",
1920
"framer-motion": "^11.13.1",
2021
"react": "^18.3.1",
2122
"react-dom": "^18.3.1",
23+
"react-icons": "^5.4.0",
2224
"react-router-dom": "^7.0.1",
23-
"reacticons": "^0.0.1",
24-
"react-icons": "^5.4.0"
25+
"reacticons": "^0.0.1"
2526
},
2627
"devDependencies": {
2728
"@eslint/js": "^9.15.0",
29+
"@types/node": "^22.13.13",
2830
"@types/react": "^18.3.12",
2931
"@types/react-dom": "^18.3.1",
3032
"@vitejs/plugin-react": "^4.3.4",

web/src/DataContext.tsx

Lines changed: 120 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,49 @@ import {
55
ReactNode,
66
useEffect,
77
} from "react";
8-
import { GPTResponse } from "./types/types";
9-
import { UpdateData } from "./types/types";
8+
import { GPTResponse, FullDataType, Conflict } from "./types/types";
109

1110
// Define the shape of the data
1211

12+
type RedConflicts = {
13+
id: number;
14+
fields: string[];
15+
};
16+
1317
//updateContact<K extends keyof Contact>(id: number, field: K, value: Contact[K])
1418
interface TableDataContextType {
15-
initialGPTPasses: GPTResponse[]; // Adjust the type of `data` based on your use case
19+
initialGPTPasses: GPTResponse[];
1620
setInitialGPTPasses: (data: GPTResponse[]) => void; // Function to update the data
17-
tableEntries: UpdateData[]; // Adjust the type of `data` based on your use case
18-
updateEntry: <K extends keyof UpdateData>(
19-
id: number,
20-
key: string,
21-
value: UpdateData[K]
22-
) => void;
23-
updateEntry2: (id: number, value: UpdateData) => void;
24-
addEntry: (entry: UpdateData) => void;
21+
tableEntries: FullDataType[];
22+
updateEntry: (id: number, value: FullDataType) => void;
23+
addEntry: (entry: FullDataType) => void;
24+
removePass: (id: number) => GPTResponse[];
2525
removeEntry: (id: number) => void;
26-
retrieveEntry: (id: number) => UpdateData | undefined;
26+
redConflicts: RedConflicts[];
27+
setRedConflict: (id: number, fields: string[]) => void;
28+
removeRedConflict: (id: number) => void;
29+
allConflicts: Conflict[];
30+
addConflict: (conflicts: Conflict) => void;
31+
removeConflict: (id: number) => void;
32+
updateConflict: (id: number, fields: Conflict) => void;
2733
}
2834

2935
// Define the default value of the context
3036
const defaultValue: TableDataContextType = {
3137
initialGPTPasses: [],
3238
setInitialGPTPasses: () => {},
3339
updateEntry: () => {},
34-
updateEntry2: () => {},
35-
addEntry: () => {},
3640
removeEntry: () => {},
41+
addEntry: () => {},
42+
removePass: () => [],
3743
tableEntries: [],
38-
retrieveEntry: () => undefined,
44+
redConflicts: [],
45+
setRedConflict: () => {},
46+
removeRedConflict: () => {},
47+
allConflicts: [],
48+
addConflict: () => {},
49+
removeConflict: () => {},
50+
updateConflict: () => {},
3951
};
4052

4153
// Create the context
@@ -48,34 +60,52 @@ export const TableDataFormProvider = ({
4860
children: ReactNode;
4961
}) => {
5062
const [initialGPTPasses, setInitialGPTPasses] = useState<GPTResponse[]>([]);
51-
const [tableEntries, setTableEntries] = useState<UpdateData[]>([]);
63+
const [tableEntries, setTableEntries] = useState<FullDataType[]>([]);
64+
const [redConflicts, setRedConflicts] = useState<RedConflicts[]>([]);
65+
const [allConflicts, setAllConflicts] = useState<Conflict[]>(
66+
[] as Conflict[]
67+
);
5268

5369
useEffect(() => {
54-
console.log("Updated contacts:", tableEntries);
55-
}, [tableEntries]);
56-
57-
function updateEntry<K extends keyof UpdateData>(
58-
id: number,
59-
key: string,
60-
value: UpdateData[K]
61-
) {
62-
setTableEntries((prev) =>
63-
prev.map((entry) =>
64-
entry.ROWID === id ? { ...entry, [key]: value } : entry
65-
)
66-
);
70+
console.log("addconflicts", allConflicts);
71+
}, [allConflicts]);
72+
73+
function addConflict(conflicts: Conflict) {
74+
setAllConflicts((prev) => {
75+
const newConflicts = [...prev];
76+
newConflicts.push(conflicts);
77+
return newConflicts;
78+
});
6779
}
6880

69-
function updateEntry2(id: number, value: UpdateData) {
70-
setTableEntries((prev) =>
71-
prev.map((entry) => (entry.ROWID === id ? { ...value } : entry))
72-
);
81+
function removeConflict(id: number) {
82+
console.log("id", id);
83+
setAllConflicts((prev) => {
84+
const newConflicts = [...prev];
85+
newConflicts.splice(id, 1);
86+
return newConflicts;
87+
});
88+
}
89+
90+
function updateConflict(id: number, fields: Conflict) {
91+
setAllConflicts((prev) => {
92+
const updatedConflicts = [...prev];
93+
updatedConflicts[id] = fields;
94+
return updatedConflicts;
95+
});
7396
}
7497

75-
function addEntry(entry: UpdateData) {
76-
console.log("entry", entry);
98+
function updateEntry(id: number, value: FullDataType) {
7799
setTableEntries((prev) => {
78-
const newEntry: UpdateData = {
100+
const updatedEntries = [...prev];
101+
updatedEntries[id] = value;
102+
return updatedEntries;
103+
});
104+
}
105+
106+
function addEntry(entry: FullDataType) {
107+
setTableEntries((prev) => {
108+
const newEntry: FullDataType = {
79109
...entry,
80110
};
81111

@@ -84,12 +114,54 @@ export const TableDataFormProvider = ({
84114
console.log("tableEntries", tableEntries);
85115
}
86116

117+
function removePass(id: number) {
118+
const updatedPasses: GPTResponse[] = [];
119+
for (let i = 0; i < initialGPTPasses.length; i++) {
120+
if (i !== id) {
121+
updatedPasses.push(initialGPTPasses[i]);
122+
}
123+
}
124+
return updatedPasses;
125+
}
126+
87127
function removeEntry(id: number) {
88-
setTableEntries((prev) => prev.filter((entry) => entry.ROWID !== id));
128+
const newEntries = tableEntries.filter(
129+
(entry) => tableEntries[id] !== entry
130+
);
131+
setTableEntries(newEntries);
132+
}
133+
134+
function setRedConflict(id: number, fields: string[]) {
135+
if (!redConflicts.find((conflict) => conflict.id === id)) {
136+
setRedConflicts((prev) => {
137+
const newConflict: RedConflicts = {
138+
id: id,
139+
fields: [...fields],
140+
};
141+
return [...prev, newConflict];
142+
});
143+
} else {
144+
setRedConflicts((prev) => {
145+
const newConflicts = prev.map((conflict) => {
146+
if (conflict.id === id) {
147+
return {
148+
id: id,
149+
fields: [...fields],
150+
};
151+
}
152+
return conflict;
153+
});
154+
return newConflicts.filter((conflict) => conflict.fields.length > 0);
155+
});
156+
}
89157
}
90158

91-
function retrieveEntry(id: number) {
92-
return tableEntries.find((entry) => entry.ROWID === id);
159+
function removeRedConflict(id: number) {
160+
setRedConflicts((prev) => {
161+
const newConflicts = prev.filter((conflict) => conflict.id !== id);
162+
console.log("newConflicts", newConflicts);
163+
return newConflicts;
164+
});
93165
}
94166

95167
return (
@@ -98,11 +170,17 @@ export const TableDataFormProvider = ({
98170
initialGPTPasses,
99171
setInitialGPTPasses,
100172
tableEntries,
101-
updateEntry,
102173
addEntry,
174+
removePass,
175+
updateEntry,
176+
redConflicts,
177+
setRedConflict,
178+
removeRedConflict,
103179
removeEntry,
104-
retrieveEntry,
105-
updateEntry2,
180+
allConflicts,
181+
addConflict,
182+
removeConflict,
183+
updateConflict,
106184
}}
107185
>
108186
{children}

0 commit comments

Comments
 (0)