Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | 66x | import React, { ReactElement, useCallback, useEffect, useState } from 'react';
import { DataApiResultProps, RecordProps, TableMetaProps } from "@props/RecordProps";
import CommentForm from "./CommentForm";
import { fetchDomainMeta, fetchListOfRelateDomainData, fetchSearchResult } from "@utils/FetchUtils";
import CommentsList from "./CommentsList";
import { DomainComment } from './CommentProps';
import { openErrorNotification } from '@utils/NotificationUtils';
import { LargeSpin } from '../../components';
import { PredefinedFilters } from '../../form';
import { getSearchConditionsForDomain } from '@kernel/ServerSideSearcher';
import { CommentDomainName, CommentsColumnNameInOwnerClass } from '.';
export interface CommentPanelProps {
zIndex: number;
domainName: string;
record: RecordProps;
column: TableMetaProps;
fetchDataCallback?: () => void;
objectTypeId: number;
}
const CommentsPanel = (props: CommentPanelProps): ReactElement => {
const {
zIndex, record, domainName, column, objectTypeId
} = props;
const [comments, setComments] = useState<DomainComment[]>([]);
const [loading, setLoading] = useState<boolean>();
const [columns, setColumns] = useState<TableMetaProps[]>([]);
const highlightCommentId = ("answerComment" in record) ? record.answerComment?.id : undefined;
const refreshData = useCallback((): void => {
setLoading(true);
const searchConditions = getSearchConditionsForDomain(CommentDomainName);
const noSearchConditions = (searchConditions == null) || (Object.keys(searchConditions).length === 0);
const result: Promise<DataApiResultProps> = noSearchConditions ? fetchListOfRelateDomainData({
domainName,
ownerId: record.id,
columnName: column.key,
current: 1,
max: 9999,
useCache: false
}) : fetchSearchResult({
domainName: CommentDomainName,
searchConditions,
current: 1,
max: 9999,
ownerIds: [record.id],
ownerClass: domainName,
columnNameInOwnerClass: CommentsColumnNameInOwnerClass,
});
result.then((result: DataApiResultProps) => {
setComments(result.data as DomainComment[]);
}).finally(() => {
setLoading(false);
}).catch((error) => {
console.error("Failed to load comments for record: " + record.id, error);
openErrorNotification("Failed to load comments for record: " + record.id);
});
}, [column.key, domainName, record.id]);
const updateComment = useCallback((comment: DomainComment): void => {
const newComments = comments.map((item: DomainComment) => {
if (item.id === comment.id) {
return comment;
}
return item;
});
setComments(newComments);
}, [comments]);
useEffect(() => {
refreshData();
}, [domainName, record.id, column.key, refreshData]);
useEffect(() => {
fetchDomainMeta(CommentDomainName, -1).then((result) => {
setColumns(result);
}).catch((error) => {
console.error("Failed to load domain meta for domain: " + domainName, error);
openErrorNotification("Failed to load domain meta for domain: " + domainName);
});
}, [domainName]);
return (
<>
<CommentForm
column={column}
zIndex={zIndex}
mainDomainName={domainName}
owner={record}
fetchDataCallback={refreshData}
objectTypeId={objectTypeId}
/>
<span className="simple-list-filters">
<PredefinedFilters
domainName={"DomainComment"}
fetchDataCallback={refreshData}
displayStyle='inline'
columns={columns}
zIndex={zIndex}
/>
</span>
<div style={{ clear: "both" }} />
{!loading && <CommentsList
comments={comments}
updateCallback={updateComment}
fetchDataCallback={refreshData}
owner={record}
column={column}
mainDomainName={domainName}
zIndex={zIndex}
objectTypeId={objectTypeId}
highlightCommentId={highlightCommentId}
/>}
{loading && <LargeSpin />}
</>
);
};
export default CommentsPanel;
|