AiModelList.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { Link } from "react-router";
  2. import { useIntl } from "react-intl";
  3. import { Button, Popover, Tag, Space } from "antd";
  4. import { type ActionType, ProList } from "@ant-design/pro-components";
  5. import { PlusOutlined } from "@ant-design/icons";
  6. import { get } from "../../request";
  7. import { useRef, useState } from "react";
  8. import { getSorterUrl } from "../../utils";
  9. import type { IAiModel, IAiModelListResponse } from "../../api/ai";
  10. import AiModelCreate from "./AiModelCreate";
  11. import PublicityIcon from "../studio/PublicityIcon";
  12. import ShareModal from "../share/ShareModal";
  13. import { EResType } from "../share/Share";
  14. import User from "../auth/User";
  15. interface IWidget {
  16. studioName?: string;
  17. }
  18. const AiModelList = ({ studioName }: IWidget) => {
  19. const intl = useIntl(); //i18n
  20. const [openCreate, setOpenCreate] = useState(false);
  21. const ref = useRef<ActionType | null>(null);
  22. return (
  23. <>
  24. <ProList<IAiModel>
  25. actionRef={ref}
  26. onRow={(_record) => ({
  27. onClick: () => {},
  28. })}
  29. metas={{
  30. title: {
  31. dataIndex: "name",
  32. render(_dom, entity, _index, _action, _schema) {
  33. return (
  34. <Space>
  35. <PublicityIcon value={entity.privacy} />
  36. <Link
  37. to={`/studio/${studioName}/ai/models/${entity.uid}/edit`}
  38. >
  39. {entity.name}
  40. </Link>
  41. </Space>
  42. );
  43. },
  44. },
  45. description: {
  46. dataIndex: "url",
  47. },
  48. subTitle: {
  49. render(_dom, entity, _index, _action, _schema) {
  50. return <Tag>{entity.model}</Tag>;
  51. },
  52. },
  53. content: {
  54. render(_dom, entity, _index, _action, _schema) {
  55. return entity.description;
  56. },
  57. },
  58. avatar: {
  59. render(_dom, entity, _index, _action, _schema) {
  60. return <User {...entity.user} showName={false} />;
  61. },
  62. },
  63. actions: {
  64. render(_dom, entity, _index, _action, _schema) {
  65. return (
  66. <Space>
  67. <Link
  68. to={`/studio/${studioName}/ai/models/${entity.uid}/logs`}
  69. >
  70. logs
  71. </Link>
  72. <ShareModal
  73. trigger={
  74. <Button type="link" size="small">
  75. {intl.formatMessage({
  76. id: "buttons.share",
  77. })}
  78. </Button>
  79. }
  80. resId={entity.uid}
  81. resType={EResType.modal}
  82. />
  83. </Space>
  84. );
  85. },
  86. },
  87. }}
  88. request={async (params = {}, sorter, filter) => {
  89. console.log(params, sorter, filter);
  90. let url = `/v2/ai-model?view=studio&name=${studioName}`;
  91. const offset = ((params.current ?? 1) - 1) * (params.pageSize ?? 20);
  92. url += `&limit=${params.pageSize}&offset=${offset}`;
  93. url += params.keyword ? "&search=" + params.keyword : "";
  94. url += getSorterUrl(sorter);
  95. console.info("api request", url);
  96. const res = await get<IAiModelListResponse>(url);
  97. console.info("api response", res);
  98. return {
  99. total: res.data.total,
  100. succcess: res.ok,
  101. data: res.data.rows,
  102. };
  103. }}
  104. rowKey="id"
  105. bordered
  106. pagination={{
  107. showQuickJumper: true,
  108. showSizeChanger: true,
  109. }}
  110. search={false}
  111. options={{
  112. search: true,
  113. }}
  114. toolBarRender={() => [
  115. <Popover
  116. content={
  117. <AiModelCreate
  118. studioName={studioName}
  119. onCreate={() => {
  120. setOpenCreate(false);
  121. ref.current?.reload();
  122. }}
  123. />
  124. }
  125. placement="bottomRight"
  126. trigger="click"
  127. open={openCreate}
  128. onOpenChange={(open: boolean) => {
  129. setOpenCreate(open);
  130. }}
  131. >
  132. <Button key="button" icon={<PlusOutlined />} type="primary">
  133. {intl.formatMessage({ id: "buttons.create" })}
  134. </Button>
  135. </Popover>,
  136. ]}
  137. />
  138. </>
  139. );
  140. };
  141. export default AiModelList;