Skip to content

Commit ffbe3a3

Browse files
Kern table improvements
1 parent d197242 commit ffbe3a3

File tree

14 files changed

+282
-408
lines changed

14 files changed

+282
-408
lines changed

src/components/models-download/ModelsDownload.tsx

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { selectModelsDownloaded, setModelsDownloaded } from "@/src/reduxStore/states/pages/models-downloaded";
22
import { useRouter } from "next/router";
3-
import { useCallback, useEffect, useState } from "react";
3+
import { useCallback, useEffect, useMemo, useState } from "react";
44
import { useDispatch, useSelector } from "react-redux";
55
import { openModal, setModalStates } from "@/src/reduxStore/states/modal";
66
import { ModalEnum } from "@/src/types/shared/modal";
@@ -23,20 +23,15 @@ export default function ModelsDownload() {
2323
const isAdmin = useSelector(selectIsAdmin);
2424
const modelsDownloaded = useSelector(selectModelsDownloaded);
2525

26-
const [preparedValues, setPreparedValues] = useState([]);
27-
2826
useEffect(() => {
2927
refetchModels();
3028
}, []);
3129

32-
useEffect(() => {
33-
if (!modelsDownloaded) return;
34-
setPreparedValues(prepareTableBodyModelsDownload(modelsDownloaded, openDeleteModal, isAdmin));
35-
}, [modelsDownloaded]);
36-
37-
function openDeleteModal(model) {
30+
const openDeleteModal = useCallback((model) => {
3831
dispatch(setModalStates(ModalEnum.DELETE_MODEL_DOWNLOAD, { modelName: model.name, open: true }));
39-
}
32+
}, []);
33+
34+
const preparedValues = useMemo(() => prepareTableBodyModelsDownload(modelsDownloaded, openDeleteModal, isAdmin), [modelsDownloaded, isAdmin]);
4035

4136
function refetchModels() {
4237
getModelProviderInfo((res) => {

src/components/projects/projectId/heuristics/heuristicId/shared/HeuristicStatistics.tsx

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,29 @@
11
import { selectHeuristic } from "@/src/reduxStore/states/pages/heuristics"
22
import { HEURISTICS_STATISTICS_TABLE_COLUMNS, prepareTableBodyHeuristicStatistics } from "@/src/util/table-preparations/heuristic-statistics";
33
import KernTable from "@/submodules/react-components/components/kern-table/KernTable";
4-
import { useEffect, useState } from "react";
4+
import { useEffect, useMemo, useState } from "react";
55
import { useSelector } from "react-redux"
66

77
export default function HeuristicStatistics() {
88
const currentHeuristic = useSelector(selectHeuristic);
99

10-
const [preparedValues, setPreparedValues] = useState([]);
11-
12-
useEffect(() => {
13-
setPreparedValues(prepareTableBodyHeuristicStatistics(currentHeuristic.stats));
14-
}, [currentHeuristic]);
10+
const preparedValues = useMemo(() => {
11+
if (!currentHeuristic) return [];
12+
return prepareTableBodyHeuristicStatistics(currentHeuristic.stats);
13+
}, [currentHeuristic?.sourceStatistics]);
1514

1615
return (
1716
<div className="mt-8">
1817
<div className="text-sm leading-5 font-medium text-gray-700 inline-block">Statistics</div>
1918
<div className="mt-1 flex flex-col">
20-
<div className="overflow-x-auto">
21-
<div className="inline-block min-w-full py-2 align-middle">
22-
<div className="overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg">
23-
<KernTable
24-
headers={HEURISTICS_STATISTICS_TABLE_COLUMNS}
25-
values={preparedValues}
26-
/>
27-
</div>
19+
<div className="inline-block min-w-full py-2 align-middle">
20+
<div className="overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg">
21+
<KernTable
22+
headers={HEURISTICS_STATISTICS_TABLE_COLUMNS}
23+
values={preparedValues}
24+
/>
2825
</div>
29-
</div >
26+
</div>
3027
</div>
3128
</div>
3229
)

src/components/projects/projectId/playground/EvaluationGroups.tsx

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import CreateEvaluationGroupModal from "./CreateEvaluationGroupModal";
33
import { ModalEnum } from "@/src/types/shared/modal";
44
import { useDispatch, useSelector } from "react-redux";
55
import { selectProjectId } from "@/src/reduxStore/states/project";
6-
import { useEffect, useState, useRef, useLayoutEffect, useCallback, useMemo } from "react";
6+
import { useEffect, useState, useRef, useCallback, useMemo } from "react";
77
import { getEvaluationGroups, getEvaluationSetsByGroupId } from "@/src/services/base/playground";
88
import ViewEvaluationGroupModal from "./ViewEvaluationGroupModal";
99
import KernTable from "@/submodules/react-components/components/kern-table/KernTable";
@@ -20,13 +20,9 @@ export function EvaluationGroups() {
2020
const users = useSelector(selectAllUsers);
2121

2222
const [evaluationGroups, setEvaluationGroups] = useState(null);
23-
const [preparedValues, setPreparedValues] = useState(null);
24-
const [preparedHeaders, setPreparedHeaders] = useState(EVALUATION_GROUPS_TABLE_HEADER);
2523
const [selectedEvaluationGroups, setSelectedEvaluationGroups] = useState(new Set<string>());
2624
const isFetchingEvalGroups = useRef(false);
2725
const [checked, setChecked] = useState(false);
28-
const [indeterminate, setIndeterminate] = useState(false);
29-
const checkbox = useRef<any>(null);
3026

3127
const usersDict = useMemo(() => arrayToDict(users, 'id'), [users]);
3228

@@ -40,52 +36,38 @@ export function EvaluationGroups() {
4036
});
4137
}, [projectId]);
4238

43-
useLayoutEffect(() => {
44-
if (!selectedEvaluationGroups || !evaluationGroups) return;
45-
const isIndeterminate = selectedEvaluationGroups.size > 0 && selectedEvaluationGroups.size < evaluationGroups.length;
46-
setChecked(selectedEvaluationGroups.size > 0 && selectedEvaluationGroups.size === evaluationGroups.length);
47-
setIndeterminate(isIndeterminate);
48-
49-
if (checkbox.current !== null) {
50-
checkbox.current.indeterminate = isIndeterminate;
51-
}
52-
}, [selectedEvaluationGroups, evaluationGroups]);
39+
const refetchEvaluationGroups = useCallback(() => {
40+
getEvaluationGroups(projectId, (res) => {
41+
setEvaluationGroups(res);
42+
setSelectedEvaluationGroups(new Set<string>());
43+
});
44+
}, [projectId]);
5345

54-
useEffect(() => {
55-
if (!evaluationGroups) return;
56-
setPreparedValues(prepareTableBodyEvaluationGroups(evaluationGroups, selectedEvaluationGroups, setSelectedEvaluationGroups, usersDict, viewSetsModal));
57-
}, [evaluationGroups, selectedEvaluationGroups, setSelectedEvaluationGroups]);
46+
const toggleAll = useCallback(() => {
47+
if (!evaluationGroups || evaluationGroups.length === 0) return;
48+
if (checked) setSelectedEvaluationGroups(new Set<string>());
49+
else setSelectedEvaluationGroups(new Set<string>(evaluationGroups.map(x => x.id)));
50+
setChecked(!checked);
51+
}, [checked, evaluationGroups]);
5852

59-
function viewSetsModal(groupId: string) {
53+
const viewSetsModal = useCallback((groupId: string) => {
6054
let setsArr = [];
6155
getEvaluationSetsByGroupId(projectId, groupId, (res) => {
6256
setsArr = res;
6357
dispatch(setModalStates(ModalEnum.VIEW_EVALUATION_GROUP, { open: true, sets: setsArr }));
6458
});
65-
}
66-
67-
useEffect(() => {
68-
setPreparedHeaders(preparedHeaders.map((header) => {
69-
if (header.id === "checkboxes") {
70-
return { ...header, hasCheckboxes: true, checked: checked, onChange: toggleAll };
71-
}
72-
return header;
73-
}))
74-
}, [checked, evaluationGroups, selectedEvaluationGroups])
75-
76-
const refetchEvaluationGroups = useCallback(() => {
77-
getEvaluationGroups(projectId, (res) => {
78-
setEvaluationGroups(res);
79-
setSelectedEvaluationGroups(new Set<string>());
80-
});
8159
}, [projectId]);
8260

83-
function toggleAll() {
84-
if (checked || indeterminate) setSelectedEvaluationGroups(new Set<string>());
85-
else setSelectedEvaluationGroups(new Set<string>(evaluationGroups.map(x => x.id)));
86-
setChecked(!checked && !indeterminate)
87-
setIndeterminate(false)
88-
}
61+
const preparedValues = useMemo(() => {
62+
if (!evaluationGroups) return null;
63+
return prepareTableBodyEvaluationGroups(evaluationGroups, selectedEvaluationGroups, setSelectedEvaluationGroups, usersDict, viewSetsModal);
64+
}, [evaluationGroups, selectedEvaluationGroups, setSelectedEvaluationGroups, usersDict]);
65+
66+
const finalHeaders = useMemo(() => EVALUATION_GROUPS_TABLE_HEADER.map((group) => {
67+
if (!selectedEvaluationGroups || !evaluationGroups) return;
68+
if (group.id === "checkboxes") return { ...group, checked: selectedEvaluationGroups.size === evaluationGroups.length, onChange: toggleAll };
69+
return group;
70+
}), [selectedEvaluationGroups, evaluationGroups]);
8971

9072
return <>
9173
{projectId != null && <div className="p-4 bg-gray-100 h-full flex-1 flex flex-col overflow-y-auto">
@@ -114,9 +96,9 @@ export function EvaluationGroups() {
11496
</div>
11597
}
11698
</div>
117-
{preparedHeaders && preparedValues && (evaluationGroups.length > 0 ?
99+
{finalHeaders && preparedValues && (evaluationGroups.length > 0 ?
118100
<KernTable
119-
headers={preparedHeaders}
101+
headers={finalHeaders}
120102
values={preparedValues}
121103
config={EVALUATION_GROUPS_TABLE_CONFIG}
122104
/>

src/components/projects/projectId/playground/EvaluationRuns.tsx

Lines changed: 23 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useDispatch, useSelector } from "react-redux";
55
import { selectProjectId } from "@/src/reduxStore/states/project";
66
import KernTable from "@/submodules/react-components/components/kern-table/KernTable";
77
import { EVALUATION_RUN_TABLE_CONFIG, EVALUATION_RUN_TABLE_HEADER, prepareTableBodyEvaluationRun } from "@/src/util/table-preparations/evaluation-runs";
8-
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
8+
import { useCallback, useEffect, useMemo, useState } from "react";
99
import { getEvaluationGroups, getEvaluationRuns } from "@/src/services/base/playground";
1010
import { selectAllUsers } from "@/src/reduxStore/states/general";
1111
import { arrayToDict } from "@/submodules/javascript-functions/general";
@@ -23,17 +23,13 @@ export default function EvaluationRuns() {
2323
const usersDict = arrayToDict(users, 'id');
2424
const onAttributeEmbeddings = useSelector(selectOnAttributeEmbeddings);
2525

26-
const [preparedValues, setPreparedValues] = useState(null);
2726
const [evaluationRuns, setEvaluationRuns] = useState(null);
2827
const [evaluationGroups, setEvaluationGroups] = useState([]);
2928
const [evaluationDict, setEvaluationDict] = useState(null);
3029
const [embeddingsDict, setEmbeddingsDict] = useState(null);
3130
const [refetchTrigger, setRefetchTrigger] = useState(false)
32-
const [preparedHeaders, setPreparedHeaders] = useState(EVALUATION_RUN_TABLE_HEADER);
3331
const [selectedEvaluationRuns, setSelectedEvaluationRuns] = useState(new Set<string>());
3432
const [checked, setChecked] = useState(false);
35-
const [indeterminate, setIndeterminate] = useState(false);
36-
const checkbox = useRef<any>(null);
3733

3834
useEffect(() => {
3935
if (!projectId) return;
@@ -51,48 +47,35 @@ export default function EvaluationRuns() {
5147
setEmbeddingsDict(arrayToDict(onAttributeEmbeddings, 'id'));
5248
}, [onAttributeEmbeddings]);
5349

54-
useLayoutEffect(() => {
55-
if (!selectedEvaluationRuns || !evaluationRuns) return;
56-
const isIndeterminate = selectedEvaluationRuns.size > 0 && selectedEvaluationRuns.size < evaluationRuns.length;
57-
setChecked(selectedEvaluationRuns.size > 0 && selectedEvaluationRuns.size === evaluationRuns.length);
58-
setIndeterminate(isIndeterminate);
59-
60-
if (checkbox.current !== null) {
61-
checkbox.current.indeterminate = isIndeterminate;
62-
}
63-
}, [selectedEvaluationRuns, evaluationRuns]);
64-
65-
useEffect(() => {
66-
if (!evaluationRuns || !evaluationDict || !embeddingsDict) return;
67-
setPreparedValues(prepareTableBodyEvaluationRun(evaluationRuns, usersDict, embeddingsDict, evaluationDict, navigateToDetails, selectedEvaluationRuns, setSelectedEvaluationRuns));
68-
}, [evaluationRuns, evaluationDict, embeddingsDict, selectedEvaluationRuns, setSelectedEvaluationRuns]);
69-
70-
useEffect(() => {
71-
setPreparedHeaders(preparedHeaders.map((header) => {
72-
if (header.id === "checkboxes") {
73-
return { ...header, hasCheckboxes: true, checked: checked, onChange: toggleAll };
74-
}
75-
return header;
76-
}))
77-
}, [checked, evaluationGroups, selectedEvaluationRuns])
78-
7950
const refetchEvaluationRuns = useCallback(() => {
8051
getEvaluationRuns(projectId, (res) => {
8152
setEvaluationRuns(res);
8253
setSelectedEvaluationRuns(new Set<string>());
8354
});
8455
}, [projectId]);
8556

86-
function toggleAll() {
87-
if (checked || indeterminate) setSelectedEvaluationRuns(new Set<string>());
57+
const navigateToDetails = useCallback((evaluationRunId: string) => {
58+
router.push(`/projects/${projectId}/playground/${evaluationRunId}`);
59+
}, [projectId]);
60+
61+
const toggleAll = useCallback(() => {
62+
if (!evaluationRuns || evaluationRuns.length === 0) return;
63+
if (checked) setSelectedEvaluationRuns(new Set<string>());
8864
else setSelectedEvaluationRuns(new Set<string>(evaluationRuns.map(x => x.id)));
89-
setChecked(!checked && !indeterminate)
90-
setIndeterminate(false)
91-
}
65+
setChecked(!checked);
66+
}, [checked, evaluationRuns]);
9267

93-
function navigateToDetails(evaluationRunId: string) {
94-
router.push(`/projects/${projectId}/playground/${evaluationRunId}`);
95-
}
68+
69+
const preparedValues = useMemo(() => {
70+
if (!evaluationRuns) return null;
71+
return prepareTableBodyEvaluationRun(evaluationRuns, usersDict, embeddingsDict, evaluationDict, navigateToDetails, selectedEvaluationRuns, setSelectedEvaluationRuns);
72+
}, [evaluationRuns, usersDict, embeddingsDict, evaluationDict, selectedEvaluationRuns, setSelectedEvaluationRuns]);
73+
74+
const finalHeaders = useMemo(() => EVALUATION_RUN_TABLE_HEADER.map((run) => {
75+
if (!selectedEvaluationRuns || !evaluationRuns) return;
76+
if (run.id === "checkboxes") return { ...run, checked: selectedEvaluationRuns.size === evaluationRuns.length, onChange: toggleAll };
77+
return run;
78+
}), [selectedEvaluationRuns, evaluationRuns]);
9679

9780
return <>
9881
{projectId != null && <div className="p-4 bg-gray-100 h-full flex-1 flex flex-col overflow-y-auto">
@@ -121,9 +104,9 @@ export default function EvaluationRuns() {
121104
</div>
122105
}
123106
</div >
124-
{preparedHeaders && preparedValues && (evaluationRuns.length > 0 ?
107+
{finalHeaders && preparedValues && (evaluationRuns.length > 0 ?
125108
<KernTable
126-
headers={preparedHeaders}
109+
headers={finalHeaders}
127110
values={preparedValues}
128111
config={EVALUATION_RUN_TABLE_CONFIG}
129112
/> :

0 commit comments

Comments
 (0)