web/src/components/task/task-sidebar-data/task-sidebar-data.tsx (117 lines of code) (raw):
// temporary_disabled_rules
/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-redeclare */
import React, { FC, Fragment, useRef, useState } from 'react';
import { CategoryDataAttributeWithValue } from 'api/typings';
import { TaxonomiesTree } from 'components/taxonomies/taxonomies-tree';
import { useTaxonomiesTree } from 'components/taxonomies/use-taxonomies-tree';
import { useHeight } from 'shared/hooks/use-height';
import { Annotation } from 'shared';
import { isEmpty } from 'lodash';
import { Blocker, SearchInput, Text, TextArea, LabeledInput, TextInput } from '@epam/loveship';
import { NoData } from 'shared/no-data';
import { useTaskAnnotatorContext } from 'connectors/task-annotator-connector/task-annotator-context';
import styles from './task-sidebar-data.module.scss';
type TaskSidebarDataProps = {
isCategoryDataEmpty: boolean;
annDataAttrs?: Record<number, CategoryDataAttributeWithValue[]>;
selectedAnnotation?: Annotation;
onDataAttributesChange: (elIndex: number, value: string) => void;
viewMode: boolean;
onAnnotationEdited: (
pageNum: number,
annotationId: string | number,
changes: Partial<Annotation>
) => void;
currentPage: number;
taxonomyId?: string;
};
export const TaskSidebarData: FC<TaskSidebarDataProps> = ({
annDataAttrs,
selectedAnnotation,
isCategoryDataEmpty,
onDataAttributesChange,
viewMode,
onAnnotationEdited,
currentPage,
taxonomyId
}) => {
const [searchText, setSearchText] = useState('');
const hightRef = useRef<HTMLDivElement>(null);
const taxonomiesHeight = useHeight({ ref: hightRef });
const { currentCell } = useTaskAnnotatorContext();
const { taxonomyNodes, expandNode, onLoadData, isLoading } = useTaxonomiesTree({
searchText,
taxonomyId
});
return (
<div className={styles['task-sidebar-data']}>
{currentCell && (
<div className={styles.cellInput}>
<LabeledInput label="Value">
<TextInput
value={currentCell?.text}
onValueChange={() => {}}
cx="c-m-t-5"
rawProps={{
style: {
width: '200px'
}
}}
/>
</LabeledInput>
</div>
)}
{isCategoryDataEmpty && (
<div className={styles['no-data']}>
<NoData title="The selected category doesn't have data attributes" />
</div>
)}
{annDataAttrs &&
selectedAnnotation &&
annDataAttrs[+selectedAnnotation.id] &&
annDataAttrs[+selectedAnnotation.id].map(({ name, type, value }, index) => {
if (type === 'taxonomy') {
return (
<Fragment key={index}>
<SearchInput
value={searchText}
onValueChange={(text) => setSearchText(text ? text : '')}
debounceDelay={300}
cx={styles.search}
/>
<div ref={hightRef} className={styles.tree}>
<TaxonomiesTree
isLoading={isLoading}
key={searchText}
taxonomiesHeight={taxonomiesHeight}
taxonomyNodes={taxonomyNodes}
onLoadData={onLoadData}
expandNode={expandNode}
selectedAnnotation={selectedAnnotation}
onAnnotationEdited={onAnnotationEdited}
currentPage={currentPage}
onDataAttributesChange={onDataAttributesChange}
elementIndex={index}
selectedKey={value}
defaultExpandAll={!isEmpty(searchText)}
/>
</div>
<Blocker isEnabled={isLoading} />
</Fragment>
);
}
return (
<div key={`${name}${type}`}>
<Text>{name}</Text>
<TextArea
rows={6}
value={value}
onValueChange={(val) => {
onDataAttributesChange(index, val);
}}
isDisabled={viewMode}
/>
</div>
);
})}
</div>
);
};