index.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import useNewToken from "@/Hook/useNewToken"
  2. import { App, Button, Card, Col, Input, Row, Select, Tabs } from "antd"
  3. import { useEffect, useState } from "react"
  4. import SearchBox from "../../components/searchBox"
  5. import style from './index.less'
  6. import SelectTag from "./selectTag"
  7. import Right from "./right"
  8. import Left from "./left"
  9. import AddEditSc from "./addEditSc"
  10. import { inject, observer } from "mobx-react"
  11. import { toJS } from "mobx"
  12. import { delMsgTemplateApi, getTemplateListApi, GetTemplateListProps, MEDIATYPE } from "../../API/weMaterial/weMaterial"
  13. import { ExclamationCircleFilled } from '@ant-design/icons';
  14. import { useAjax } from "@/Hook/useAjax"
  15. import { PlusOutlined } from '@ant-design/icons';
  16. import { randomString } from "@/utils/utils"
  17. /**
  18. * 素材管理
  19. * @returns
  20. */
  21. function WeMaterial(props: { store: any }) {
  22. const globaStoreData = toJS(props.store.data)
  23. /***********************/
  24. const { token } = useNewToken()
  25. const { message, modal } = App.useApp();
  26. const [queryForm, setQueryForm] = useState<GetTemplateListProps>({ pageNum: 1, pageSize: 20, isPersonal: '1' })
  27. const [data, setData] = useState<any[]>([])
  28. const [selectData, setSelectData] = useState<any>({})
  29. const [scShow, setScShow] = useState<boolean>(false) // 素材新增修改控制
  30. const [copyData, setCopyData] = useState<any>()
  31. const getTemplateList = useAjax((params) => getTemplateListApi(params))
  32. const delMsgTemplate = useAjax((params) => delMsgTemplateApi(params))
  33. /***********************/
  34. useEffect(() => {
  35. getList()
  36. }, [queryForm])
  37. const getList = () => {
  38. getTemplateList.run(queryForm).then(res => {
  39. if (res) {
  40. if (queryForm.pageNum === 1) {
  41. setData(res?.data?.records)
  42. if (!(selectData && res?.data?.records?.find((item: any) => item.id == selectData.id))) {
  43. setSelectData(res?.data?.records[0])
  44. }
  45. } else {
  46. setData(data.concat(res?.data?.records))
  47. }
  48. }
  49. })
  50. }
  51. // 下一页
  52. const loadMoreData = () => {
  53. setQueryForm({ ...queryForm, pageNum: queryForm.pageNum + 1 })
  54. }
  55. // 删除
  56. const del = (id: number, name: string) => {
  57. modal.confirm({
  58. title: '确定删除?',
  59. icon: <ExclamationCircleFilled />,
  60. content: `是否确定删除 [${name}] 素材模板`,
  61. okType: 'danger',
  62. onOk() {
  63. delMsgTemplate.run(id).then(res => {
  64. message.success('删除成功')
  65. let newData = data?.filter(item => item.id !== id)
  66. if (selectData.id === id) {
  67. setSelectData(newData[0])
  68. }
  69. setData(newData)
  70. })
  71. }
  72. });
  73. }
  74. return <Card
  75. title={<Tabs
  76. activeKey={queryForm.isPersonal}
  77. items={[{
  78. key: '1',
  79. label: `个人素材库`,
  80. }, {
  81. key: '0',
  82. label: `公共素材库`,
  83. }]}
  84. onChange={(e) => { setQueryForm({ ...queryForm, isPersonal: e as any, pageNum: 1, pageSize: 20 }) }}
  85. />}
  86. styles={{ body: { padding: 0 } }}
  87. >
  88. <Row className={style.weMaterial}>
  89. <Col flex='auto' className={style.weMaterial_left} >
  90. <SearchBox buttons={<>
  91. <Button icon={<PlusOutlined />} type='primary' onClick={() => setScShow(true)}>新建素材</Button>
  92. {scShow && <AddEditSc
  93. value={copyData}
  94. visible={scShow}
  95. isPersonal={queryForm.isPersonal}
  96. onClose={() => {
  97. setScShow(false)
  98. setCopyData(undefined)
  99. }}
  100. onChange={() => {
  101. if (queryForm.pageNum === 1) {
  102. getList()
  103. } else {
  104. setQueryForm({ ...queryForm, pageNum: 1, pageSize: 20 });
  105. }
  106. setScShow(false)
  107. setCopyData(undefined)
  108. }} />}
  109. </>}>
  110. <>
  111. <Input.Search placeholder="请输入关键字" allowClear onSearch={(e) => { setQueryForm({ ...queryForm, mediaTitle: e, pageNum: 1, pageSize: 20 }); }} />
  112. <Select placeholder='请选择类型' allowClear style={{ width: 80 }} value={queryForm?.mediaType} onChange={(e) => { setQueryForm({ ...queryForm, mediaType: e, pageNum: 1, pageSize: 20 }); }}>
  113. {Object.keys(MEDIATYPE).map(key => <Select.Option value={key} key={key}>{MEDIATYPE[key as keyof typeof MEDIATYPE]}</Select.Option>)}
  114. </Select>
  115. <SelectTag value={queryForm?.mediaTagId} onChange={(id) => { setQueryForm({ ...queryForm, mediaTagId: id, pageNum: 1, pageSize: 20 }); }} />
  116. </>
  117. </SearchBox>
  118. <Left
  119. del={del}
  120. copy={(data: any) => {
  121. setCopyData({
  122. mediaTitle: data?.mediaTitle + '副本' + randomString(true, 2, 5),
  123. mediaTagIds: data?.mediaTagIds ? data?.mediaTagIds?.map((id: string, index: number) => ({ tagId: id, tagName: data.mediaTagNames[index] })) : [],
  124. mediaContentDTOList: data.corpMediaContentVOList
  125. })
  126. setScShow(true)
  127. }}
  128. selectData={selectData}
  129. setSelectData={setSelectData}
  130. token={token}
  131. data={data}
  132. onChange={(value) => setSelectData(value)}
  133. loading={getTemplateList.loading}
  134. loadMore={loadMoreData}
  135. setQueryForm={setQueryForm}
  136. total={data?.length || 0} />
  137. </Col>
  138. {!globaStoreData?.isMobile && <Right
  139. del={del}
  140. dataList={data}
  141. onChange={() => {
  142. if (queryForm.pageNum === 1) {
  143. getList()
  144. } else {
  145. setQueryForm({ ...queryForm, pageNum: 1, pageSize: 20 });
  146. }
  147. }}
  148. token={token}
  149. value={selectData}
  150. />}
  151. </Row>
  152. </Card>
  153. }
  154. export default inject('store')(observer((props: any) => WeMaterial({ store: props.store.globaStore })))