Skip to content

Commit ac4a0cf

Browse files
Hotfix release (#14)
* The percentage for the inner annotator is not rounded to 2 * Embeddings on the active learning does not have space between * On the users page, the old users have cards, but their data is not displayed * Refresh on heuristics has sometimes issues * Without any projects, if you upload a snapshot, there is an app error * Removed second websocket hook * Fixed issue for ws for projects * Submodules * Submodules * Removed unused import * Reinit submodules * Reinit submodules * Commit after readding the drone * Test after changed public drone * PR comment * PR comments * PR comments * PR comments * Small fix for duplicate projects * Submodules merge
1 parent 98c156e commit ac4a0cf

File tree

13 files changed

+45
-37
lines changed

13 files changed

+45
-37
lines changed

src/components/projects/projectId/heuristics/heuristicId/active-learning/ActiveLearning.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,13 +217,13 @@ export default function ActiveLearning() {
217217

218218
return (
219219
<HeuristicsLayout updateSourceCode={(code) => updateSourceCodeToDisplay(code)}>
220+
220221
{currentHeuristic && <div>
221222
<div className="relative flex-shrink-0 min-h-16 flex justify-between pb-2">
222223
<div className="flex items-center flex-wrap mt-3">
223224
<div className="text-sm leading-5 font-medium text-gray-700 inline-block mr-2">Editor</div>
224225
<Tooltip content={TOOLTIPS_DICT.LABELING_FUNCTION.LABELING_TASK} color="invert" placement="top">
225226
<Dropdown2 options={labelingTasks} buttonName={currentHeuristic?.labelingTaskName} selectedOption={(option: any) => saveHeuristic(option)} dropdownClasses="z-30" />
226-
227227
</Tooltip>
228228
{currentHeuristic.labels?.length == 0 ? (<div className="text-sm font-normal text-gray-500 ml-3">No labels for target task</div>) : <>
229229
{currentHeuristic.labels?.map((label: any, index: number) => (
@@ -243,17 +243,17 @@ export default function ActiveLearning() {
243243
<div className="text-sm leading-5 font-medium text-gray-700 inline-block mr-2">Embeddings</div>
244244
{embeddingsFiltered.map((embedding: Embedding, index: number) => <Fragment key={embedding.id}>
245245
{embedding.state == Status.FINISHED && <Tooltip content={TOOLTIPS_DICT.GENERAL.CLICK_TO_COPY} color="invert" placement="top">
246-
<span className="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-700 cursor-pointer" onClick={() => copyToClipboard(embedding.name)}>
246+
<span className="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-700 cursor-pointer mr-2" onClick={() => copyToClipboard(embedding.name)}>
247247
{embedding.name}
248248
</span>
249249
</Tooltip>}
250250
{embedding.state == Status.FAILED && <Tooltip content={TOOLTIPS_DICT.LABELING_FUNCTION.CLICK_TO_COPY_ERROR} color="invert" placement="top">
251-
<span className="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-700 cursor-pointer" onClick={() => copyToClipboard(embedding.name)}>
251+
<span className="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-700 cursor-pointer mr-2" onClick={() => copyToClipboard(embedding.name)}>
252252
{embedding.name}
253253
</span>
254254
</Tooltip>}
255-
{(embedding.state != Status.FINISHED && embedding.state != Status.FAILED) && <Tooltip content={TOOLTIPS_DICT.LABELING_FUNCTION.CLICK_TO_COPY_ERROR} color="invert" placement="top">
256-
<span className="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-700 cursor-pointer" onClick={() => copyToClipboard(embedding.name)}>
255+
{(embedding.state != Status.FINISHED && embedding.state != Status.FAILED) && <Tooltip content={TOOLTIPS_DICT.LABELING_FUNCTION.CLICK_TO_COPY_RUNNING} color="invert" placement="top">
256+
<span className="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-700 cursor-pointer mr-2" onClick={() => copyToClipboard(embedding.name)}>
257257
{embedding.name}
258258
</span>
259259
</Tooltip>}

src/components/projects/projectId/heuristics/modals/AddZeroShotModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export default function AddZeroShotModal() {
5252
}, [attributes]);
5353

5454
useEffect(() => {
55-
if (!project.tokenizer) return;
55+
if (!project || !project.tokenizer || !models) return;
5656
const language = project.tokenizer.split("_")[0];
5757
const modelsFiltered = models.filter(model => model.language == language).sort((a, b) => a.prio - b.prio);
5858
dispatch(setCache(CacheEnum.ZERO_SHOT_RECOMMENDATIONS, modelsFiltered));

src/components/projects/projectId/overview/ProjectOverviewCards.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default function ProjectOverviewCards(props: ProjectOverviewCardsProps) {
4747
{props.projectStats.generalStats[card.stats]}
4848
</p>}
4949
{card.stats == CardStatsEnum.INTER_ANNOTATOR && <p className="text-2xl font-semibold text-gray-900">
50-
{props.projectStats.interAnnotatorStat == -1 ? NOT_AVAILABLE : (props.projectStats.interAnnotatorStat * 100 + '%')}
50+
{props.projectStats.interAnnotatorStat == -1 ? NOT_AVAILABLE : props.projectStats.interAnnotatorStat}
5151
</p>}
5252
</Tooltip>
5353
</>

src/components/projects/projectId/settings/embeddings/DeleteEmbeddingModal.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { removeFromAllEmbeddingsById } from "@/src/reduxStore/states/pages/setti
44
import { selectProjectId } from "@/src/reduxStore/states/project";
55
import { DELETE_EMBEDDING, DELETE_FROM_TASK_QUEUE } from "@/src/services/gql/mutations/project-settings";
66
import { ModalButton, ModalEnum } from "@/src/types/shared/modal";
7-
import { jsonCopy } from "@/submodules/javascript-functions/general";
87
import { useMutation } from "@apollo/client";
98
import { useCallback, useEffect, useState } from "react";
109
import { useDispatch, useSelector } from "react-redux";

src/components/shared/layout/Layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { GET_ALL_ACTIVE_ADMIN_MESSAGES, NOTIFICATIONS_BY_USER } from "@/src/serv
55
import { Fragment, useCallback, useEffect, useState } from "react";
66
import { NotificationLevel } from "@/src/types/shared/notification-center";
77
import { IconAlertTriangleFilled, IconCircleCheckFilled, IconInfoCircleFilled } from "@tabler/icons-react";
8-
import { CurrentPage } from "@/src/types/shared/general";
98
import { useDispatch, useSelector } from "react-redux";
109
import { selectUser } from "@/src/reduxStore/states/general";
1110
import { interval } from "rxjs";
@@ -20,6 +19,7 @@ import { postProcessNotificationsUser } from "@/src/util/shared/notification-cen
2019
import { useWebsocket } from "@/src/services/base/web-sockets/useWebsocket";
2120
import { useRouter } from "next/router";
2221
import { selectProjectId } from "@/src/reduxStore/states/project";
22+
import { CurrentPage } from "@/src/types/shared/general";
2323

2424
const MIN_WIDTH = 1250;
2525

src/components/shared/upload/ModalUpload.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default function ModalUpload(props: UploadProps) {
1919
const [projectName, setProjectName] = useState<string>("");
2020
const [isProjectTitleDuplicate, setProjectTitleDuplicate] = useState<boolean>(false);
2121
const [startUpload, setStartUpload] = useState<boolean>(false);
22+
const [isFileUploaded, setIsFileUploaded] = useState<boolean>(false);
2223

2324
const submitUpload = useCallback(() => {
2425
if (isProjectTitleDuplicate) return;
@@ -27,9 +28,9 @@ export default function ModalUpload(props: UploadProps) {
2728
setProjectName("");
2829
setStartUpload(false);
2930
});
30-
}, []);
31+
}, [isProjectTitleDuplicate]);
3132

32-
const [acceptButton, setAcceptButton] = useState<ModalButton>({ ...ACCEPT_BUTTON, emitFunction: submitUpload });
33+
const [acceptButton, setAcceptButton] = useState<ModalButton>(ACCEPT_BUTTON);
3334
const [uploadOptions, setUploadOptions] = useState<UploadOptions>(null);
3435

3536
const title = getTitle(uploadFileType);
@@ -49,6 +50,10 @@ export default function ModalUpload(props: UploadProps) {
4950
});
5051
}, [projectName, props.uploadOptions, uploadFileType]);
5152

53+
useEffect(() => {
54+
setAcceptButton({ ...acceptButton, disabled: isFileUploaded && !isProjectTitleDuplicate ? false : true, emitFunction: submitUpload });
55+
}, [isFileUploaded, isProjectTitleDuplicate, submitUpload]);
56+
5257

5358
function checkIfProjectNameDuplicate(value: string) {
5459
setProjectTitleDuplicate(projects.some(project => project.name == value));
@@ -79,7 +84,7 @@ export default function ModalUpload(props: UploadProps) {
7984
</div>
8085
)}
8186
<Upload uploadOptions={uploadOptions} startUpload={startUpload} isFileUploaded={(isFileUploaded: boolean) => {
82-
setAcceptButton({ ...acceptButton, disabled: isFileUploaded ? false : true });
87+
setIsFileUploaded(isFileUploaded);
8388
}} closeModalEvent={props.closeModalEvent} />
8489
</Modal>
8590
);

src/components/shared/upload/Upload.tsx

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { UploadFileType, UploadProps, UploadState, UploadStates, UploadTask, UploadType } from "@/src/types/shared/upload";
22
import { useDispatch, useSelector } from "react-redux";
33
import UploadField from "./helper-components/UploadField";
4-
import { useEffect, useState } from "react";
4+
import { useCallback, useEffect, useState } from "react";
55
import UploadWrapper from "./helper-components/UploadWrapper";
66
import { selectUploadData, setImportOptions } from "@/src/reduxStore/states/upload";
77
import { useLazyQuery, useMutation } from "@apollo/client";
88
import { CREATE_PROJECT, DELETE_PROJECT, UPDATE_PROJECT_STATUS, UPDATE_PROJECT_TOKENIZER } from "@/src/services/gql/mutations/projects";
99
import { ProjectStatus } from "@/src/types/components/projects/projects-list";
1010
import { timer } from "rxjs";
1111
import { uploadFile } from "@/src/services/base/s3-service";
12-
import { CurrentPage } from "@/src/types/shared/general";
12+
import { CurrentPage, CurrentPageSubKey } from "@/src/types/shared/general";
1313
import { jsonCopy } from "@/submodules/javascript-functions/general";
1414
import { useRouter } from "next/router";
1515
import { extendAllProjects, removeFromAllProjectsById, selectAllProjects, selectProjectId } from "@/src/reduxStore/states/project";
@@ -53,7 +53,7 @@ export default function Upload(props: UploadProps) {
5353
const [getUploadTaskId] = useLazyQuery(GET_UPLOAD_TASK_BY_TASK_ID, { fetchPolicy: 'network-only' });
5454

5555
useEffect(() => {
56-
if (!props.uploadOptions.tokenizerValues) return;
56+
if (!props.uploadOptions || !props.uploadOptions.tokenizerValues) return;
5757
const tokenizerValuesDisplay = [...props.uploadOptions.tokenizerValues];
5858
tokenizerValuesDisplay.forEach((tokenizer: any, index: number) => {
5959
const tokenizerNameContainsBrackets = tokenizer.name.includes('(') && tokenizer.name.includes(')');
@@ -62,7 +62,7 @@ export default function Upload(props: UploadProps) {
6262
tokenizerValuesDisplay[index] = tokenizerCopy;
6363
});
6464
setPrepareTokenizedValues(tokenizerValuesDisplay);
65-
}, [props.uploadOptions.tokenizerValues]);
65+
}, [props.uploadOptions]);
6666

6767
useEffect(() => {
6868
if (props.startUpload) {
@@ -75,7 +75,7 @@ export default function Upload(props: UploadProps) {
7575
props.isFileUploaded(selectedFile != null);
7676
}, [selectedFile]);
7777

78-
function handleWebsocketNotification(msgParts: string[]) {
78+
const handleWebsocketNotification = useCallback((msgParts: string[]) => {
7979
const uploadTask = UploadHelper.getUploadTask();
8080
const projectId = UploadHelper.getProjectId();
8181
if (!uploadTask) return;
@@ -114,11 +114,11 @@ export default function Upload(props: UploadProps) {
114114
} else {
115115
console.log("unknown websocket message in part 3:" + msgParts[3], "full message:", msgParts)
116116
}
117-
}
117+
}, [props.uploadOptions?.deleteProjectOnFail, props.uploadOptions?.reloadOnFinish]);
118118

119119
function submitUpload() {
120120
setSubmitted(true);
121-
if (!selectedFile) return;
121+
if (!selectedFile || isProjectTitleDuplicate || isProjectTitleEmpty) return;
122122
if (uploadFileType == UploadFileType.RECORDS_NEW) {
123123
if (projectTitle.trim() == "") {
124124
setIsProjectTitleEmpty(true);
@@ -219,7 +219,7 @@ export default function Upload(props: UploadProps) {
219219
UploadHelper.setUploadTask(task);
220220
if (task.state == UploadStates.DONE || task.progress == 100) {
221221
clearUploadTask();
222-
if (props.uploadOptions.reloadOnFinish) location.reload();
222+
if (props.uploadOptions && props.uploadOptions.reloadOnFinish) location.reload();
223223
else setUploadStarted(false);
224224
router.push('/projects/' + UploadHelper.getProjectId() + '/settings');
225225
}
@@ -253,11 +253,11 @@ export default function Upload(props: UploadProps) {
253253
if (findProjectName) setIsProjectTitleDuplicate(true);
254254
else setIsProjectTitleDuplicate(false);
255255
}
256-
256+
useWebsocket(CurrentPage.PROJECTS, handleWebsocketNotification, null, CurrentPageSubKey.FILE_UPLOAD);
257257
useWebsocket(CurrentPage.UPLOAD_RECORDS, handleWebsocketNotification, UploadHelper.getProjectId());
258258

259-
return (
260-
<section className={`${!props.uploadOptions.isModal ? 'p-4' : ''}`}>
259+
return <>
260+
{props.uploadOptions && <section className={`${!props.uploadOptions.isModal ? 'p-4' : ''}`}>
261261
{uploadFileType == UploadFileType.PROJECT && (<>
262262
<UploadField isFileCleared={selectedFile == null} uploadStarted={uploadStarted} doingSomething={doingSomething} progressState={progressState} sendSelectedFile={(file) => {
263263
setSelectedFile(file);
@@ -270,7 +270,7 @@ export default function Upload(props: UploadProps) {
270270
{props.uploadOptions.showBadPasswordMsg && (<div className="text-red-700 text-xs mt-2 text-center">Wrong password</div>)}
271271
</>
272272
)}
273-
{uploadFileType == UploadFileType.RECORDS_NEW && (<>
273+
{uploadFileType == UploadFileType.RECORDS_NEW && (<div className="min-h-full h-[calc(100vh-7rem)] overflow-y-auto">
274274
<div className="form-control">
275275
<label className="text-gray-500 text-sm font-normal">Project title</label>
276276
<div className="flex flex-row">
@@ -303,25 +303,25 @@ export default function Upload(props: UploadProps) {
303303
isModal={props.uploadOptions.isModal} submitUpload={submitUpload} sendSelectedFile={(file) => {
304304
setSelectedFile(file);
305305
}} setKey={(key) => setKey(key)} />
306-
</>
306+
</div>
307307
)}
308308

309-
{uploadFileType == UploadFileType.RECORDS_ADD && (<>
309+
{uploadFileType == UploadFileType.RECORDS_ADD && (<div className="min-h-full h-[calc(100vh-7rem)] overflow-y-auto">
310310
<div className="text-lg leading-6 text-gray-900 font-medium inline-block">
311311
Record upload
312312
</div>
313313
<div className="text-sm text-gray-500 font-normal mt-2">Add additional records to your project</div>
314314
<UploadWrapper uploadStarted={uploadStarted} doingSomething={doingSomething} progressState={progressState} submitted={submitted} isFileCleared={selectedFile == null}
315315
isModal={props.uploadOptions.isModal} submitUpload={submitUpload} sendSelectedFile={(file) => {
316316
setSelectedFile(file);
317-
}} setKey={(key) => setKey(key)} /></>)}
317+
}} setKey={(key) => setKey(key)} /></div>)}
318318

319319
{uploadFileType == UploadFileType.KNOWLEDGE_BASE && (
320320
<UploadWrapper uploadStarted={uploadStarted} doingSomething={doingSomething} progressState={progressState} submitted={submitted} isFileCleared={selectedFile == null}
321321
isModal={props.uploadOptions.isModal} submitUpload={submitUpload} sendSelectedFile={(file) => {
322322
setSelectedFile(file);
323323
}} setKey={(key) => setKey(key)} />)
324324
}
325-
</section >
326-
)
325+
</section >}
326+
</>
327327
}

src/components/users/UsersList.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { selectAnnotators, selectEngineers, selectExperts, selectInactiveOrganiz
22
import { useSelector } from "react-redux"
33
import YoutubeIntroduction from "../projects/YoutubeIntroduction";
44
import { User } from "@/src/types/shared/general";
5-
import { IconCheck, IconUsersGroup } from "@tabler/icons-react";
5+
import { IconUsersGroup } from "@tabler/icons-react";
6+
import { UNKNOWN_USER } from "@/src/util/constants";
67

78
export default function UsersList() {
89
const isManaged = useSelector(selectIsManaged);
@@ -196,7 +197,7 @@ export default function UsersList() {
196197
<div className="min-w-0 flex-1">
197198
<a className="focus:outline-none">
198199
<span className="absolute inset-0" aria-hidden="true"></span>
199-
<p className="text-sm font-medium text-gray-900">{user.firstName} {user.lastName}</p>
200+
<p className="text-sm font-medium text-gray-900">{user.firstName && user.lastName ? user.firstName + ' ' + user.lastName : UNKNOWN_USER}</p>
200201
<p className="truncate text-sm text-gray-500">{user.mail}</p>
201202
</a>
202203
</div>
@@ -223,7 +224,7 @@ export default function UsersList() {
223224
<div className="min-w-0 flex-1">
224225
<a className="focus:outline-none">
225226
<span className="absolute inset-0" aria-hidden="true"></span>
226-
<p className="text-sm font-medium text-gray-900">{user.firstName} {user.lastName}</p>
227+
<p className="text-sm font-medium text-gray-900">{user.firstName && user.lastName ? user.firstName + ' ' + user.lastName : UNKNOWN_USER}</p>
227228
<p className="truncate text-sm text-gray-500">{user.mail}</p>
228229
</a>
229230
</div>
@@ -259,7 +260,7 @@ export default function UsersList() {
259260
<div className="min-w-0 flex-1">
260261
<a className="focus:outline-none">
261262
<span className="absolute inset-0" aria-hidden="true"></span>
262-
<p className="text-sm font-medium text-gray-900">{user.firstName} {user.lastName}</p>
263+
<p className="text-sm font-medium text-gray-900">{user.firstName && user.lastName ? user.firstName + ' ' + user.lastName : UNKNOWN_USER}</p>
263264
<p className="truncate text-sm text-gray-500">{user.mail}</p>
264265
</a>
265266
</div>

src/services/base/web-sockets/useWebsocket.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ export function useWebsocket(currentPage: CurrentPage, handleFunction: (msgParts
2929
const WHITELIST_LOOKUP = {
3030
[CurrentPage.PROJECTS]: {
3131
[CurrentPageSubKey.NONE]: ['project_created', 'project_deleted', 'project_update', 'file_upload'],
32-
[CurrentPageSubKey.BUTTONS_CONTAINER]: ['bad_password']
32+
[CurrentPageSubKey.BUTTONS_CONTAINER]: ['bad_password'],
33+
[CurrentPageSubKey.FILE_UPLOAD]: ['file_upload']
3334
},
3435
[CurrentPage.UPLOAD_RECORDS]: {
3536
[CurrentPageSubKey.NONE]: ['file_upload']

src/types/components/projects/projectId/project-overview/project-overview.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export type ProjectStats = {
77
generalStats: {};
88
interAnnotatorLoading: boolean;
99
interAnnotator: string;
10-
interAnnotatorStat: number;
10+
interAnnotatorStat: number | string;
1111
tooltipsArray?: any;
1212
};
1313

0 commit comments

Comments
 (0)