PageNumberList.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import { Badge, Card, Select, Space, Tree } from "antd";
  2. import { useEffect, useState } from "react";
  3. import { get } from "../../request";
  4. import { DataNode } from "antd/es/tree";
  5. import { useIntl } from "react-intl";
  6. import { Key } from "antd/es/table/interface";
  7. import { bookName } from "./book_name";
  8. export interface IPageNumber {
  9. type: string;
  10. volume: number;
  11. page: number;
  12. book: number;
  13. paragraph: number;
  14. pcd_book_id: number;
  15. }
  16. export interface IPageNumberListResponse {
  17. ok: boolean;
  18. message: string;
  19. data: IPageNumber[];
  20. }
  21. interface IType {
  22. key: string;
  23. value: number;
  24. }
  25. interface IWidget {
  26. keyWord?: string;
  27. onSelect?: Function;
  28. }
  29. const CaseListWidget = ({ keyWord, onSelect }: IWidget) => {
  30. const intl = useIntl();
  31. const [pageData, setPageData] = useState<IPageNumber[]>();
  32. const [types, setTypes] = useState<IType[]>();
  33. const [treeData, setTreeData] = useState<DataNode[]>();
  34. useEffect(() => {
  35. if (typeof keyWord === "undefined") {
  36. return;
  37. }
  38. get<IPageNumberListResponse>(`/v2/search-page-number/${keyWord}`).then(
  39. (json) => {
  40. console.log("case", json);
  41. if (json.ok) {
  42. setPageData(json.data);
  43. const typeCount = new Map<string, number>();
  44. json.data.forEach((value) => {
  45. const old = typeCount.get(value.type);
  46. if (typeof old === "undefined") {
  47. typeCount.set(value.type, 1);
  48. } else {
  49. typeCount.set(value.type, old + 1);
  50. }
  51. });
  52. let mType: IType[] = [];
  53. typeCount.forEach((value, key) => {
  54. mType.push({ key: key, value: value });
  55. });
  56. setTypes(mType);
  57. let bookNameMap = new Map<string, number[]>();
  58. bookName.forEach((value) => {
  59. const name = value.abbr ? value.abbr : value.name;
  60. if (bookNameMap.has(name)) {
  61. const id = bookNameMap.get(name);
  62. if (id) {
  63. id.push(value.id);
  64. bookNameMap.set(name, id);
  65. } else {
  66. bookNameMap.set(name, [value.id]);
  67. }
  68. } else {
  69. bookNameMap.set(name, [value.id]);
  70. }
  71. });
  72. let bookNameList: string[] = [];
  73. bookNameMap.forEach((value, key) => {
  74. bookNameList.push(key);
  75. });
  76. const tData = mType.map((item, id1) => {
  77. let volumes: number[] = [];
  78. json.data
  79. .filter((value) => value.type === item.key)
  80. .forEach((value) => {
  81. if (!volumes.includes(value.volume)) {
  82. volumes.push(value.volume);
  83. }
  84. });
  85. const keys = volumes
  86. .map((item1) => {
  87. if (item.key === "para") {
  88. return `${item.key}${keyWord}`;
  89. } else {
  90. return `${item.key}${item1}.` + pageNumberToStr(keyWord);
  91. }
  92. })
  93. .join();
  94. return {
  95. title: (
  96. <Space>
  97. {intl.formatMessage({
  98. id: `labels.page.number.type.${item.key}`,
  99. })}
  100. <Badge
  101. size="small"
  102. status="default"
  103. color={"lime"}
  104. count={item.value}
  105. overflowCount={999}
  106. />
  107. </Space>
  108. ),
  109. key: `${id1}-${keys}-0`,
  110. children: bookNameList
  111. .map((bookItem, id2) => {
  112. const bookId = bookNameMap.get(bookItem);
  113. const bookChildren = json.data.filter(
  114. (value) =>
  115. value.type === item.key &&
  116. bookId?.includes(value.pcd_book_id)
  117. );
  118. let pcdBookId: number[] = [];
  119. bookChildren.forEach((value) => {
  120. if (!pcdBookId.includes(value.pcd_book_id)) {
  121. pcdBookId.push(value.pcd_book_id);
  122. }
  123. });
  124. return {
  125. title: bookItem + `[${bookChildren.length}]`,
  126. key: `${id1}_${id2}-${keys}-${pcdBookId.join()}`,
  127. children: bookChildren.map((item1, id3) => {
  128. return {
  129. title: `${item1.type}-${item1.volume}-${item1.page}-${item1.book}-${item1.paragraph}`,
  130. key: `${id1}-${id2}-${id3}-${item1.type}-${item1.volume}-${item1.page}-${item1.book}-${item1.paragraph}`,
  131. disabled: true,
  132. };
  133. }),
  134. };
  135. })
  136. .filter((value) => !value.title.includes("[0]"))
  137. .sort((a, b) => {
  138. const nameA = a.title?.toLowerCase(); // ignore upper and lowercase
  139. const nameB = b.title?.toLowerCase(); // ignore upper and lowercase
  140. if (!nameA || !nameB) {
  141. return 0;
  142. }
  143. if (nameA < nameB) {
  144. return -1;
  145. }
  146. if (nameA > nameB) {
  147. return 1;
  148. }
  149. // names must be equal
  150. return 0;
  151. }),
  152. };
  153. });
  154. setTreeData(tData);
  155. }
  156. }
  157. );
  158. }, [intl, keyWord]);
  159. const pageNumberToStr = (page: number | string): string => {
  160. const strPage = page.toString();
  161. const zero = 4 - strPage.length;
  162. return Array(zero).fill("0").join("") + strPage;
  163. };
  164. return (
  165. <div style={{ padding: 4 }}>
  166. <Card
  167. size="small"
  168. title={
  169. <Select
  170. value={"all"}
  171. bordered={false}
  172. onChange={(value: string) => {}}
  173. options={types?.map((item, id) => {
  174. return {
  175. label: (
  176. <Space>
  177. {item.key}
  178. <Badge
  179. count={item.value}
  180. color={"lime"}
  181. status="default"
  182. size="small"
  183. />
  184. </Space>
  185. ),
  186. value: item.key,
  187. };
  188. })}
  189. />
  190. }
  191. >
  192. <Tree
  193. onSelect={(selectedKeys: Key[]) => {
  194. if (typeof onSelect !== "undefined") {
  195. onSelect(selectedKeys);
  196. }
  197. }}
  198. treeData={treeData}
  199. />
  200. </Card>
  201. </div>
  202. );
  203. };
  204. export default CaseListWidget;